Статические анализаторы кода для C - PullRequest
10 голосов
/ 17 июля 2009

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

Какую часть его вы должны подавить для нормального ежедневного использования?

Ответы [ 6 ]

14 голосов
/ 17 июля 2009

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

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

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

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

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


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

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

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

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

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

5 голосов
/ 18 июля 2009

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

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

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

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

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

Здесь вы можете по-настоящему отточиться, связав ошибки с более подробными описаниями, предоставив «точки» для исправления существующих предупреждений и т. Д. *

3 голосов
/ 17 июля 2009

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

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

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

2 голосов
/ 19 июля 2009

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

0 голосов
/ 18 июля 2009

В проекте llvm clang есть один http://clang -analyzer.llvm.org . Я сам не пробовал, но собираюсь это сделать.

Это выглядит довольно хорошо в действии: http://www.mikeash.com/?page=pyblog/friday-qa-2009-03-06-using-the-clang-static-analyzer.html Выше для Objective-C, но это должно быть то же самое для C.

0 голосов
/ 17 июля 2009

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

...