Бесплатная статическая проверка для кода C99 - PullRequest
17 голосов
/ 27 апреля 2010

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

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

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

Ответы [ 6 ]

5 голосов
/ 27 апреля 2010

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

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

3 голосов
/ 27 апреля 2010

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

#ifndef MACRO_I_NEED
#error "MACRO_I_NEED should be defined"
#define MACRO_I_NEED  // to appease cppcheck
#endif
2 голосов
/ 28 июня 2010

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

2 голосов
/ 27 июня 2010

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

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

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

1 голос
/ 25 июня 2010

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

1 голос
/ 28 апреля 2010

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

Ура!

...