Я ищу свободное статическое средство проверки для кода C99 (включая расширения GCC) со способностью явно сказать "их, макросы препроцессора всегда определяются".
Мне нужна та последняя часть, потому что я компилирую встроенный код для процессора единой цели. Компилятор (C32 микрочипа, базирующийся GCC) устанавливает макрос на основе выбранного процессора, который затем используется в заголовочных файлах PIC32 для выбора определенного для процессора заголовочного файла для включения. cppcheck поэтому перестал работать, потому что он обнаруживает отличающиеся 30 #ifdef
s раньше выбирал один из многих возможных процессоров PIC32, попытки проанализировать все возможные комбинации их плюс все другой #define
s, и сбои.
Например, если бы шплинт мог бы обработать код 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 (было бы хорошо не должным быть записать make-файл для 30 + единицы компиляции). Я спросил об этом на форумах Eclipse (хотя обсуждение, там больше об интеграции в Eclipse). Ничто инновационное.
Обновление № 2 - просто попробованный 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" <>
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
Это может не дать вам решение напрямую, но вы можете подумать о том, чтобы взглянуть на Coverity, который является проприетарным анализатором статического синтаксиса, но не содержит плата за проекты ОС. Он должен делать то, что вам нужно!
Ура!
. Вы можете использовать такой инструмент, как sunifdef , для частичной предварительной обработки исходного кода в соответствии с к предполагаемым определенным макросам. Вам нужно будет сделать копии заголовков системы и библиотеки, на которые влияют эти определения, и обработать их. Затем, выполняя статический анализ, вы должны указать другой путь включения, указывающий на ваши уже обработанные заголовки.
Вместо использования scan-build с clang рассмотрите возможность полной замены gcc! Поддержка Clang C стабильна (и делает все возможное, чтобы эмулировать gcc), и она должна нормально обрабатывать ваш код.
Попробуйте что-нибудь вроде make -j3 CC = clang
и посмотрите, что произойдет!
PS. Этот синтаксис может быть совершенно неправильным. Давно не использовал make-файлы (CMake, кстати, потрясающий).
В зависимости от того, какие именно анализы вы хотите проводить над своим кодом, вы можете взглянуть на Frama-C. Он использует любой препроцессор C, который вы ему укажете, так что вы можете использовать CPP от PIC32, если хотите.