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

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

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

Из того, что я понимаю, это немного больше, чем просто синтаксический анализ. "Автоматическое обнаружение ошибок", например.

Ответ 4

Мы использовали Coverity Prevent, чтобы проверить исходный код С++.

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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

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

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

Ответ 11

Существует опция "-WeffС++" для gcc, которая согласно man-странице Mac OS X будет:

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

[надрез]

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

Ответ 12

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

BTW flexelint lint

Ответ 13

G'day,

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

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

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

веселит,

Rob

Ответ 14

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

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

Ответ 15

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

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

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