2008-08-05 4 views
54

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

+1

Смотрите также [Что такое лучший инструмент командной строки для код очистки] (http://stackoverflow.com/questions/393208/what-is-the-best-command-line-tool-to-clean-up-code/) и [Рекомендуемые опции предупреждения GCC для C] (http://stackoverflow.com/questions/154630/recommended-gcc-warning-options-for-c). Если у вас есть прототипы, которые были правильно централизованы в заголовках и использовались повсеместно, то кросс-файл, проверяющий, что `lint` делает, также выполняется компилятором (хотя и по одному файлу за раз). – 2012-03-05 06:30:55

+0

Голосование закрывается как инструмент rec. – 2015-07-02 12:16:35

+0

Анализатор PVS-Studio теперь доступен для Linux - http://www.viva64.com/ru/b/0441/ – 2016-11-06 20:23:47

ответ

29

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

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

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

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

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

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

14

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

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

+8

Flexelint невероятно дорогой. – nwp 2014-06-05 13:21:57

+2

@ nwp, я бы не сказал, что это дорого. При одноместной стоимости 1000 долларов (unix) или 400 долларов США (окна), вероятно, он оплачивает одну проблему с одним клиентом. – 2014-06-05 19:20:28

+0

@MarkHarrison: могу ли я использовать это онлайн? – 2014-07-22 19:02:21

12

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

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

5

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

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

0

Существует «-WeffC++» вариант для НКУ, который по странице человека Mac OS X будет:

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

[надрез]

Я знаю, что вы спросили о С, но это ближайший я знаю ..

1

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

Я работаю в направлении обнародования инструмента преемника, Orion (СОДЕРЖАНИЯ не доступен)

0

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

BTW FlexeLint является ворсом

1

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

0

G'day,

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

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

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

веселит,

Роб

5

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

1

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

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

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

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

0

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

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

0

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

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

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

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

1

Вы можете попробовать CppDepend, довольно полный статический анализатор, доступных на окнах и Linux, Повсеместно VS Plugin, IDE или командной строки, и это бесплатно open source contributors

Смежные вопросы