17

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

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

例如,如果夹板可以处理 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,要么它什么也没做。我不确定一个好的测试可能是什么,看看它是否有效。

4

6 回答 6

5

Clang 的静态分析器应该可以工作。

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

于 2010-04-27T03:54:29.443 回答
3

您可以在标题的顶部添加一些这样的代码,以保证它已定义:

#ifndef MACRO_I_NEED
#error "MACRO_I_NEED should be defined"
#define MACRO_I_NEED  // to appease cppcheck
#endif
于 2010-04-27T03:54:44.827 回答
2

与其使用带有 clang 的 scan-build,不如考虑完全换掉 gcc!Clang 的 C 支持是稳定的(并且会尽力模拟 gcc),并且应该可以很好地处理您的代码。

尝试类似的东西make -j3 CC=clang,看看会发生什么!

PS。这种语法可能完全错误。好久没用过makefile了(顺便说一句,CMake很棒)。

于 2010-06-27T03:17:01.700 回答
2

根据您要对代码运行的实际分析,您可以查看Frama-C。它使用您告诉它的任何 C 预处理器,因此您可以根据需要使用 PIC32 的 CPP。

于 2010-06-27T23:39:26.930 回答
1

您可以使用sunifdef之类的工具根据假定定义的宏对源代码进行部分预处理。您必须复制受这些定义影响的系统和库头文件并处理它们。然后在进行静态分析时,您将指定一个不同的包含路径,指向您已处理的标头。

于 2010-06-25T17:06:45.787 回答
1

这可能不会直接为您提供解决方案,但您可能会考虑查看 Coverity,它是一个专有的静态语法分析器,但对于 OS 项目是免费的。它应该可以满足您的需求!

干杯!

于 2010-04-28T19:43:18.920 回答