Статический анализ кода... Что? Как? Зачем?
Ура, я потихоньку возвращаюсь к регулярному постингу предположительно полезной информации. И сегодня мини-обзор средств для статического анализа кода.
Что это такое "на простом языке"?
Люди совершают ошибки. Машины из-за этого человеческого фактора, иногда, тоже. Утилиты или приложения для статического анализа кода это группа инструментов, позволяющая в автоматическом или полуавтоматическом режиме производить проверку написанного кода на различные типичные и не очень ошибки. Среди которых иногда такие, о существовании которых вы могли и не подозревать!
Для чего?
- Быстро и легко находить ошибки в своём ПО (ускорение разработки за счет упрощения проверки кода)
- Использовать данные утилиты для проверки чужого открытого ПО (удостовериться что оно написано грамотно, без использвования т.н. "небезопасных" приёмов)
- Проверяя чужой код можно даже немного (или много - в зависимости от вашей квалификации) заработать. Компании часто выделяют на это различные гранты (Bug Bounty Programs), и не только компании: даже Евросоюз выделяет на это средства. Вот вам ещё пример - список баг-баунти программ от популярного сайта HackerOne
Какие бывают анализаторы?
Типов их великое множество, но для упрощенного восприятия я бы разделил как минимум на такие категории:
- Универсальные анализаторы, "умеющие понимать" множество языков
- Заточенные на один конкретный язык анализаторы
- Заточенные для одного конкретного ПО анализаторы
Соответственно, первая категория этаких комбайнов-монстров, вторая - чуть поменьше и поконкретнее, третья встречается обычно только в очень крупных проектах, таких как один из "священных граалей" свободного ПО - само ядро Linux.
На что посмотреть (opensource)
В основном здесь представлены инструменты для проверки кода из мира языков "C" и Java, но встречается и Python, Perl и другие:
- Clang - фронтенд для фреймворка LLVM, включающий в себя статический анализатор для языка C/C++/Objective-C/C++ и некоторых других,
- Coccinelle - опять же для C,
- Cppcheck - C & C++,
- Cpplint - средство от Google для проверки С++,
- Frama-C - тоже для C,
- Infer Static Analyzer: разработка Facebook для проверки Java, C, C++ и Objective-C,
- Sparse - инструмент для проверки ядра Linux,
- BLAST - разработка института Berkeley для C,
- Checkstyle - инструмент для Java,
- FindBugs - ещё один инструмент для Java,
- Splint - проверка кода на C,
- PMD - инструмент для проверки массы всего web-related, напр. JavaScript, XML, XSL, Java, и др.,
- Soot - оптимизационный фреймворк для Java,
- Squale - Java, плюс С/C++ и Cobol,
- Opa - язык Opa включает собственный статический анализатор,
- Lintian - проверка корректности пакетов DEB (Debian),
- RPM - проверка пакетов RPM,
- RIPS - PHP и Java,
- Pylint - для Python,
- Perl::Critic - проверка Perl,
- PerlTidy - ещё одна софтинка для Perl,
- Исчерпывающий список средств, конечно же, есть в википедии.
JavaScript
- ESLint – проверка синтаксиса и форматирования для JavaScript,
- Google's Closure Compiler – JavaScript оптимизатор, переписывающий код чтобы он был компактнее и быстрее,
- JSHint – коммьюнити-форк JSLint,
- JSLint – JavaScript проверялка синтаксиса и валидатор.
Крупные IDE, которые тоже умеют
- Eclipse - одна из популярных IDE, включает в себя статические анализаторы, например PyDev плагин для проверки Python,
- IntelliJ - IDE от Intel,
- Padre - IDE для языка Perl,
- PyCharm - IDE для Python.
Инструменты, использующие формальные методы проверки
- OpenJML (Java Modelling Language) - для JML,
- KeY - формальная верификация кода на Java,
- SPARK - язык, основанный на Ada, включает в себя средства для самопроверки.
Что почитать по теме (англ)?
- https://en.wikipedia.org/wiki/Automated_code_review
- https://en.wikipedia.org/wiki/Best_Coding_Practices
- https://en.wikipedia.org/wiki/Dynamic_code_analysis
- https://en.wikipedia.org/wiki/Software_metrics
- https://en.wikipedia.org/wiki/Integrated_development_environment
Хочу отметить, что в этом обзоре я исключил проприетарные средства для проверки кода, которых примерно ещё столько же. Вы можете обратиться к статьи в Вики для получения более полной картины, если готовы потратить ваши $$$ для оптимизации кода.
Надеюсь, вы нашли здесь инструмент для статической проверки вашего любимого языка или языка вашего любимого проекта. Надеюсь, ваш код теперь всегда будет супер-корректный, оптимизированный и быстрый! А теперь вперед, к багтрекингу! :D
See ya,
@sxiii from OoOoOoslO City