Я ищу бесплатную статическую проверку для кода C99 (включая расширения GCC) с возможностью явного указания "эти макросы препроцессора всегда определены".
Мне нужна эта последняя часть, потому что я компилирую встроенный код для одного целевого процессора. Компилятор (Microchip C32, GCC based) устанавливает макрос на основе выбранного процессора, который затем используется в заголовочных файлах PIC32, чтобы выбрать соответствующий заголовочный файл для конкретного процессора. cppcheck поэтому терпит неудачу, потому что он обнаруживает 30 разных #ifdef
, используемых для выбора одного из многих возможных процессоров PIC32, пытается проанализировать все возможные комбинации из них плюс все остальные #define
s, и терпит неудачу.
Например, если splint может обрабатывать код C99, я бы использовал
splint -D__PIC32_FEATURE_SET__=460 -D__32MX460F512L__ \
-D__LANGUAGE_C__ -I/path/to/my/includes source.c
Еще одна проблема заключается в том, что компилятор PIC32 toolchain называется pic32-gcc
, а не только gcc
, хотя мне еще не дошло, что нужно учитывать это.
Обновление # 1. Меня интересует только одно, но является ортогональным этому вопросу, это интеграция Eclipse (было бы неплохо не писать makefile для 30 + компиляционных модулей). Я спросил об этом на форумах Eclipse (хотя в обсуждении больше говорится об интеграции в 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.
Таким образом, либо мой код идеален в соответствии с scan-build
, либо он ничего не делает. Я не уверен, какой хороший тест может быть, если он работает.