Які інструменти статичного аналізу з відкритим кодом C ++ доступні? [зачинено]


301

У Java є кілька дуже хороших інструментів статичного аналізу з відкритим кодом, таких як FindBugs , Checkstyle та PMD . Ці інструменти прості у використанні, дуже корисні, працюють у багатьох операційних системах та безкоштовні .

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

Альтернативою є пошук інструментів статичного аналізу з відкритим кодом C ++, які працюватимуть на декількох платформах (Windows та Unix). Використовуючи інструмент із відкритим кодом, його можна модифікувати відповідно до певних потреб. Пошук інструментів було непростим завданням.

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

Які інший портативний з відкритим вихідним кодом C ++ інструментів статичного аналізу , що хто -то знає і може бути рекомендовано?

Деякі пов'язані посилання.


Комерційний, інструмент реінжинірингу програмного забезпечення DMS, обробляє 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


1
Я склав 1000+ програм у своєму житті, але для любові Божої я не можу скласти цей пакет, незважаючи ні на що. Я намагався використовувати Fedora, Ubuntu, WSL, Cygwin, MSYS2, Windows - але ні. Щось завжди не вистачає, а документація просто жахлива. Не зрозумійте мене неправильно, я думаю, інструмент чудовий. Але веб-сайт та документація виглядають так, що ніхто не торкався їх за 10-15 років.
Apache

73

CppCheck є відкритим кодом та крос-платформним.

Mac OSX:

brew install cppcheck

1
@gio Я жодних питань особисто не бачив. Я вважаю, що CppCheck має можливість ігнорувати або виключати певні шляхи чи файли, що допомагає звузити область застосування.
Soo Wei Tan

1
У Windows:choco install cppcheck
KindDragon

53

Що стосується компілятора GNU, gcc вже має вбудований варіант, який дозволяє додаткове попередження для тих, хто використовує -Wall. Варіант -Weffc ++, і це стосується порушень деяких вказівок Скотта Майєрса, опублікованих у його книгах " Ефективніший та ефективніший C ++ ".

Зокрема, опція виявляє такі елементи:

  • Визначте конструктор копій та оператор призначення для класів з динамічно виділеною пам'яттю.
  • Віддайте перевагу ініціалізації присвоєння в конструкторах.
  • Зробіть деструктори віртуальними в базових класах.
  • Попросити "operator =" повернути посилання на * це.
  • Не намагайтеся повернути посилання, коли ви повинні повернути об'єкт.
  • Розрізняють префіксні та постфіксні форми операторів збільшення та скорочення.
  • Ніколи не перевантажуйте "&&", "||" або ",".

7
Окрім gcc -Wall та -Weffc ++, -Wextra робить хороший безкоштовний статичний аналіз, наприклад, гілки, які не повертають значення, або перевіряючи неподписане значення на менше нуля. Дивовижно, як часто професійні програмісти вважають, що остання є гарною ідеєю…
Flash Sheridan

24
Юк, -Weffc++попереджає про тонни конструкцій, які ідеально чудові у великій кодовій базі. Я другий пропозиція -Wextra, хоча; не залишайте дому без нього!
Том

29

Наразі розробляється, але кланг робить аналіз 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-Winin-self -Wlogical-op -Wmissing-декларації -Wmissing-include-dirs -Wnoexcept -Wold -style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-convert -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow = 5 -Wswitch-default -Wundef -Werror -Wno-unused

Зауважте, що для деяких із них потрібна нова версія gcc, тому вам може знадобитися усунути їх зі свого списку, якщо ви зупинилися на 4.5 або щось інше.


14

Джон Кармак також згадує PVS-Studio у цій цікавій публікації в блозі на тему "Аналіз статичного коду" .


4
Це не є «відкритим кодом» і абсолютно і позитивно не є «вільним» у будь-якому сенсі цього слова. Це добре відомий інструмент статичного аналізу (я думаю, що другий за покриттям), але ціна його досить висока.
Томаш Прузіна

7

Якщо під відкритим кодом ви справді мали на увазі "безкоштовно", то попередній аналіз Microsoft є хорошим. Звичайно, лише для Windows. Він повністю інтегрований у Visual Studio та компілятор. наприклад:

cl /analyze Sample.cpp

У якій версії та виданні це доступне?
twk

Здається, вбудований у компілятор, який є безкоштовним. Інтеграція, ймовірно, лише командне видання.
JBRWilkinson


4

Слінт, здається, заповнив рахунок за С.

Якщо ви не вказали відкритий код, я б сказав , що PCLint Gimpel Software - це, мабуть, один з найкращих інструментів, доступних для перевірки статичного коду в C ++. Але, звичайно, це не з відкритим кодом.

Mac OSX:

brew install splint

2
Але дорого для одного розробника :) Мені подобається безкоштовно
Роберт Гулд,

6
шина призначена для C, а не C ++. Я не знаю, планують вони розширити покриття чи ні. Сподіваюсь, що так!
Гарольд Бамфорд

Так, pclint варто спробувати, його зустрічна частина в Unix називається flexe-lint, версія 9.0 повинна швидше, ніж версія 8x, версія 9.0 також підтримує попередньо складений заголовок для прискорення аналізу. Для того, щоб приручити pc-lint потрібен час, у нього є хибнопозитивний результат, який може привести до неприємностей, якщо ви не зможете вибірково проігнорувати його.
zhaorufei

3

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

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


PREFast дуже сповільнить ваш процес збирання. Для будь-якого реального проекту ваш сервер складання, можливо, не може собі цього дозволити.
zhaorufei

@zhaorufei: Більшість статичних аналізів не є "швидкими"; вони мають досить складну роботу з аналізу коду за визначенням. Якщо вам не подобається вартість збирання весь час, просто зробіть це необов’язковим.
Іра Бакстер

2

Ми працювали над плагіном Eclipse CDT під назвою метрикулятор. Її ще розробляють, але деякі основні показники (наприклад, LSLOC, McCabe, EfferentCoupling) вже реалізовані.

Докладнішу інформацію про відеодемонстрацію та документацію див. У розділі http://sinv-56013.edu.hsr.ch/redmine/projects/metricular/wiki/Документація .

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

Подальший опис

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

за допомогою метрикулятора ви можете:

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

На даний момент метрикулятор постачається із такими показниками:

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

1

Спробуйте спробувати oo-браузер, він чудово інтегрується з xemacs


1

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


2
Я прочитав один із PDF про MELT і розширення gcc з розплавом, я відчуваю, що це все ще занадто складно / diffcult, щоб додати власні плагіни до gcc. Не практичний спосіб для звичайного користувача.
zhaorufei

1
Розширення GCC є складним, як би ви не робили це (через плагіни C, через MELT або навіть через Python). Це тому, що GCC є складним. І налаштувати будь-який інструмент статичного аналізу C ++ важко, оскільки специфікація мови C ++ дуже складна, і вам потрібно буде обробляти більшу частину цієї складності (будь-яка нетривіальна програма C ++ використовує безліч функцій C ++, можливо, через стандартну бібліотеку C ++) .
Василь Старинкевич

0

Доксиген робить деякий аналіз потокового контролю та генерує графіки. Це може бути не тим, що ви шукаєте, але я знайшов їх корисним для погляду.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.