Анализаторы статического кода для C

Какой статический анализатор кода (если есть) вы используете? Я использовал PyLint для Python, и я очень доволен этим, теперь мне нужно что-то подобное для кода C.

Сколько из этого вывода вы должны подавлять для нормального ежедневного использования?

Ответ 1

Википедия поддерживает список статических инструментов анализа кода для разных языков (включая C).

Лично я использовал PC-Lint и Splint. Лучший выбор зависит от типа приложения, которое вы написали. Однако независимо от того, какой инструмент вы используете, будет низкий коэффициент отношения сигнал/шум, пока вы не настроите правильную настройку инструмента и вашего кода.

PC-Lint - самый мощный инструмент Lint, который я использовал. Если вы добавите его в существующий проект, отношение сигнал/шум может быть низким. Однако, как только инструмент и ваш код настроены правильно, его можно использовать как часть стандартного процесса сборки. Последний крупный проект, в котором я его использовал, мы установили его так, чтобы предупреждения PC-Lint нарушили сборку. Лицензии на PC-Lint стоят $389, но это стоит затрат.

Splint - отличный инструмент с открытым исходным кодом. Я использовал его по нескольким проектам, но обнаружил, что его сложно настроить при использовании компилятора с ext ANSI C extenstions (например, в проектах с встроенными системами).

Valgrind также стоит рассматривать как инструмент динамического анализа.


Вы специально запросили отзывы о SourceMonitor. Этот инструмент предоставляет интересные показатели для вашего кода, но его следует использовать в качестве дополнения к хорошему инструменту Lint, поскольку он не предоставляет такого рода анализ.

Как указано на их домашней странице, SourceMonitor будет:

... узнать, сколько у вас кода и для определения относительной сложности ваши модули. Например, вы можете использовать SourceMonitor для идентификации кода которые, скорее всего, будут содержать дефекты и, следовательно, гарантирует формальный обзор.

Я использовал его в недавнем проекте и нашел, что он прост в использовании (даже для кода встроенных систем). Метрика сложности - отличный ресурс для разработки кода, который будет менее подвержен ошибкам и легче поддерживать.

SourceMonitor предоставляет хорошие графики своего вывода, а также хорошо отформатированный XML, если вы хотите автоматизировать сбор показателей. Единственным недостатком является то, что инструмент работает только в Windows.

Ответ 2

Мы используем PC-Lint и очень довольны им.

Кажется, что есть несколько лагерей относительно подавления и настройки сообщений:

  • подавляйте все, а затем не подавайте только то, что вас интересует.
  • отключить все, а затем подавить предупреждения, которые вам не интересны.
  • сохранить все неудовлетворительное

Мы склонны падать где-то между второй и третьей категориями. Это означает смехотворный текстовый дамп 100MiB + (по одной ошибке в строке) за один пробег в основных библиотеках (много старого кода).

Пользовательский diff -подобный инструмент наблюдает за изменениями и отправляет их этим сообщениям автору фиксации, который сохраняет количество, которое большинство людей должны смотреть на несколько строк. Мы собираем интересную статистику об ошибках с течением времени с некоторыми базовыми интеллектуальными данными.

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

Ответ 3

Там splint, хотя, честно говоря, я никогда не мог заставить его работать; на моей платформе это действительно слишком сдержанно. На практике мой самый используемый "lint" представляет собой следующие предупреждающие флаги для gcc

-std=c89 -pedantic -W -Wall -Wstrict-prototypes -Wunreachable-code  -Wwrite-strings -Wpointer-arith -Wbad-function-cast -Wcast-align -Wcast-qual

Конечно, я в основном забыл, что означает половина из них. Но они поймают немало вещей.

Ответ 4

Я большой поклонник Дэвида Эванса, работающего над LC/Lint, который, по-видимому, изменил название на Splint. Это очень агрессивно, и вы можете сказать ему много полезной информации, добавив аннотации к вашему коду. Он предназначен для использования с аннотациями программистов. Он будет работать без них, но если вы попытаетесь использовать его в качестве простой проверки, не предоставляя никаких комментариев, вы, вероятно, будете разочарованы. Если вы хотите полностью автоматизировать проверку, и если вы можете иметь дело с инструментом только для Windows, вам лучше с Gimpel PC-Lint. Джим Гимпель имел счастливых клиентов более 25 лет.

Ответ 5

Я использовал PCLint навсегда и очень понравился. Мне жаль, что они не попали на С#... Это те, у кого есть поп-викторины на C или С++-коде во всех журналах.