我正在为 C99 代码(包括 GCC 扩展)寻找一个免费的静态检查器,它能够明确地说“这些预处理器宏总是被定义的”。
我需要最后一部分,因为我正在为单个目标处理器编译嵌入式代码。编译器(Microchip 的 C32,基于 GCC)根据所选处理器设置宏,然后在 PIC32 头文件中使用该宏来选择要包含的处理器特定头文件。因此, cppcheck失败,因为它检测到#ifdef
用于选择许多可能的 PIC32 处理器之一的 30 个不同的 s,尝试分析这些以及所有其他#define
s 的所有可能组合,但失败了。
例如,如果夹板可以处理 C99 代码,我会使用
splint -D__PIC32_FEATURE_SET__=460 -D__32MX460F512L__ \
-D__LANGUAGE_C__ -I/path/to/my/includes source.c
另一个问题是调用了 PIC32 工具链编译器pic32-gcc
而不仅仅是gcc
,尽管我还没有达到需要考虑这一点的地步。
更新 #1 - 我感兴趣但与这个问题正交的一件事是 Eclipse 集成(不必为 30 多个编译单元编写生成文件会很好)。我在Eclipse 论坛上问过这个问题(尽管那里的讨论更多关于集成到 Eclipse 中)。没有什么开创性的。
更新 #2scan-build
- 刚刚从clang尝试过,使用:
scan-build --use-cc=/usr/local/bin/pic32-gcc make -B -k all
...(也没有--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
...最后:
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.
所以要么我的代码是完美的scan-build
,要么它什么也没做。我不确定一个好的测试可能是什么,看看它是否有效。