簡體   English   中英

免費的C99代碼靜態檢查器

[英]Free static checker for C99 code

我正在尋找一個C99代碼(包括GCC擴展)的免費靜態檢查器,能夠明確地說“這些預處理器宏總是被定義”。

我需要最后一部分,因為我正在為單個目標處理器編譯嵌入式代碼。 編譯器(Microchip的C32,基於GCC)根據所選處理器設置宏,然后在PIC32頭文件中使用該宏來選擇要包含的特定於處理器的頭文件。 因此, cppcheck失敗了,因為它檢測到用於選擇許多可能的PIC32處理器之一的30種不同的#ifdef ,試圖分析這些加上所有其他#define的所有可能組合,並失敗。

例如,如果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論壇上詢問過這個問題(雖然討論的內容更多是關於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 ,我的代碼是完美的,或者它沒有做任何事情。 我不確定一個好的測試可能是看它是否有效。

Clang的靜態分析儀應該可以工作。

源代碼#defines另一個選項是你可以使用一些預處理器語句在源代碼上運行cpp ,然后通過靜態分析器運行結果代碼。

你可以在標題的頂部添加一些這樣的代碼,以保證它的定義:

#ifndef MACRO_I_NEED
#error "MACRO_I_NEED should be defined"
#define MACRO_I_NEED  // to appease cppcheck
#endif

不要使用帶有clang的scan-build,而是考慮完全交換gcc! Clang的C支持是穩定的(並且最好模仿gcc),並且應該很好地處理你的代碼。

試試make -j3 CC=clang類的東西,看看會發生什么!

PS。 這種語法可能完全錯誤。 多年沒有使用過makefile(CMake是驚人的btw)。

根據您希望在代碼上運行的實際分析,您可以查看Frama-C 它使用您告訴它的任何C預處理器,因此您可以根據需要使用PIC32的CPP。

這可能不會直接為您提供解決方案,但您可能會考慮查看Coverity,這是一個專有的靜態語法分析器,但對於OS項目是免費的。 它應該做你需要的工作!

干杯!

您可以使用sunifdef之類的工具根據假定的定義宏對源代碼進行部分預處理。 您必須制作受這些定義影響的系統和庫頭的副本,並對其進行處理。 然后,在進行靜態分析時,您將指定指向已處理標頭的不同包含路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM