C Language (Entwurf) Vorschlag, der generische Funktionen und parametrische Typen in C ermöglicht; Prototyp hier verfügbar.
Psyche-C ist ein Compiler-Frontend für die C-Sprache. Es ist als Bibliothek konzipiert, wobei der Schwerpunkt auf der Implementierung statischer Analyse -Tools von C -Programmen liegt, ohne das Verständnis der Build -Setup zu verstehen. Unten sind die Hauptmerkmale von Psyche-C:
struct , union , enum und typedef (aufgrund von #include -Fehlern).Die native API von Psyche-C befindet sich in C ++, APIs für andere Sprachen sind jedoch geplant.
void analyse ( const SourceText& srcText, const FileInfo& fi)
{
ParseOptions parseOpts;
parseOpts. setAmbiguityMode (AmbiguityMode::DisambiguateAlgorithmically);
auto tree = SyntaxTree::parseText (srcText,
TextPreprocessingState::Preprocessed,
TextCompleteness::Fragment,
parseOpts,
fi. fileName ());
auto compilation = Compilation::create ( " code-analysis " );
compilation-> addSyntaxTree (tree. get ());
AnalysisVisitor analysis (tree. get (), compilation-> semanticModel (tree. get ()));
analysis. run (tree-> translationUnitRoot ());
}SyntaxVisitor::Action AnalysisVisitor::visitFunctionDefinition ( const FunctionDefinitionSyntax* node) override
{
const sym = semaModel-> declaredSymbol (node);
if (sym-> kind () == SymbolKind::Function) {
const FunctionSymbol* funSym = sym-> asFunction ();
// ...
}
return Action::Skip;
}
Psyche-C geliefert mit dem Znippet- Treiber und kann als gewöhnlicher Parser für C-Snippets verwendet werden. Wenn Sie beispielsweise den Snippet unten mit Cnippet kompilieren, sehen Sie eine ähnliche Diagnose wie bei GCC oder Clang.
void f ()
{
int ;
} ~ cnip test.c
test.c:4:4 error: declaration does not declare anything
int ;
^
Psyche-C kann optional (bisher nur im Originalzweig erhältlich) die fehlenden Arten eines C-Snippets schließen. Zum Beispiel kann Psyche-C für das Snippet eine (kompilierbare) Erklärung für T Synthese während der Zusammenstellung schließen.
void f ()
{
T v = 0 ;
v -> value = 42 ;
v -> next = v ;
} typedef struct TYPE_2__ TYPE_1__ ;
struct TYPE_2__
{
int value ;
struct TYPE_2__ * next ;
} ;
typedef TYPE_1__ * T ;Vielleicht möchten Sie diese Funktionalität verwenden, um:
Mit Ausnahme von Typ-Inferenz, die in Haskell geschrieben ist, ist Psyche-C in C ++ 17 geschrieben. CNIPPET ist in Python 3 geschrieben.
Zu bauen:
cmake CMakeLists.txt && make -j 4
Um die Tests durchzuführen:
./test-suite
Von Psyche-C selbst:
Geben Sie die Inferenz für C: Anwendungen für die statische Analyse unvollständiger Programme an
ACM -Transaktionen zu Programmiersprachen und -systemen - Toplas , Band 42, Ausgabe 3, Artikel Nr. 15, Dezember 2020.
Inferenz der statischen Semantik für unvollständige C -Programme
Proceedings of the ACM über Programmiersprachen, Band 2, Popl , Januar 2018, Artikel Nr. 29.
Das benutzt Psyche-C:
Slade: Ein tragbares kleines Sprachmodell -Dekompiler für eine optimierte Montage
Proceedings of the IEEE/ACM International Symposium über Codegenerierung und -Optimierung - CGO , 2024.
Anghabench: Eine Suite mit einer Million kompilierbaren C-Benchmarks für die Reduzierung der Codegröße
Proceedings of the IEEE/ACM International Symposium über die Erzeugung und Optimierung von Code - CGO , 2021.
Erzeugung von Eingängen in den Bounds für Arrays in Speicher-Unsafe-Sprachen
Proceedings of the IEEE/ACM Internationales Symposium zur Erzeugung und Optimierung von Code - CGO , Februar 2019, p. 136-148.
Automatische Annotation von Aufgaben im strukturierten Code
Verfahren der Internationalen Konferenz über parallele Architekturen und Zusammenstellungstechniken - PACT , Nov. 2018, Artikel Nr. 31.