免费的C99代码静态检查器

det*_*tly 17 c embedded gcc static-analysis c99

我正在寻找一个C99代码(包括GCC扩展)的免费静态检查器,能够明确地说"这些预处理器宏总是被定义".

我需要最后一部分,因为我正在为单个目标处理器编译嵌入式代码.编译器(Microchip的C32,基于GCC)根据所选处理器设置宏,然后在PIC32头文件中使用该宏来选择要包含的特定于处理器的头文件.因此,cppcheck失败是因为它检测到#ifdef用于选择许多可能的PIC32处理器之一的30个不同的s,尝试分析这些加上所有其他#defines的所有可能组合,并且失败.

例如,如果splint可以处理C99代码,我会使用

splint -D__PIC32_FEATURE_SET__=460 -D__32MX460F512L__ \
-D__LANGUAGE_C__ -I/path/to/my/includes source.c
Run Code Online (Sandbox Code Playgroud)

另一个问题是PIC32工具链编译器被调用pic32-gcc而不仅仅是gcc,尽管我还没有达到需要考虑这个问题的程度.

更新#1 - 我感兴趣的一件事,但与这个问题正交,是Eclipse集成(不必为30多个编译单元编写一个makefile很好).我在Eclipse论坛上询问过这个问题(虽然讨论的内容更多是关于Eclipse的集成).没有什么是开创性的.

更新#2 -只是试图scan-build,使用:

scan-build --use-cc=/usr/local/bin/pic32-gcc make -B -k all
Run Code Online (Sandbox Code Playgroud)

...(也没有--use-cc标志)但我得到的只是典型的构建输出,其中一个例子是:

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
Run Code Online (Sandbox Code Playgroud)

......最后:

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.
Run Code Online (Sandbox Code Playgroud)

所以要么我的代码是完美的scan-build,要么根本没有做任何事情.我不确定一个好的测试可能是看它是否有效.

Bil*_*nch 5

Clang的静态分析仪应该可以工作.

源代码的另一个选择#defines是您可以cpp使用一些预处理器语句运行源代码,然后通过静态分析器运行结果代码.

  • @detly:为什么地球上是一个熟练的C程序员,比如你自己必然会受到像Eclipse这样不敬虔的憎恶? (2认同)