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

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

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

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

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

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

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

Commercial, DMS Software Reengineering Toolki, обрабатывает Java, C, C++ и COBOL, обеспечивает синтаксический анализ, построение AST, разрешение имени / типа, анализ управления / потока данных, пользовательский анализ и преобразование. См. semanticdesigns.com/Products/DMS/DMSToolkit.html.

Ira Baxter 02.07.2009 10:48

Для коммерческого инструмента существует также CppDepend (cppdepend.com), и, возможно, для студентов может быть достаточно пробной версии.

Issam 14.11.2010 14:59
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
303
2
97 063
14
Перейти к ответу Данный вопрос помечен как решенный

Ответы 14

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

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

Mac OS X:

brew install splint

Но дорого для одного разработчика :) Мне больше нравится бесплатное

Robert Gould 27.09.2008 05:20

Шина предназначена для C, а не для C++. Не знаю, планируют ли они расширять охват или нет. Надеюсь на это!

Harold Bamford 29.01.2009 22:34

Да, стоит попробовать pclint, его аналог в unix называется flexe-lint, версия 9.0 должна быть быстрее, чем версия 8.x, версия 9.0 также поддерживает предварительно скомпилированный заголовок для ускорения анализа. Вам нужно время, чтобы приручить pc-lint, у него есть ложные срабатывания, которые могут доставить вам неприятности, если вы не можете выборочно игнорировать его.

zhaorufei 08.05.2012 19:04

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

cl /analyze Sample.cpp

В какой версии и редакции это доступно?

twk 05.10.2008 23:14

Кажется, встроен в компилятор, который бесплатен. Интеграция возможна только в версии Team.

JBRWilkinson 14.12.2010 15:52

Статический анализ Mozilla, наверное, стоит посмотреть.

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

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

  • Определите конструктор копирования и оператор присваивания для классов с динамически выделяемой памятью.
  • Предпочитайте инициализацию присваиванию в конструкторах.
  • Сделайте деструкторы виртуальными в базовых классах.
  • Попросите "operator =" вернуть ссылку на * this.
  • Не пытайтесь вернуть ссылку, если нужно вернуть объект.
  • Различают префиксную и постфиксную формы операторов увеличения и уменьшения.
  • Никогда не перегружайте "&&", "||" или ",".

В дополнение к gcc -Wall и -WeffC++, -Wextra выполняет некоторый хороший бесплатный статический анализ, например, ветки, которые не возвращают значение, или проверяют беззнаковое значение меньше нуля. Примечательно, как часто профессиональные программисты думают, что последнее - хорошая идея ...

Flash Sheridan 06.04.2009 23:42

Уф, -Weffc++ предупреждает о тонны конструкций, которые прекрасно подходят для большой кодовой базы. Однако я поддерживаю предложение -Wextra; без него не выходить из дома!

Tom 15.12.2009 08:40

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

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

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

Параметр компилятора: -fsyntax-only

LLVM - очень интересный проект, который по сравнению с gcc генерирует более оптимизированные двоичные файлы за меньшее время; и clang, когда он будет завершен, будет его интерфейсом ...

Nicola Bonelli 30.09.2008 01:55

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

Don Wakefield 06.10.2014 21:49
Ответ принят как подходящий

Oink - это инструмент, созданный на основе интерфейса Elsa C++. Mozilla's Pork - это форк Elsa / Oink.

См .: http://danielwilkerson.com/oink/index.html

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

Apache 10.12.2017 13:52

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

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

Mac OS X:

brew install cppcheck

@gio Я лично не видел никаких проблем. Я считаю, что CppCheck может игнорировать или исключать определенные пути или файлы, что помогает сузить область действия.

Soo Wei Tan 06.03.2015 03:47

В Windows: choco install cppcheck

KindDragon 03.07.2015 14:31

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

Microsoft PREFast также доступен в Windows Driver Kit. Версия 7.0 загружается здесь.

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

PREFast сильно замедлит ваш процесс сборки, для любого реального проекта ваш сервер сборки, возможно, не может себе этого позволить.

zhaorufei 08.05.2012 19:01

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

Ira Baxter 28.03.2014 13:34

Можно также закодировать расширения GCC в ТАЯТЬ (специфический для домена язык, разработанный для расширения GCC) или плагины GCC на C (намного сложнее), чтобы провести некоторый собственный анализ.

Прочитал один из PDF-файлов о MELT и расширении gcc с помощью melt, мне кажется, что добавлять свои собственные плагины в gcc все еще слишком сложно / сложно. Непрактичный способ для обычного пользователя.

zhaorufei 08.05.2012 18:59

Расширение GCC сложно, независимо от того, как вы это делаете (через плагины C, через MELT или даже через Python). Это потому, что GCC сложен. А настройка инструмента статического анализа C++ Любые - это жесткий, потому что спецификация языка C++ очень сложна, и вам придется справиться с большей частью этой сложности (любая нетривиальная программа на C++ использует множество функций C++, возможно, через стандартную библиотеку C++) .

Basile Starynkevitch 08.05.2012 19:51

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

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

Tomas Pruzina 01.11.2014 21:59

Мы работаем над подключаемым модулем 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/

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

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

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

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

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

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

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

В итоге:

-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-declarations -Wmissing-include-dirs -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Werror -Wno-unused

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

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