2010-04-27 2 views
17

Je recherche un vérificateur statique gratuit pour le code C99 (incluant les extensions GCC) avec la possibilité de dire explicitement "ces macros du préprocesseur sont toujours définies".Vérificateur statique gratuit pour le code C99

J'ai besoin de cette dernière partie car je compile du code embarqué pour un seul processeur cible. Le compilateur (C32 de Microchip, basé sur GCC) définit une macro basée sur le processeur sélectionné, qui est ensuite utilisé dans les fichiers d'en-tête PIC32 pour sélectionner un fichier d'en-tête spécifique au processeur à inclure. cppcheck échoue donc parce qu'il détecte les 30 différents #ifdef s utilisés pour sélectionner l'un des nombreux processeurs PIC32 possibles, tente d'analyser toutes les combinaisons possibles de ceux-ci plus tous les autres #define, et échoue.

Par exemple, si splint pourrait traiter le code C99, j'utiliser

splint -D__PIC32_FEATURE_SET__=460 -D__32MX460F512L__ \ 
-D__LANGUAGE_C__ -I/path/to/my/includes source.c 

Un autre problème est que le compilateur toolchain PIC32 est appelé pic32-gcc et non pas seulement gcc, bien que je ne l'ai pas encore arrivé au point de devoir en tenir compte.

Mise à jour # 1 - Une chose qui m'intéresse, mais qui est orthogonale à cette question, est l'intégration Eclipse (ce serait bien de ne pas avoir à écrire un makefile pour plus de 30 unités de compilation). J'ai demandé à ce sujet sur le Eclipse forums (bien que la discussion il y a plus sur l'intégration dans Eclipse). Rien d'innovant.

Mise à jour # 2 - juste essayé scan-build de clang, en utilisant:

scan-build --use-cc=/usr/local/bin/pic32-gcc make -B -k all 

... (aussi sans le drapeau --use-cc), mais tout ce que je suis arrivé a été la sortie de construction typique, dont un exemple est :

Building file: ../src/MoreMath.c 
Invoking: PIC C32 C Compiler 
pic32-gcc -D__DEBUG -I/usr/local/pic32-libs/include -O0 -Wall -c -fmessage-length=0 -std=gnu99 -Werror-implicit-function-declaration -MMD -MP -MF"src/MoreMath.d" -MT"src/MoreMath.d" -mprocessor=32MX460F512L -D__DEBUG -g -o"src/MoreMath.o" "../src/MoreMath.c" 
Finished building: ../src/MoreMath.c 

... et à la fin:

Building target: MyBinary.elf 
Invoking: PIC C32 C Linker 
pic32-gcc -Wl,-Map,MyBinary.map -mprocessor=32MX460F512L --defsym=__MPLAB_DEBUG=1 -o"MyBinary.elf" <<ALL OF MY *.o FILES HERE>> 
Finished building target: MyBinary.elf 

scan-build: Removing directory '/tmp/scan-build-2010-06-21-1' because it contains no reports. 

Donc soit mon code est parfait selon scan-build, soit il ne fait rien. Je ne suis pas sûr de ce que pourrait être un bon test pour voir si cela fonctionne.

+0

vous devez ajouter votre disposition à utiliser dans Eclipse à votre question, si c'est en effet une exigence de votre solution. –

+0

Non, ce serait un bonus supplémentaire. Je vais éditer la question pour la rendre plus claire. Je suis toujours en train de travailler sur la construction de scan-build pour utiliser la chaîne d'outils PIC32, et si je le fais, j'accepterai la réponse ci-dessous. – detly

+0

Davis @Adam - J'allais modifier la question pour mieux mettre l'accent sur mon utilisation du toolchain PIC32, mais je ne sais pas si cela va interférer avec votre motivation pour mettre en place une prime. Faites-moi savoir si vous voulez que j'attende. – detly

Répondre

5

Clang's static analyzer devrait fonctionner.

Une autre option avec le code source #defines est que vous pouvez exécuter cpp sur le code source avec certaines des instructions du préprocesseur, puis exécuter ce code résultant à travers un analyseur statique.

+0

Je pense que "scan-build" est à peu près aussi bon que je peux. Je suis en train de développer sous Eclipse et d'utiliser le constructeur interne (ie pas de makefile explicite), et je ne pense pas qu'il y ait d'intégration clangée pour le CDT d'Eclipse. Il pourrait être intéressant de passer à un projet basé sur makefile. – detly

+0

Hélas, je ne vois pas comment faire pour que 'scan-build' (ou tout autre outil Clang) fonctionne avec Eclipse. – detly

+2

@detly: Pourquoi sur terre est un programmeur C compétent tel que vous lié à une abomination impie comme Eclipse? –

3

Vous pouvez tout simplement ajouter un code comme celui-ci au-dessus de votre tête qui garantit qu'il est défini:

#ifndef MACRO_I_NEED 
#error "MACRO_I_NEED should be defined" 
#define MACRO_I_NEED // to appease cppcheck 
#endif 
+1

N'aurais-je pas besoin de faire cela pour chaque fichier source si? – detly

+1

@detly: Pas nécessairement - si vous avez un fichier d'en-tête que chaque fichier contient (comme un en-tête précompilé), alors vous pouvez le mettre en haut de celui-ci. –

1

Cela pourrait ne pas directement vous donner la solution, mais vous pourriez envisager d'avoir un regard à Coverity, qui est un analyseur de syntaxe statique propriétaire, mais qui est gratuit pour les projets OS. Il devrait faire le travail concernant vos besoins!

À la votre!

+0

Ce n'est pas un projet OSS. – detly

1

Vous pouvez utiliser un outil tel que sunifdef pour prétraiter partiellement le code source en fonction des macros définies supposées.Vous devrez faire des copies des en-têtes de système et de bibliothèque qui sont affectés par ceux qui les définissent et les traiter également. Ensuite, lorsque vous effectuez l'analyse statique, vous devez spécifier un chemin d'inclusion différent pointant vers vos en-têtes déjà traités.

+0

Coan (http://coan2.sourceforge.net/) semble être la dernière fourchette/extension du jeu d'outils unifdef –

2

Au lieu d'utiliser scan-construire avec clang, pensez à échanger sur gcc tout à fait! Le support C de Clang est stable (et fait de son mieux pour émuler gcc), et devrait bien gérer votre code.

Essayez quelque chose comme make -j3 CC=clang et voir ce qui se passe!

PS. Cette syntaxe pourrait être totalement fausse. Je n'ai pas utilisé makefiles depuis des lustres (CMake est incroyable btw).

+2

cmake est horrible! –

+0

Il ne supporte pas l'option '-MT', ce qui signifie que je dois réécrire beaucoup de fichiers makefiles. Actuellement, la construction utilise des fichiers d'autodépendance - fichiers '.d' - qui contiennent les dépendances d'en-tête pour chaque fichier' .o'. Ça va prendre du temps avant que je puisse tester ça. – detly

+0

@detly, générer les fichiers de dépendance et couper leur manipulation (surtout les templates, je suppose) dans votre Makefile)? – vonbrand

2

En fonction de vos analyses réelles que vous voulez exécuter sur votre code, vous pouvez jeter un oeil à Frama-C. Il utilise n'importe quel préprocesseur C auquel vous le dites, vous pouvez donc utiliser le CPP de PIC32 si vous le souhaitez.

Questions connexes