Выбор инструмента статического анализа кода

Я работаю над проектом, в котором кодирую на C в среде UNIX. Я использую инструмент lint, чтобы проверить свой исходный код. Lint существует уже давно (с 1979 года), может ли кто-нибудь предложить более свежий инструмент анализа кода, который я мог бы использовать? Желательно бесплатный инструмент.

Ответов (15)

Решение

Не забывайте и о самом компиляторе.

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

Также убедитесь, что ваш компилятор рассматривает предупреждения как ошибки, поэтому вы должны немедленно их исправить. ("-Ошибка" в gcc)

Также: "-Wall" в gcc не включает все предупреждения, не обманывайте себя.

Также: ознакомьтесь с valgrind (бесплатно!) - он «автоматически обнаруживает многие ошибки, связанные с управлением памятью и потоками, и детально профилирует ваши программы».

Valgrind не является статическим средством проверки, но это отличный инструмент! http://valgrind.org

lint постоянно обновляется ... так зачем вам более свежий.

BTW flexelint is lint

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

Есть два активных проекта Linux Verification Center, направленных на улучшение качества загружаемых модулей ядра.

  1. Linux Driver Verification (LDV) - комплексный набор инструментов для статической проверки исходного кода драйверов устройств Linux.
  2. KEDR Framework - расширяемый фреймворк для динамического анализа и проверки модулей ядра.
  3. Другой текущий проект - проверка файловой системы Linux, цель которого - разработать специальный набор инструментов для проверки реализаций файловой системы Linux.

Я слышал хорошие отзывы о статическом анализаторе clang , который IIRC использует LLVM в качестве бэкэнда. Если это реализовано на вашей платформе, это может быть хорошим выбором.

Насколько я понимаю, он делает немного больше, чем просто синтаксический анализ. Например, «Автоматический поиск ошибок».

Для кода C вам определенно следует использовать Flexelint . Я использовал его почти 15 лет и клянусь им. Одна из действительно замечательных функций, которые он имеет, заключается в том, что предупреждения можно выборочно отключать и включать с помощью комментариев в коде ("/ * lint -e123 * /"). Это оказалось мощным инструментом документирования, когда вы захотели чего-то необычного. «Я отключаю предупреждение X, поэтому есть веская причина, по которой я использую X».

Для тех, кто задает интересные вопросы по C/C++, просмотрите некоторые из их примеров на их сайте и посмотрите, сможете ли вы выяснить ошибки, не глядя на подсказки.

Мы использовали Coverity Prevent для проверки исходного кода C++.

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

Для gcc есть опция "-Weffc ++", которая, согласно справочной странице Mac OS X, будет:

Предупреждайте о нарушениях следующих рекомендаций по стилю из книги Скотта Мейерса по эффективному C++:

[вырезать]

Я знаю, что вы спрашивали о C, но это самое близкое, что я знаю ..

Возможно, вам пригодится инструмент Uno . Это один из немногих бесплатных вариантов, не связанных с игрушками. Он отличается от lint, Flexelint и т. Д. Тем, что фокусируется на небольшом количестве «семантических» ошибок (разряды нулевого указателя, индексы массивов за пределами границ и использование неинициализированных переменных). Он также позволяет выполнять определяемые пользователем проверки, такие как дисциплина «блокировка-разблокировка».

Я работаю над общедоступным выпуском инструмента-преемника, Orion ( СОДЕРЖАНИЕ БОЛЬШЕ НЕТ ДОСТУПНО )

Lint-подобные инструменты обычно страдают от проблемы «ложной тревоги»: они сообщают о гораздо большем количестве проблем, чем есть на самом деле. Если доля действительно полезных предупреждений слишком мала, пользователь учится просто игнорировать инструмент. Более современные инструменты прилагают некоторые усилия, чтобы сосредоточиться на наиболее вероятных / интересных предупреждениях.

Доброго времени суток,

Я полностью согласен с предложениями прочитать и усвоить то, что компилятор сообщает вам после установки -Wall.

Хорошим инструментом статического анализа безопасности является FlawFinder, написанный Дэвидом Уилером. Он отлично справляется с поиском различных уязвимостей безопасности,

Однако это не заменяет того, чтобы кто-то знающий прочитал ваш код. Как говорит Дэвид на своей веб-странице: «Дурак с инструментом - все равно дурак!»

ваше здоровье,

Роб

Недавно я составил список всех инструментов статического анализа, которые у меня были в моем распоряжении, я все еще нахожусь в процессе их оценки. Обратите внимание, что это в основном инструменты анализа безопасности.

PC-lint / Flexelint - очень мощные и полезные инструменты статического анализа, легко настраиваемые, но, к сожалению, не бесплатные.

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

При постоянном использовании, подобном этому, вы скоро научитесь писать свой код таким образом, чтобы он соответствовал правилам, применяемым инструментом.

Из-за этого я предпочитаю такие инструменты, как Lint, которые работают относительно быстро и поэтому поощряют постоянное использование, а не более громоздкие инструменты, которые вы, возможно, будете использовать реже или вообще.

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

Есть некоторые хорошее обсуждение в некоторых переговорах здесь . Это с конференции по статическому анализу, проведенной Министерством внутренней безопасности США.

Вы можете использовать cppcheck . Это простой в использовании инструмент статического анализа кода.
Например:
cppcheck --enable=all .
проверит все файлы C/C++ в текущей папке.

Вы можете попробовать CppDepend , довольно полный статический анализатор, доступный в Windows и Linux, через VS Plugin, IDE или командную строку, и это бесплатно для участников с открытым исходным кодом.