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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    В проекте 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.