代码之家  ›  专栏  ›  技术社区  ›  detly

C99代码的自由静态检查程序

  •  17
  • detly  · 技术社区  · 14 年前

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

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

    例如,如果 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号 -只是尝试 scan-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.
    

    所以我的代码是完美的 扫描构建 或者什么都没做。我不确定一个好的测试是否有效。

    6 回复  |  直到 14 年前
        1
  •  5
  •   Bill Lynch    14 年前

    Clang's static analyzer 应该工作。

    源代码的另一个选项 #defines 你能跑吗 cpp 用一些预处理器语句覆盖源代码,然后通过静态分析器运行生成的代码。

        2
  •  3
  •   Adam Rosenfield    14 年前

    您只需在头的顶部添加一些这样的代码,以确保它被定义:

    #ifndef MACRO_I_NEED
    #error "MACRO_I_NEED should be defined"
    #define MACRO_I_NEED  // to appease cppcheck
    #endif
    
        3
  •  2
  •   Clark Gaebel    14 年前

    不要使用带clang的scan build,考虑完全交换gcc!Clang的C支持是稳定的(并且尽最大努力模拟GCC),并且应该可以很好地处理代码。

    尝试一下 make -j3 CC=clang 看看会发生什么!

    另外,那个语法可能是完全错误的。很久没用过makefiles(cmake是神奇的btw)。

        4
  •  2
  •   porges    14 年前

    根据您想要在代码上运行的实际分析,您可以查看 Frama-C . 它使用你告诉它的任何C预处理器,所以你可以使用pic32的cpp。

        5
  •  1
  •   damien.courousse    14 年前

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

    干杯!

        6
  •  1
  •   Geoff Reedy    14 年前

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