[英]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.