Quels sont les bons outils pour démarrer rapidement l'analyse et l'analyse du code C/C++?
En particulier, je recherche des outils open source qui gèrent le préprocesseur et le langage C/C++. De préférence, ces outils utiliseraient Lex/yacc (ou flex/bison) pour la grammaire, et ne seraient pas trop compliqués. Ils doivent gérer les dernières définitions ANSI C/C++.
Voici ce que j'ai trouvé jusqu'à présent, mais je ne les ai pas examinés en détail (réflexions?):
J'espère l'utiliser comme point de départ pour traduire la source C/C++ dans un nouveau langage jouet.
Merci! -Mat
(Ajout du 2/9): Juste une clarification: je veux extraire des informations sémantiques du préprocesseur en plus du code C/C++ lui-même. Je ne veux pas que "#define foo 42" disparaisse dans l'entier "42", mais reste attaché au nom "foo". Cela, malheureusement, exclut plusieurs solutions qui exécutent le préprocesseur en premier et ne fournissent que l'arborescence d'analyse C/C++)
L'analyse de C++ est extrêmement difficile car la grammaire est indécidable. Pour citer Yossi Kreinin :
Grammaire extrêmement compliquée
"Exceptionnellement" doit être interprété littéralement, car toutes les langues populaires ont sans contexte (ou "presque" sans contexte) grammaires, tandis que C++ a indécidable grammaire. Si vous aimez les compilateurs et les analyseurs, vous savez probablement ce que cela signifie. Si vous n'êtes pas dans ce genre de chose, il y a un exemple simple montrant le problème avec l'analyse C++:
AA BB(CC);
est-il une définition d'objet ou une déclaration de fonction? Il s'avère que la réponse dépend fortement du code avant l'énoncé - le "contexte". Cela montre (à un niveau intuitif) que la grammaire C++ est assez contextuelle.
Le générateur d'analyseur ANTLR possède un grammaire pour C/C++ ainsi que le préprocesseur. Je ne l'ai jamais utilisé donc je ne peux pas dire à quel point son analyse de C++ sera complète. ANTLR lui-même a été un outil utile pour moi à quelques reprises pour l'analyse de langages beaucoup plus simples.
Selon votre problème GCCXML pourrait être votre réponse. Fondamentalement, il analyse la source à l'aide de GCC et vous donne ensuite un XML d'arbre d'analyse facilement digestible. Avec GCCXML, vous avez terminé une fois pour toutes.
pycparser est un analyseur complet pour C (C99) écrit en Python. Il a un backend AST backend entièrement configurable, donc il est utilisé comme base pour tout type de traitement de langue dont vous pourriez avoir besoin.
Cependant, ne prend pas en charge C++. Certes, c'est beaucoup plus difficile que C.
Mise à jour (2012) : à l'heure actuelle, la réponse, sans aucun doute, serait Clang - il est modulaire, prend en charge l'intégralité C++ (avec de nombreuses fonctionnalités C++ - 11) et possède une base de code relativement conviviale. Il dispose également d'une API C pour les liaisons vers des langages de haut niveau (c'est-à-dire pour Python ).
Jetez un œil au fonctionnement de doxygen , le code source complet est disponible et basé sur flex.
Un candidat trompeur est GOLD qui est une boîte à outils d'analyse syntaxique gratuite basée sur Windows explicitement pour créer des traducteurs. Leur liste de langues prises en charge fait référence aux langues dans lesquelles on peut implémenter des analyseurs, pas la liste des grammaires d'analyse prises en charge.
Ils n'ont que des grammaires pour C et C #, pas de C++.
L'analyse de C++ est un défi très complexe .
Il y a le framework Boost/Spirit, et il y a quelques années, ils l'ont fait jouer avec l'idée d'implémenter un analyseur C++ , mais c'est loin d'être complet .
L'analyse complète et correcte d'ISO C++ est loin d'être triviale, et il y a eu en fait de nombreux efforts connexes. Mais c'est un travail intrinsèquement complexe qui n'est pas facile à réaliser, sans réécrire un frontal complet du compilateur comprenant tout le C++ et le préprocesseur. Une implémentation de pré-processeur appelée "vague" est disponible auprès des gens de Spirit.
Cela dit, vous voudrez peut-être jeter un œil à pork/oink (basé sur elsa), qui est une boîte à outils d'analyseur C++ spécifiquement destinée à être utilisée à des fins de transformation de code source, elle est utilisée par le Projet Mozilla pour faire une analyse de code source statique à grande échelle et une réécriture de code automatisée, la partie la plus intéressante est qu'il prend en charge non seulement la plupart du C++, mais aussi le préprocesseur lui-même!
D'un autre côté, il existe en effet une seule solution propriétaire disponible: le frontend EDG, qui peut être utilisé pour à peu près tous les efforts liés au C++.
Personnellement, je vérifierais la suite porc/oink basée sur elsa qui est utilisée chez Mozilla, à part cela, la FSF a maintenant approuvé le travail sur plugins gcc en utilisant la licence de la bibliothèque d'exécution, donc je supposons que les choses vont changer rapidement, une fois que les gens pourront facilement utiliser l'analyseur C++ basé sur gcc à de telles fins en utilisant des plugins binaires.
Donc, en un mot: si vous les dollars: EDG, si vous avez besoin de quelque chose de gratuit/open source maintenant : else/oink sont assez prometteurs, si vous avoir du temps, vous voudrez peut-être utiliser gcc pour votre projet.
Une autre option juste pour le code C est cscout .
La grammaire du C++ est en quelque sorte notoirement poilue. Il y a n bon fil à Lambda à ce sujet, mais l'essentiel est que la grammaire C++ peut nécessiter arbitrairement beaucoup d'anticipation.
Pour le genre de choses que j'imagine que vous pourriez faire, je pense à pirater Gnu CC ou Splint . Gnu CC en particulier sépare assez complètement la partie de la génération du langage, il est donc préférable de construire un nouveau backend g ++.
En fait, PUMA et AspectC++ sont toujours activement maintenus et mis à jour. Je cherchais à utiliser AspectC++ et je me posais des questions sur le manque de mises à jour moi-même. J'ai envoyé un courriel à l'auteur qui a dit qu'AspectC++ et PUMA étaient toujours en cours de développement. Vous pouvez accéder au code source via SVN https://svn.aspectc.org/repos/ ou vous pouvez obtenir des versions binaires régulières sur http://akut.aspectc.org =. Comme avec beaucoup d'excellents projets c ++ de nos jours, l'auteur n'a pas le temps de suivre la maintenance des pages Web. Cela a du sens si vous avez un emploi à temps plein et une vie.
Elsa bat tout ce que je sais de mieux pour l'analyse C++, même s'il n'est pas conforme à 100%. Je suis fan. Il y a un module qui imprime C++, donc cela peut être un bon point de départ pour votre projet de jouet.
Voir notre C++ Front End pour un analyseur C++ complet: construit des AST, des tables de symboles, nomme et résout le type. Vous pouvez même analyser et conserver les directives du préprocesseur. L'interface C++ est construite au-dessus de notre DMS Software Reengineering Toolkit , qui vous permet d'utiliser ces informations pour effectuer des changements de code source arbitraires à l'aide de transformations de source à source.
DMS est le moteur idéal pour implémenter un tel traducteur.
Cela dit, je ne vois pas grand-chose dans votre tâche imaginée; Je ne vois pas beaucoup de valeur à essayer de remplacer C++, et vous trouverez que la construction d'un traducteur complet représente une énorme quantité de travail, surtout si votre cible est un langage "jouet". Et il est probablement inutile d'analyser C++ à l'aide d'un analyseur robuste, si son seul but est de produire une version isomorphe de C++ qui est plus facile à analyser (attendez, nous avons déjà postulé un C++ robuste!).
EDIT mai 2012: le frontal C++ de DMS gère désormais GCC3/GCC4/C++ 11, Microsoft VisualC 2005/2010. Robuste.
EDIT février 2015: gère désormais C++ 14 dans les dialectes GCC et MS.
EDIT août 2015: analyse et capture désormais à la fois le code et les directives du préprocesseur dans une arborescence unifiée.
Qu'en est-il de l'utilisation d'un outil comme GNU CFlow , qui peut analyser le code et produire des graphiques de call-graphs, voici ce que le opengroup (page de manuel) a à dire sur cflow. La version GNU de cflow est fournie avec la source, et l'open source aussi ...
J'espère que cela vous aide, Cordialement, Tom.
Il y a quelque temps, j'ai essayé d'écrire un outil qui générerait automatiquement des tests unitaires pour les fichiers c.
Pour le prétraitement, je mets les fichiers via GCC. La sortie est moche mais vous pouvez facilement retrouver où dans le code d'origine du fichier prétraité. Mais pour vos besoins, vous pourriez avoir besoin de quelque chose d'autre.
J'ai utilisé Meter comme base pour un analyseur C. Il est open source et utilise Lex et yacc. Cela a facilité la mise en service en peu de temps sans bien comprendre Lex & yacc.
J'ai également écrit une application C car la solution Lex & yacc ne pouvait pas m'aider à tracer la fonctionnalité à travers les fonctions et à analyser la structure de la fonction entière en un seul passage. Il est devenu impossible à entretenir en peu de temps et a été abandonné.