Какие инструменты статического анализа с открытым исходным кодом C ++ доступны? [закрыто]

301

В Java есть несколько очень хороших инструментов статического анализа с открытым исходным кодом, таких как FindBugs , Checkstyle и PMD . Эти инструменты просты в использовании, очень полезны, работают на нескольких операционных системах и бесплатны .

Доступны коммерческие продукты статического анализа C ++. Несмотря на то, что такие продукты - это здорово, для студентов стоимость слишком велика, и получить пробную версию, как правило, довольно сложно.

Альтернатива - найти инструменты статического анализа C ++ с открытым исходным кодом, которые будут работать на нескольких платформах (Windows и Unix). Используя инструмент с открытым исходным кодом, он может быть изменен в соответствии с определенными потребностями. Поиск инструментов не был легкой задачей.

Ниже приведен краткий список инструментов статического анализа C ++, которые были найдены или предложены другими.

Какие другой портативный с открытым исходным кодом C ++ инструментов статического анализа , что кто -то знает и может быть рекомендовано?

Некоторые ссылки по теме.

jnancheta
источник
Коммерческий, DMS Software Reengineering Toolki, обрабатывает Java, C, C ++ и COBOL, обеспечивает синтаксический анализ, построение AST, разрешение имени / типа, анализ управления / потока данных, пользовательский анализ и преобразование. Смотрите semanticdesigns.com/Products/DMS/DMSToolkit.html .
Ира Бакстер
1
Для коммерческого инструмента есть также CppDepend ( cppdepend.com ), и, возможно, пробной версии может быть достаточно для студентов.

Ответы:

21

Oink - это инструмент, созданный поверх внешнего интерфейса Elsa C ++. Свинина Мозиллы - это вилка Эльзы / Уинк.

Смотрите: http://danielwilkerson.com/oink/index.html

Daniel S Wilkerson
источник
1
Я собрал более 1000 программ в своей жизни, но ради любви к Богу я не могу скомпилировать этот пакет, несмотря ни на что. Я пытался использовать Fedora, Ubuntu, WSL, Cygwin, MSYS2, Windows - но нет. Что-то всегда отсутствует, и документация просто ужасна. Не поймите меня неправильно, я думаю, инструмент превосходен. Но сайт и документация выглядят так, будто за 10-15 лет их никто не трогал.
Apache
73

CppCheck является открытым исходным кодом и кроссплатформенным.

Mac OS X:

brew install cppcheck
Soo Wei Tan
источник
1
@gio Я не видел никаких проблем лично. Я считаю, что CppCheck имеет возможность игнорировать или исключать определенные пути или файлы, что помогает сузить область действия.
Су Вэй Тан
1
На Windows:choco install cppcheck
Добрый Драгон
53

Что касается компилятора GNU, gcc уже имеет встроенную опцию, которая включает дополнительное предупреждение для -Wall. Опция -Weffc ++ касается нарушений некоторых руководящих принципов Скотта Мейерса, опубликованных в его книгах « Эффективный и более эффективный C ++ ».

В частности, опция обнаруживает следующие элементы:

  • Определите конструктор копирования и оператор присваивания для классов с динамически выделяемой памятью.
  • Предпочитаю инициализацию присваиванию в конструкторах.
  • Сделайте деструкторы виртуальными в базовых классах.
  • Пусть "operator =" возвращает ссылку на * this.
  • Не пытайтесь вернуть ссылку, когда вы должны вернуть объект.
  • Различают префиксную и постфиксную формы операторов приращения и уменьшения.
  • Никогда не перегружайте "&&", "||" или ",".
Никола Бонелли
источник
7
В дополнение к -cc -wall и -Weffc ++ для gcc -Wextra выполняет хороший статический анализ, например, ветви, которые не возвращают значение, или проверяет неподписанное на наличие значения меньше нуля. Замечательно, как часто профессиональные программисты думают, что последнее - хорошая идея ...
Flash Sheridan
24
Тьфу, -Weffc++предупреждает о тоннах конструкций, которые прекрасно работают в большой кодовой базе. Я поддерживаю предложение -Wextra, хотя; не выходи из дома без него!
Том
29

В настоящее время разрабатывается, но Clang проводит анализ C и нацелен на обработку C ++ с течением времени. Это часть проекта LLVM .

Обновление : хотя на целевой странице написано «Анализатор находится в процессе непрерывной работы», он, тем не менее, теперь задокументирован как статический анализатор для C и C ++.

Вопрос: Как я могу запустить GCC / Clang для статического анализа? (только предупреждения)

Опция компилятора: -fsyntax-only

Дон Уэйкфилд
источник
1
LLVM - очень интересный проект, который по сравнению с gcc генерирует более оптимизированные двоичные файлы за меньшее время; и лязг, когда он будет завершен, станет его интерфейсом ...
Никола Бонелли
Другой редактор добавил информацию о ключе -fsyntax-only. Просто отметьте, что по сути это запрос на запуск анализа, который компилятор будет запускать без фактической компиляции, и выдачу предупреждений. Я не уверен, но я думаю, что это отличается от статического анализа.
Дон Уэйкфилд
17

Кто-то еще упомянул -Weffc ++, но на самом деле это единственное предупреждение GCC, которое я не включаю по умолчанию. Тем не менее, набор предупреждений, которые я включаю, является наиболее важным инструментом статического анализа в моем наборе. Вы можете увидеть полный список рекомендуемых предупреждений .

В итоге:

