Анализаторы статического кода для 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 или С++-коде во всех журналах.
Ответ 6
В проекте 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.