Свободное статическое средство проверки для кода C99

Я ищу свободное статическое средство проверки для кода C99 (включая расширения GCC) со способностью явно сказать "их, макросы препроцессора всегда определяются".

Мне нужна та последняя часть, потому что я компилирую встроенный код для процессора единой цели. Компилятор (C32 микрочипа, базирующийся GCC) устанавливает макрос на основе выбранного процессора, который затем используется в заголовочных файлах PIC32 для выбора определенного для процессора заголовочного файла для включения. cppcheck поэтому перестал работать, потому что он обнаруживает отличающиеся 30 #ifdefs раньше выбирал один из многих возможных процессоров PIC32, попытки проанализировать все возможные комбинации их плюс все другой #defines, и сбои.

Например, если бы шплинт мог бы обработать код 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, или это ничего не делает. Я не уверен, что хороший тест мог бы быть должен видеть, работает ли он.

17
задан detly 21 June 2010 в 04:18
поделиться

6 ответов

Статический анализатор Clang должен работать.

Другой вариант с исходным кодом #defines заключается в том, что вы можете запустить cpp поверх исходного кода с некоторыми инструкциями препроцессора, а затем запустить полученный код через статический анализатор. .

5
ответ дан 30 November 2019 в 14:20
поделиться

Вы можете просто добавить такой код в верхнюю часть заголовка, который гарантирует, что он определен:

#ifndef MACRO_I_NEED
#error "MACRO_I_NEED should be defined"
#define MACRO_I_NEED  // to appease cppcheck
#endif
3
ответ дан 30 November 2019 в 14:20
поделиться

Это может не дать вам решение напрямую, но вы можете подумать о том, чтобы взглянуть на Coverity, который является проприетарным анализатором статического синтаксиса, но не содержит плата за проекты ОС. Он должен делать то, что вам нужно!

Ура!

1
ответ дан 30 November 2019 в 14:20
поделиться

. Вы можете использовать такой инструмент, как sunifdef , для частичной предварительной обработки исходного кода в соответствии с к предполагаемым определенным макросам. Вам нужно будет сделать копии заголовков системы и библиотеки, на которые влияют эти определения, и обработать их. Затем, выполняя статический анализ, вы должны указать другой путь включения, указывающий на ваши уже обработанные заголовки.

1
ответ дан 30 November 2019 в 14:20
поделиться

Вместо использования scan-build с clang рассмотрите возможность полной замены gcc! Поддержка Clang C стабильна (и делает все возможное, чтобы эмулировать gcc), и она должна нормально обрабатывать ваш код.

Попробуйте что-нибудь вроде make -j3 CC = clang и посмотрите, что произойдет!

PS. Этот синтаксис может быть совершенно неправильным. Давно не использовал make-файлы (CMake, кстати, потрясающий).

2
ответ дан 30 November 2019 в 14:20
поделиться

В зависимости от того, какие именно анализы вы хотите проводить над своим кодом, вы можете взглянуть на Frama-C. Он использует любой препроцессор C, который вы ему укажете, так что вы можете использовать CPP от PIC32, если хотите.

2
ответ дан 30 November 2019 в 14:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: