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

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

См. Также Какой инструмент командной строки лучше всего подходит для очистки кода и Рекомендуемые параметры предупреждений GCC для C. Если у вас есть прототипы, правильно централизованные в заголовках и используемые повсюду, то кроссфайловая проверка, которую выполняет lint, также выполняется компилятором (хотя и по одному файлу за раз).

Jonathan Leffler 05.03.2012 10:30

Голосование за закрытие как инструмент рек.

Ciro Santilli TRUMP BAN IS BAD 02.07.2015 15:16

Доступен анализатор PVS-Studio для Linux - viva64.com/en/b/0441

user965097 06.11.2016 23:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
67
3
54 046
15
Перейти к ответу Данный вопрос помечен как решенный

Ответы 15

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

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

Flexelint смехотворно дорогой.

nwp 05.06.2014 17:21

@nwp, я бы не сказал, что это дорого. При стоимости одного места в 1000 долларов (unix) или 400 долларов (windows) он, вероятно, окупится с помощью одной проблемы с клиентом.

Mark Harrison 05.06.2014 23:20

@MarkHarrison: могу я использовать это в Интернете?

user2793162 22.07.2014 23:02
Ответ принят как подходящий

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

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

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

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

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

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

Почему это принятый ответ? Что, если я хочу проверить безопасность ресурсов, например заблокировать / разблокировать? Компилятор ничего не может сделать. А valgrind - это динамический анализ кода ...

UmNyobe 25.03.2013 13:54

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

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

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

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

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

Warn about violations of the following style guidelines from Scott Meyers' Effective C++ book:

[вырезать]

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

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

Tom 11.05.2009 02:10

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

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

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

BTW flexelint является линт

FlexeLint - это коммерческий продукт, который не имеет общей истории разработки с оригинальным Unix Lint Джонсона, AFAIK. Некоммерческая альтернатива - Splint.

Chris Conway 08.09.2008 18:20

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

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

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

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

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

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

Роб

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

+1 за шину, отличный инструмент и бесплатно (как в свободе слова, а не как в бесплатном пиве)

bortzmeyer 11.05.2009 12:15

Это бесплатно в обоих значениях этого термина.

sebnow 22.08.2010 18:46

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по теме