6 votes

gcc pour l'analyse du code

Je voudrais savoir comment utiliser GCC comme bibliothèque pour analyser le code C/C++/Java/Objective C/Ada de mon programme. Je veux contourner le préprocesseur et préfixer toutes les fonctions qui sont écrites par l'utilisateur avec un préfixe My. Comme par exemple Print(); devient MyPrint(); Je souhaite également le faire avec les variables.

4voto

user1034749 Points 1824

Vous pouvez regarder ici :
http://codesynthesis.com/~boris/blog/2010/05/03/parsing-cxx-with-gcc-plugin-part-1/

Ceci est une description de l'utilisation de l'interface plugin de gcc pour analyser le code C++. Les autres langages devraient être traités de la même manière.

Vous pouvez également essayer le porc de Mozilla :
https://wiki.mozilla.org/Pork

Quand je l'ai essayé (porc), j'ai passé une heure ou deux à corriger les problèmes de compilation, mais ensuite je peux écrire des scripts comme ceci :

rewrite SyncPrimitiveUpgrade {
  type PRLock* => Mutex*
  call PR_NewLock() => new Mutex()
  call PR_Lock(lock) => lock->Lock()
  call PR_Unlock(lock) => lock->Unlock()
  call PR_DestroyLock(lock) => delete lock
}

Ainsi, il a trouvé tous les types de PRLock et les a remplacés par des Mutex, il a également recherché l'appel de fonctions comme PR_NewLock et le remplace par "new Mutex".

2voto

sarnold Points 62720

Vous pourriez souhaiter enquêter sur le éparses Analyseur C. Il comprend beaucoup de C (tout le C utilisé dans les sources du noyau Linux, ce qui est un assez bon sous-ensemble des extensions ANSI-C et GNU-C légales) et fournit quelques exemples de compilateurs pour fournir une vue d'ensemble de la situation. lint -Outil d'analyse statique similaire pour la vérification des types.

Bien que le code semble très propre et minutieux, votre tâche pourrait être plus facile à réaliser via un autre mécanisme -- la fonction example.c inclus dans le sparse La source qui démontre un compilateur fait 1955 lignes.

2voto

undur_gongor Points 7431

En C, vous ne pouvez pas le faire de manière fiable. Si vous sautez le prétraitement, vous n'aurez -- en général -- pas de code C valide à analyser. Par exemple

#define FOO
#define BAR
#define BAZ

FOO void BAR qux BAZ(void) { }

Comment l'analyseur syntaxique est-il censé reconnaître cette définition de fonction de qux sans faire le prétraitement ?

2voto

Basile Starynkevitch Points 67055

Premièrement, GCC n'est pas une bibliothèque, et n'est pas structuré pour l'être (contrairement à LLVM).

Pourquoi (i.e. pour quoi faire) voulez-vous analyser le code source C, C++, Ada ?

Je considérerais (en supposant un GCC 4.6 version) extension de GCC soit par le biais de plugins écrits en C, ou de préférence en utilisant MELT MELT, un langage de haut niveau spécifique à un domaine pour étendre GCC (disclaimer : je suis l'auteur principal de MELT).

Mais utiliser GCC comme une bibliothèque n'est pas du tout réaliste.

Je pense vraiment que pour ce que vous voulez réaliser, MELT est le bon outil. Cependant, il est mal documenté. Veuillez utiliser le gcc-melt@googlegroups.com liste pour poser des questions.

Et soyez conscient que l'extension de GCC demande une certaine quantité de travail (plus d'une semaine peut-être), car vous devez comprendre en partie les représentations internes de GCC.

2voto

Necrolis Points 17569

Oubliez GCC, il est conçu comme un analyseur syntaxique de compilateur, pas comme un analyseur syntaxique d'analyse, vous feriez mieux d'utiliser quelque chose comme libclang une interface C pour clang qui peut traiter à la fois le C et le C++

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X