﻿# Инструменты статического анализа кода

Инструменты статического анализа предназначены для выявления дефектов в исходном коде программ\. Само название говорит, что принцип их работы основан на [статическом анализе кода](https://pvs-studio.ru/ru/blog/terms/0046/)\.

Существует огромное количество инструментов статического анализа, созданных для различных языков программирования\. С большим списком таких инструментов можно ознакомиться на сайте Wikipedia: [List of tools for static code analysis](https://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis)\. И существует ещё вот такой интересный список: [Awesome Static Analysis](https://github.com/analysis-tools-dev/static-analysis)\.

Наша компания разрабатывает анализатор [PVS\-Studio](https://pvs-studio.ru/ru/pvs-studio/), предназначенный для проверки кода на языках C, C\+\+, C\# и Java\. Анализатор позиционируется как платное B2B решение, но имеется несколько [вариантов](https://pvs-studio.ru/ru/blog/posts/0614/) бесплатных лицензий\. Ещё несколько популярных инструментов для проверки кода на этих языках перечислено ниже\.

## С/С\+\+

* **Cppcheck\.** Очень популярный бесплатный открытый проект\. Изначально целью было полное отсутствие ложных срабатываний, но сейчас целью является их максимальное малое количество\. Анализатор является универсальным и предназначен для анализа кода, написанного на C/C \+\+ во встроенных проектах и других, использующих различные языковые расширения\. Однако анализатор не поддерживает все конструкции, описанные новыми стандартами языка C\+\+\. Анализ потока данных по большей части чувствителен к потоку и двунаправлен\. Теоретически вы можете более или менее проверить свой код напрямую без настройки, однако на практике настройка анализа будет необходима\. Ссылки: [сайт](http://cppcheck.sourceforge.net/), [страница на сайте Wikipedia](https://en.wikipedia.org/wiki/Cppcheck)\. 
* **Clang Static Analyzer\.** Статический анализатор кода для языков C/C\+\+/Objective\-C, встроенный в компилятор Clang\. Впрочем, во многих других компиляторах также есть хорошие встроенные анализаторы кода\. Например, Visual Studio включает в себя поддержку статического анализа проектов Visual C\+\+ \(флаг компилятора /analyze\)\. Популярность Clang Static Analyzer вызвана открытостью его кода и возможностью написания собственных расширений\. Ссылки: [сайт](https://clang-analyzer.llvm.org/), [страница на сайте Wikipedia](https://en.wikipedia.org/wiki/Clang), о проверке кода Clang с помощью PVS\-Studio \- [1](https://pvs-studio.ru/ru/blog/posts/0108/), [2](https://pvs-studio.ru/ru/blog/posts/cpp/0155/), [3](https://pvs-studio.ru/ru/blog/posts/cpp/0155/), [4](https://pvs-studio.ru/ru/blog/posts/cpp/0629/)\.
* **Clang\-Tidy** \- отличается от диагностических возможностей Clang Static Analyzer тем, что Clang\-Tidy \- линтер, проверяющий соответствие кода стандартам кодирования\. Подробнее о Clang\-Tidy можно узнать [на официальном сайте](https://clang.llvm.org/extra/clang-tidy/)\.
* **Frama\-C\.** Анализатор программ на языке Си с открытым исходным кодом\. Ссылки: [сайт](http://frama-c.com/), [страница на сайте Wikipedia](https://en.wikipedia.org/wiki/Frama-C)\.
* **Lint\.** Упоминается здесь, так как представляет историческую ценность\. Этот инструмент можно назвать первым статическим анализатором кода для языка Си\. Названия многих современных анализаторов образуются от слова "lint" \(cpplint, PC\-Lint, Splint, JSLint, Rpmlint, Puppet Lint, Pylint\)\. Подробнее об инструменте можно узнать из [статьи на Wikipedia](https://en.wikipedia.org/wiki/Lint_%28software%29)\.
* **Parasoft C/C\+\+test\.** Широко известный и популярный анализатор кода\. Имеется триал\. Ссылки: [сайт](https://www.parasoft.com/products/ctest/), [страница на сайте Wikipedia](https://en.wikipedia.org/wiki/Parasoft_C/C%2B%2Btest)\.
* **PC\-Lint\.** Весьма гибкий инструмент статического анализа\. За гибкость анализа приходится платить большим количеством настроек в конфигурационных файлах\. Можно попробовать в течение 30 дней для ознакомительных целей\. Ссылки: [страница на сайте Wikipedia](https://en.wikipedia.org/wiki/PC-Lint)\.
* **Helix QAC\.** Статический анализатор для языков C, C\+\+\. Имеется возможность запросить пробную версию\. Ссылки: [сайт](https://www.perforce.com/products/helix-qac), [страница на сайте Wikipedia](https://en.wikipedia.org/wiki/Helix_QAC)\.

## C\#

* **ReSharper\.** Не является статическим анализатором в классическом понимании, так как предоставляет мало сценариев использования\. Плагин для Visual Studio, проводит статический анализ кода на языке C\# и не только\. Имеет 30\-дневный триал\. В 2020 году цена на него за месяц составляла $12\.90 для индивидуального использования\. Ссылки: [сайт](https://www.jetbrains.com/resharper/?gclid=EAIaIQobChMIoM-9gffs5wIVwQ8YCh0FOgw6EAAYASAAEgIzBPD_BwE), [страница на сайте Wikipedia](https://ru.wikipedia.org/wiki/ReSharper)\.
* **FxCop\.** Бесплатный инструмент для статического анализа кода от компании Microsoft\. Производит анализ байт\-кода \(CIL\) на соответствие рекомендациям Microsoft по проектированию приложений\. На данный момент проект мертв\.
* **Roslyn Analyzers\. **Набор статических анализаторов кода для языков C\# и Visual Basic на основе \.Net Compiler Platform \("Roslyn"\)\. Производит анализ исходного кода, в отличие от FxCop\. В составе этого проекта также был произведен порт наиболее важных правил FxCop\. Ссылки: [сайт](https://docs.microsoft.com/en-US/visualstudio/code-quality/roslyn-analyzers-overview?view=vs-2019), [GitHub](https://github.com/dotnet/roslyn-analyzers)\.
* **Security Code Scan\.** Статический анализатор кода на основе \.Net Compiler Platform \("Roslyn"\) для языков C\# и Visual Basic для поиска паттернов ошибок, связанных с безопасностью приложений: SQL Injection, Cross\-Site Scripting \(XSS\), Cross\-Site Request Forgery \(CSRF\), XML eXternal Entity Injection \(XXE\) и др\. Производит анализ исходного кода\. Ссылки: [сайт](https://security-code-scan.github.io/), [GitHub](https://github.com/security-code-scan/security-code-scan)\.
* **Roslynator\.** Набор статических анализаторов кода для языка C\# на основе \.Net Compiler Platform \("Roslyn"\)\. Производит анализ исходного кода\.** **Ссылка на [GitHub](https://github.com/JosefPihrt/Roslynator/)\.
* **CodeRush\. **Плагин для Visual Studio\. Продукт коммерческий, но имеется пробная версия\. Ссылки: [сайт](https://www.devexpress.com/products/coderush/)\.
* **Parasoft dotTEST\. **Набор инструментов для тестирования приложений \.NET, включающий в себя статический анализатор кода\. Работает как плагин для Visual Studio\. Как и в предыдущем случае, продукт коммерческий, имеется пробная версия\. Ссылки: [сайт](https://www.parasoft.com/products/parasoft-dottest/), страница на сайте [Wikipedia](https://en.wikipedia.org/wiki/Parasoft)\.

## Java

* **FindBugs\. **Наиболее известный бесплатный статический анализатор Java кода\. Анализирует байт\-код программы\. На данный момент проект мертв\. Ссылка на [сайт](http://findbugs.sourceforge.net/)\.
* **SpotBugs\.** Стал преемником FindBugs\. Проект с открытым исходным кодом\. Ссылка на [сайт](https://spotbugs.github.io/)\.
* **IntelliJ IDEA\.** Среда разработки от компании JetBrains, содержащая набор инспекций кода, которые позволяют найти, подсветить и исправить аномалии в коде\. Ссылки: [сайт](https://www.jetbrains.com/idea/), [список инспекций](https://www.jetbrains.com/help/idea/list-of-java-inspections.html), [страница на сайте Wikipedia](https://en.wikipedia.org/wiki/IntelliJ_IDEA)\.
* **SonarJava\. **Статический анализатор кода для языка Java для поиска "запахов" кода, ошибок и уязвимостей, разрабатываемый компанией SonarSource\. Ссылка на [сайт](https://www.sonarsource.com/java/)\.

## Несколько языков

* **Coverity\.** Считается одним из лучших на рынке статических анализаторов кода\. Поддерживает программу по бесплатной проверке открытых приложений\. Ссылки: [сайт](https://www.synopsys.com/software-integrity.html), [страница на сайте Wikipedia](https://en.wikipedia.org/wiki/Coverity)\. 
* **Klocwork Insight\.** Один из лидеров рынка статических анализаторов кода\. Ссылки: [сайт](https://www.perforce.com/products/klocwork), [страница на сайте Wikipedia](https://en.wikipedia.org/wiki/Klocwork)\.
* **Checkmarx CxSuite\.** Статический анализатор для анализа кода на предмет наличия закладок и уязвимостей, позволяющий выявлять и устранять проблемы безопасности на уровне исходного кода\. Поддерживает широкий спектр языков программирования: Java, C\#, Visual Basic, C/C\+\+, Ruby, JavaScript, Perl и др\. Ссылка на [сайт](https://www.checkmarx.com/)\.

Помимо всего прочего, развивается тематика анализаторов, построенных на базе ML\. Далее несколько примеров таких анализаторов:

* **DeepCode\.** Авторы этого швейцарского стартапа утверждают, что DeepCode способен обнаруживать такие уязвимости, как возможности для межсайтового скриптинга и SQL\-инъекций, так как заложенные в него алгоритмы не просто анализируют код как набор символов, но пытаются понять смысл и цель работы написанной программы\. Подробнее со стартапом можно ознакомиться [на официальном сайте](https://www.deepcode.ai/)\.
* **SapFix\.** Создан инженерами из Facebook для сокращения времени, затрачиваемого инженерами на отладку, а также ускорения процесса развертывания нового программного обеспечения\. 
* **Source\{d\}\.** Стартап, организованный в Испании\. Официальный сайт, на момент написания этого текста, не подавал признаков жизни, поэтому для ознакомления оставим ссылку только на [GitHub](https://github.com/src-d)\.
* **CodeGuru\.** Авторами CodeGuru являются инженеры из Amazon\. Сильной стороной своего анализатора они считают помощь в поиске способов оптимизации производительности вашего кода\. Ссылка на официальный сайт [тут](https://aws.amazon.com/codeguru/)\.
* **Infer\.** Статический анализатор для языков C/C\+\+, Objective\-C и Java, разработанный компанией Facebook\. Имеет открытый исходный код\. Ссылки: [сайт](https://fbinfer.com/), страница на сайте [Wikipedia](https://en.wikipedia.org/wiki/Infer_Static_Analyzer)\.

Однако несмотря на то, что нельзя отрицать пользу ML в сфере обнаружения ошибок, у таких анализаторов много недостатков\. Заглядывая в будущее, нам кажется, что ML \- лишь одна из технологий, которые будут помогать в борьбе с багами\. Наше отношение к анализаторам на базе ML описано в статье "[Использование машинного обучения в статическом анализе исходного кода программ](https://pvs-studio.ru/ru/blog/posts/0706/)"\.