【发布时间】:2011-02-12 16:46:57
【问题描述】:
我正在为 C99 代码(包括 GCC 扩展)寻找一个免费的静态检查器,它能够明确地说“这些预处理器宏总是被定义的”。
我需要最后一部分,因为我正在为单个目标处理器编译嵌入式代码。编译器(Microchip 的 C32,基于 GCC)根据所选处理器设置宏,然后在 PIC32 头文件中使用该宏来选择要包含的处理器特定头文件。因此,cppcheck 失败了,因为它检测到 30 个不同的 #ifdefs 用于选择众多可能的 PIC32 处理器之一,并尝试分析这些以及所有其他 #defines 的所有可能组合,但失败了。
例如,如果splint 可以处理 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 多个编译单元编写 makefile 就好了)。我在Eclipse forums 上询问了这个问题(尽管讨论更多关于集成到 Eclipse 中)。没有什么开创性的。
更新 #2 - 刚刚从 clang 尝试了 scan-build,使用:
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,我的代码要么是完美的,要么它什么也没做。我不确定什么是好的测试,看看它是否有效。
【问题讨论】:
-
如果您的解决方案确实需要,您应该将要在 Eclipse 中使用的规定添加到您的问题中。
-
不,这将是一个额外的好处。我将编辑问题以使其更清楚。我仍在努力让
scan-build使用 PIC32 工具链,如果我这样做了,我会接受下面的答案。 -
@Adam Davis - 我打算调整问题以更好地强调我对 PIC32 工具链的使用,但我不知道这是否会影响您提供赏金的动机。如果你想让我等一下,请告诉我。
-
您好,我不是想问一个跑题的问题,但我很好奇。为什么有人要对微芯片进行编程?你在建什么?谢谢..
-
微芯片是一些电子设备控制系统的一部分。它们几乎是完全自动的,因此它通过板载传感器(以及输入的数量很少)监控条件,并调整各种外围设备以维持某些操作状态。
标签: c gcc embedded static-analysis c99