Выбор инструмента статического анализа кода
Я работаю над проектом, в котором я пишу код на C в среде UNIX. Я использовал инструмент lint для проверки моего исходного кода. Lint существует уже давно (с 1979 года), кто-нибудь может предложить более свежий инструмент для анализа кода, который я мог бы использовать? Предпочтительно инструмент, который является бесплатным.
15 ответов
Не забывайте о самом компиляторе.
Прочитайте документацию по компилятору и найдите все предупреждения и ошибки, которые он может выдать, а затем включите столько, сколько имеет смысл для вас.
Также убедитесь, что ваш компилятор обрабатывает предупреждения как ошибки, чтобы вы были вынуждены исправить их сразу. ("-Werror" на gcc)
Также: "-Wall" на gcc не включает все предупреждения, не обманывайте себя.
Также также: проверьте valgrind (бесплатно!) - он "автоматически обнаруживает множество ошибок управления памятью и многопоточности, а также детально профилирует ваши программы".
Valgrind не статическая проверка, но это отличный инструмент! http://valgrind.org/
Для кода на C вам определенно следует использовать Flexelint. Я использовал это в течение почти 15 лет и клянусь этим. Одна из действительно замечательных функций, которую он имеет, заключается в том, что предупреждения можно выборочно отключать и включать с помощью комментариев в коде ("/* lint -e123*/"). Это оказалось мощным инструментом документирования, когда вы хотели чего-то необычного. "Я отключаю предупреждение X, поэтому есть веская причина, по которой я делаю X".
Для тех, кто интересуется интересными вопросами C/C++, посмотрите на некоторые из их примеров на их сайте и посмотрите, сможете ли вы выяснить ошибки, не обращая внимания на подсказки.
Я слышал много хорошего о статическом анализаторе clang, который IIRC использует в качестве своего бэкэнда LLVM. Если это реализовано на вашей платформе, это может быть хорошим выбором.
Из того, что я понимаю, это немного больше, чем просто синтаксический анализ. "Автоматический поиск ошибок", например.
Вы можете использовать cppcheck. Это простой в использовании инструмент для статического анализа кода.
Например:cppcheck --enable=all .
проверит все файлы C/C++ в текущей папке.
Недавно я составил список всех инструментов статического анализа, которые были в моем распоряжении, и я все еще оцениваю их все. Обратите внимание, что это в основном инструменты анализа безопасности.
- лубок
- Крысы
- SMATCH
- Организация Объединенных Наций
Мы использовали Coverity Prevent для проверки исходного кода C++.
Это не бесплатный инструмент (хотя я считаю, что они предлагают бесплатное сканирование для проектов с открытым исходным кодом), но это один из лучших инструментов статического анализа, который вы найдете. Я слышал, что на C это даже впечатляет больше, чем на C++, но это помогло нам избежать целого ряда ошибок.
Инструменты типа Lint обычно страдают от проблемы "ложной тревоги": они сообщают о гораздо большем количестве проблем, чем реально существует. Если доля действительно полезных предупреждений слишком мала, пользователь учится просто игнорировать инструмент. Более современные инструменты требуют определенных усилий, чтобы сосредоточиться на наиболее вероятных / интересных предупреждениях.
Вы можете попробовать CppDepend, довольно полный статический анализатор, доступный в Windows и Linux, с помощью плагина VS, IDE или командной строки, и он бесплатен для участников с открытым исходным кодом.
Вы можете найти инструмент Uno полезным. Это один из немногих бесплатных не игрушечных вариантов. Он отличается от lint, Flexelint и т. Д. Фокусировкой на небольшом количестве "семантических" ошибок (разыменования нулевого указателя, индексы массива за пределами границ и использование неинициализированных переменных). Это также позволяет определенные пользователем проверки, такие как дисциплина блокировки-разблокировки.
Я работаю над публичным выпуском инструмента-преемника Orion (СОДЕРЖАНИЕ НЕ ДОСТУПНО БОЛЬШЕ)
PC-lint/Flexelint - это очень мощные и полезные инструменты статического анализа, которые легко настраиваются, хотя, к сожалению, и не бесплатны.
При первом использовании такого инструмента они могут выдавать огромное количество предупреждений, что затрудняет различие между основными и второстепенными. Поэтому лучше всего начать использовать инструмент в своем коде как можно раньше в проекте, а затем запускать его в своем коде как можно чаще, чтобы вы могли иметь дело с новыми предупреждениями по мере их появления.
При постоянном использовании, подобном этому, вы вскоре научитесь писать свой код способом, который соответствует правилам, применяемым инструментом.
Из-за этого я предпочитаю такие инструменты, как Lint, которые работают относительно быстро и поэтому поощряют постоянное использование, а не более громоздкие инструменты, которые вы можете использовать реже, если вообще будете использовать.
Sparse - это программный инструмент, уже доступный в Linux, предназначенный для поиска возможных ошибок кодирования в ядре Linux.
Существует два активных проекта Linux Verification Center, направленных на улучшение качества загружаемых модулей ядра.
- Проверка драйверов Linux (LDV) - полный набор инструментов для статической проверки исходного кода драйверов устройств Linux.
- KEDR Framework - расширяемая среда для динамического анализа и проверки модулей ядра.
- Другим текущим проектом является Проверка файловой системы Linux, целью которого является разработка специального набора инструментов для проверки реализации файловой системы Linux.
lint постоянно обновляется... так почему вы хотите более новый.
Кстати, flexelint это ворс
G'day,
Я полностью согласен с предложениями прочитать и переварить то, что говорит вам компилятор после установки -Wall.
Хорошим инструментом статического анализа для обеспечения безопасности является FlawFinder, написанный Дэвидом Уилером. Это делает хорошую работу в поисках различных подвигов безопасности,
Однако это не заменяет умелое чтение кем-то вашего кода. Как говорит Дэвид на своей веб-странице: "Дурак с инструментом все еще дурак!"
веселит,
обкрадывать
Я обнаружил, что обычно для поиска ошибок лучше всего использовать несколько инструментов статического анализа. Каждый инструмент разработан по-разному, и они могут найти очень разные вещи друг от друга.
Есть некоторые хорошие обсуждения в некоторых из бесед здесь. Это из конференции, проведенной Министерством внутренней безопасности США по статическому анализу.
Для gcc есть опция "-WeffC++", которая согласно справочной странице Mac OS X будет:
Предупреждать о нарушениях следующих руководств по стилю из книги Скотта Мейерса "Эффективный C++":
[надрез]
Я знаю, что вы спросили о C, но это самое близкое, что я знаю..