C (Projet) Proposition permettant des fonctions génériques et des types paramétriques en C; prototype disponible ici.
Psyche-C est un frontage de compilateur pour la langue C. Il est conçu comme une bibliothèque, en mettant l'accent sur la mise en œuvre des outils d'analyse statique des programmes C, sans nécessiter de comprendre leur configuration de build. Les caractéristiques sont les principales caractéristiques de Psyche-C:
struct , union , Union, enum et typedef manquant (en raison des échecs #include ).L'API native de Psyche-C est en C ++, mais les API pour d'autres langues sont prévues.
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 est livré avec le pilote Cnippet et il peut être utilisé comme analyseur ordinaire pour les extraits C. Par exemple, si vous compilez l'extrait ci-dessous avec Cnippet , vous verrez un diagnostic similaire à celui que vous verriez avec GCC ou Clang.
void f ()
{
int ;
} ~ cnip test.c
test.c:4:4 error: declaration does not declare anything
int ;
^
Psyche-C peut éventuellement (jusqu'à présent, disponible dans la branche d'origine) déduire les types manquants d'un extrait C. Par exemple, pour l'extrait ci-dessous, Psyche-C peut déduire une déclaration (compilable) pour T et la synthétiser pendant la compilation.
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 ;Vous voudrez peut-être utiliser cette fonctionnalité pour:
À l'exception de l'inférence du type, qui est écrite dans Haskell, Psyche-C est écrite dans C ++ 17; Cnippet est écrit dans Python 3.
Pour construire:
cmake CMakeLists.txt && make -j 4
Pour exécuter les tests:
./test-suite
De psyché-c lui-même:
Type d'inférence pour C: applications à l'analyse statique des programmes incomplets
Transactions ACM sur les langages et systèmes de programmation - Toplas , volume 42, numéro 3, article n ° 15, décembre 2020.
Inférence de la sémantique statique pour les programmes C incomplets
Actes de l'ACM sur les langages de programmation, volume 2, numéro POPL , janvier 2018, article n ° 29.
Qui utilisent Psyche-C:
Slade: un décompilateur de modèle de petit langage portable pour un assemblage optimisé
Actes du Symposium international IEEE / ACM sur la génération et l'optimisation du code - CGO , 2024.
Anghabench: une suite avec un million de repères C compilables pour la réduction de la taille du code
Actes du Symposium international IEEE / ACM sur la génération et l'optimisation du code - CGO , 2021.
Génération des entrées de liaisons pour les tableaux dans les langues de mémoire de mémoire
Actes du Symposium international IEEE / ACM sur la génération et l'optimisation du code - CGO , février 2019, p. 136-148.
Annotation automatique des tâches dans le code structuré
Actes de la Conférence internationale sur les architectures parallèles et les techniques de compilation - PACT , nov. 2018, article n ° 31.