-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-оптимизация -Wformat = 2 -Winit-self -Wlogical-op -Wmissing-декларации -Wmissing-include-dirs -Wnoexcept -Wold -style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-преобразование -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow = 5 -Wswitch-default -Wundef -Werror -Wno-unused

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

David Stone
источник
14

Джон Кармак также упоминает PVS-Studio в этом интересном сообщении в блоге «Статический анализ кода» .

Алексей Захаренко
источник
4
Это не «открытый исходный код» и, безусловно, абсолютно не «свободный» в каком-либо смысле этого слова. Это хорошо известный инструмент статического анализа (я думаю, что он занимает второе место после укрывистости), но его цена довольно высока.
Томас Прузина
7

Если под Open Source вы действительно имели в виду «бесплатный», то предварительный анализ Microsoft является хорошим. Конечно, только для Windows. Он полностью интегрирован в Visual Studio и компилятор. например:

cl /analyze Sample.cpp
user15071
источник
В какой версии и версии это доступно?
TWK
Кажется, встроен в компилятор, который является бесплатным. Интеграция возможна только для Team Edition.
JBRWilkinson
4

Сплинт, кажется, заполняет счет за C.

Если бы вы не указали открытый исходный код, я бы сказал, что PCLint от Gimpel Software, вероятно, является одним из лучших инструментов для статической проверки кода в C ++. Но, конечно, это не с открытым исходным кодом.

Mac OS X:

brew install splint
Онорио Катеначчи
источник
2
Но дорого для одного разработчика :) Мне больше нравится бесплатный
Роберт Гулд
6
Шина для C, а не C ++. Я не знаю, планируют ли они расширить охват или нет. Надеюсь, что так!
Гарольд Бэмфорд
Да, pclint стоит попробовать, его аналог в unix называется flexe-lint, версия 9.0 должна быть быстрее, чем версия 8.x, версия 9.0 также поддерживает предварительно скомпилированный заголовок, чтобы ускорить анализ. Вам нужно время, чтобы приручить pc-lint, он имеет ложноположительный результат, который может привести к неприятностям, если вы не можете выборочно игнорировать его.
zhaorufei
3

Microsoft PREFast также доступен в комплекте драйверов Windows. Версия 7.0 доступна для скачивания здесь .

Документы Microsoft утверждают, что его следует запускать только с кодом драйвера, но в этом (старом) посте блога изложены шаги для его запуска. Возможно, его можно интегрировать в обычный процесс сборки?

tmitchell
источник
PREFast сильно замедлит ваш процесс сборки, для любого реального проекта ваш сервер сборки, возможно, не может себе этого позволить.
zhaorufei
@zhaorufei: большинство статических анализов не «быстрые»; по определению у них довольно сложная работа по анализу кода. Если вам не нравится стоимость сборки все время, просто сделайте ее необязательной.
Ира Бакстер
2

Мы работали над подключаемым модулем Eclipse CDT, который называется metriculator. Он все еще находится в стадии разработки, но некоторые основные метрики (например, LSLOC, McCabe, EfferentCoupling) уже реализованы.

См. Http://sinv-56013.edu.hsr.ch/redmine/projects/metricular/wiki/Documentation для получения более подробной информации, такой как демонстрация видео и документация.

Последняя ночная сборка доступна для установки через сайт обновлений по адресу: http://sinv-56013.edu.hsr.ch/metriculator/updatesite-nightly/site/

Дальнейшее описание

Метрикатор статически анализирует исходный код C ++ и генерирует программные метрики. Метрики реализованы в виде проверок Codan. Результаты анализа могут быть изучены в отдельном представлении. Каждая метрика имеет настраиваемые свойства (например, пороговое значение для «максимум строк кода на функцию»). Превышение этого порога сообщит о проблеме и создаст маркер в редакторе исходного кода.

с помощью метрикатора вы можете:

  • анализировать C ++ файлы / папки / проекты
  • определить пороги метрики и включить / отключить метрику, используя страницу предпочтений Codans
  • есть маркеры проблем в редакторах исходного кода
  • изучить метрические результаты
  • экспортировать результаты метрики в виде облака тегов (доступно в качестве дополнительной функции на сайте обновлений)

В настоящее время метрикатор поставляется со следующими метриками:

  • МакКейб (цикломатическая сложность)
  • Эфферентная связь по типу
  • Логические исходные строки кода
  • Количество членов на тип
  • Количество параметров на функцию
Жюль
источник
1

Вы должны попробовать oo-browser, он имеет отличную интеграцию с xemacs

Jude
источник
1

Можно также кодировать расширения GCC в MELT (предметно-ориентированный язык, предназначенный для расширения GCC) или плагины GCC в C (гораздо сложнее), чтобы выполнить собственный анализ.

Basile Starynkevitch
источник
2
Прочитав один из PDF-документа о MELT и расширении gcc с помощью melt, я чувствую, что все еще слишком сложно / сложно, чтобы добавить свои собственные плагины в gcc. Не практичный способ для обычного пользователя.
zhaorufei
1
Расширение GCC является сложным, независимо от того, как вы это делаете (через плагины C, через MELT или даже через Python). Это потому, что GCC сложен. А настроить любой инструмент статического анализа C ++ сложно, потому что спецификация языка C ++ очень сложна, и вам придется справляться с большей частью этой сложности (любая нетривиальная программа C ++ использует множество функций C ++, возможно, через стандартную библиотеку C ++) ,
Василий Старынкевич
0

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

Пол Натан
источник