В последнее время мы усилили наше присутствие на различных профильных IT-конференциях в России и за рубежом. На большинстве мероприятий стараемся стоять со стендом, на некоторых выступаем с докладами. Конференции позволяют не только повысить узнаваемость нашего продукта (статический анализатор кода PVS-Studio), но и, главное, ближе познакомиться с потенциальными и действующими пользователями. Общаясь с посетителями на стенде, наши сотрудники часто отвечают на однотипные вопросы, которые иногда бывают довольно курьёзными. В данной статье я постараюсь ответить на наиболее часто задаваемые вопросы посетителей о статическом анализе вообще и PVS-Studio в частности.
Для начала немного юмора на тему «Ожидание и реальность». Мы пишем достаточно много статей и наивно полагаем, что если уж люди их читают, то они хотя бы в общих чертах знают о нашем продукте и его особенностях. К сожалению, это не всегда так. Вот пример реального общения с посетителем на одной из последних конференций. Посетитель: «Читаем ваши статьи на Хабре. Интересно. Жалко, что ваш анализатор нам совсем не подходит. У нас все исходники секретные, наружу мы их не можем отправлять. А у вас же там всё на облаке работает.»
Вероятно, нашему отделу маркетинга есть над чем поработать.
Далее я приведу другие распространённые вопросы от среднестатистического посетителя нашего стенда на выставке, а также ответы на них в формате импровизированного диалога.
Q: Что-то слышал про вас. Откуда вы, что делаете, и как узнать о вас подробнее?
A: Мы небольшая независимая команда из Тулы. Разрабатываем PVS-Studio — статический анализатор кода для языков C, C++, C#, Java. Подробнее о нас можно узнать на сайте PVS-Studio. Также мы пишем статьи и размещаем их в нашем блоге, на Хабре и других ресурсах.
Q: Что за статический анализ? В нашей команде нам вполне хватает предупреждений компилятора и совместных обзоров кода.
A: Компилятор способен указать только на грубые и довольно очевидные ошибки. Например, недостижимый код или использование неинициализированных переменных. Выявление ошибок для компилятора — побочная задача. Да, в последнее время компиляторы стали довольно интеллектуальными. Но любой специализированный инструмент для поиска ошибок в коде значительно превосходит компилятор, позволяя проводить детальный анализ кода и выявлять опечатки, логические ошибки, потенциальное использование нулевых указателей/ссылок и т.п.
Совместные обзоры кода — неплохая, проверенная временем технология. Но и она имеет недостатки, связанные с необходимостью привлечения дополнительных сотрудников к работе над чужим кодом. Это увеличивает стоимость разработки, при этом вероятность пропустить ошибку или добавить новую остаётся, так как человеку свойственно ошибаться.
Статический анализ — это проверка исходного кода программы без необходимости её выполнения. Мы рекомендуем использовать инструменты статического анализа кода как дополнительный барьер на пути ошибок.
Q: PVS-Studio анализирует исполняемые файлы или непосредственно исходный код?
A: Если говорить про поиск уязвимостей, то анализ исполняемого кода больше похож на то, как работает антивирус, выискивая в бинарном коде сигнатуры из некоторой базы данных.
PVS-Studio анализирует исходный код. Это позволяет выявлять намного больший круг ошибок и потенциальных уязвимостей, увеличивает скорость работы и даёт более достоверные результаты.
Да, конечно, можно пытаться дизассемблировать код и найти ошибку в алгоритме. Но надо понимать, что в бинарном коде очень много информации потеряно. Например, всегда истинное условие будет просто удалено при компиляции кода, и нет никакой возможности узнать, что с этим условием что-то было не в порядке.
Q: А какие возможности интеграции? Есть ли у вас плагины для каких-либо IDE?
A: В настоящее время PVS-Studio интегрируется в Visual Studio 2010-2017 в качестве плагина. Есть Java-плагин для IntelliJ IDEA. Также благодаря специализированному модулю вы можете управлять CMake проектами в Qt Creator и CLion.
Анализатор постоянно развивается, поэтому самую актуальную информацию о возможностях продукта вы можете узнать, посетив наш сайт.
Q: Мы используем SonarQube.
A: Отличный выбор. Плагин PVS-Studio для SonarQube позволит импортировать результаты анализа в SonarQube и работать с ними привычным образом.
Q: Хорошо, мне нужно как-то встроить анализ в нашу сборочную систему.
A: PVS-Studio можно использовать из командной строки. Анализатор содержит большой набор настроек для решения широкого круга задач. Также, независимо от сценария использования, мы оказываем помощь нашим клиентам на этапе внедрения анализатора и техническую поддержку во всё время действия лицензии.
Q: Как попробовать ваш анализатор?
A: Воспользоваться страницей загрузки, скачать необходимый дистрибутив и поработать с PVS-Studio в режиме триала. Если вам необходимо дополнительное время для оценки нашего продукта или вас не устраивают ограничения демонстрационной версии, свяжитесь с нами.
Также на выставках наши посетители могут получить Enterprise-ключ, срок действия которого — один месяц. Для этого просто приходите на наш стенд с единорогом. К тому же, вы можете стать участником лотереи и получить приз от PVS-Studio.
Q: Я студент, можно ли использовать PVS-Studio бесплатно?
A: Это возможно при условии добавления в ваш исходный код комментариев специального вида. Файлы, отмеченные таким образом, будут проверяться на наличие ошибок без каких-либо ограничений. Более подробно о данном режиме работы можно узнать из статьи "Как использовать PVS-Studio бесплатно".
Q: Кто ваши клиенты?
A: На данный момент нашими клиентами стали уже более 200 компаний по всему миру. Сфера их деятельности весьма разнообразна. Со списком действующих клиентов можно ознакомиться на нашем сайте.
Q: Так у вас есть локальный режим работы или нет?
A: Анализатор PVS-Studio устанавливается локально на выделенный компьютер (компьютеры) и может работать полностью изолированно. Подключение к интернету необходимо для получения обновлений, а также быстрого перехода по ссылкам на документацию (описание диагностик и т.п.) из плагинов. В настоящее время мы продумываем варианты работы через «облако», но это будет дополнение к стандартному режиму работы.
Q: А чем конкретно вы лучше, допустим, анализатора Coverity?
A: На данный вопрос невозможно дать простой и исчерпывающий ответ. Все наши попытки сравнения с другими анализаторами потерпели крах. Нас обвиняли в предвзятости, «накручивании» результатов, использовании специально подготовленной тестовой базы и прочих смертных грехах. К тому же, анализаторы нельзя просто сравнивать «в лоб». Каждый инструмент уникален и имеет свои сильные и слабые стороны. Одни инструменты делают упор на производительность, другие — сфокусированы на поиске «запахов» в коде и улучшении стилистики. Мы ищем ошибки и потенциальные уязвимости.
Если у вас есть желание и подходящая методология, вы можете провести исследование и сравнить наш анализатор с другими, а затем написать про это статью. Для этого мы даже выдадим вам временный лицензионный ключ без ограничений. Но будьте готовы к критике.
Q: Я не понял, так вы ищете ошибки только в некомпилируемом коде? То есть программа даже не прошла проверки компилятора?
A: Это не так. PVS-Studio ищет и находит ошибки только в скомпилированных программах. В реально действующих приложениях. Эти программы не просто компилируются без ошибок, некоторые из них проверяются другими анализаторами. И всё равно мы выискиваем там ошибки. Про это мы часто пишем статьи в нашем блоге, проверяя проекты с открытым кодом.
Q: А какие ошибки PVS-Studio сможет выявить в нашем проекте? Только опечатки?
A: Опечатки, конечно, относятся к классу классических ошибок, обнаруживаемых при статическом анализе. Но помимо этого, PVS-Studio потенциально может выявить еще несколько сотен паттернов ошибок. Примеры: разыменование нулевого указателя, деление на ноль, условие всегда ложно или истинно, некорректные операции с индексом, выход за границу массива и многие другие. Полный перечень ошибок приведен на странице документации.
Q: После проверки вашим анализатором я могу быть уверен, что программа не содержит ошибок?
A: Нет. PVS-Studio не является инструментом доказательства правильности программ. Это отдельный класс инструментов. Задача нашего анализатора — максимально быстро и достоверно указать на потенциальную ошибку в коде. Решение об ошибочности той или иной конструкции всегда принимает разработчик, используя контекст возникновения ошибки и свои знания о проекте. А анализатор помогает разработчику, по возможности сводя к минимуму число ложных срабатываний и предоставляя дополнительные возможности по обработке списка полученных предупреждений.
Q: Как именно работает PVS-Studio? Что за механизмы поиска ошибок? Наверное, вы используете регулярные выражения.
A: Использование регулярных выражений крайне неэффективно. Оно позволяет находить лишь самые примитивные ошибки, например, в условиях (сравнивают два одинаковых подвыражения):
if ((a+b+с) == (a+b+с)) {....}
При этом небольшое изменение кода (без изменения логики работы) с большой долей вероятности поставит такой анализатор в тупик:
if ((a+b+с) == (b+a+с)) {....}
Анализатор PVS-Studio гораздо интеллектуальнее и использует следующие механизмы:
- Сопоставление с шаблоном (pattern-based analysis) на базе абстрактного синтаксического дерева.
- Построение семантической модели с последующим выводом типов (type inference).
- Символьное выполнение (symbolic execution), позволяющее вычислять значения переменных, которые могут приводить к ошибкам, а также проверять диапазоны значений (range checking).
- Анализ потока данных (data-flow analysis).
- Аннотирование методов (method annotations).
Более подробно всё это описал мой коллега Андрей Карпов в недавней статье "Технологии, используемые в анализаторе кода PVS-Studio для поиска ошибок и потенциальных уязвимостей".
Q: Хорошо, у нас проект на С/С++, 15 лет разработки и пять миллионов строк кода. Нам реально начать использовать PVS-Studio сейчас?
A: Да. На этапе внедрения будет необходимо однократно провести полную проверку вашего проекта. Затем все полученные предупреждения (вероятно, их будет немало) можно отметить как пока неинтересные (временно подавить их вывод), чтобы вернуться к этому техническому долгу позже. После этого вы сможете использовать PVS-Studio для регулярной проверки только нового кода. Более подробно об этой и других возможностях анализатора можно узнать на странице документации.
Q: Как часто надо запускать проверку? И что, всю кодовую базу каждый раз проверять?
A: Наиболее эффективное использование статического анализа предполагает как можно более частые проверки нового кода. Для этого в PVS-Studio реализован режим инкрементального анализа. На проверку подаются файлы, в которые были внесены изменения с момента последней сборки проекта. Есть и другие режимы работы. Это позволяет выявлять ошибки уже на этапе разработки, что снижает риск их попадания в релиз.
Q: Мы используем PVS-Studio. Анализатор находит ошибки, но многие из них в неиспользуемом коде или тестах. Это нормально?
A: Вполне нормально. Одна из особенностей статического анализа, в отличие от динамического, проверка всей кодовой базы, а не только выполняемого при запуске кода. Допустим, вы потратили много времени и сил на отладку кода программы, и все работает стабильно. Но есть функция, которая редко используется, или вообще пока не используется. Вероятность нахождения ошибки в такой функции высока. И когда в один прекрасный момент функцию начнут использовать, что-то может пойти не так. Применение статического анализа позволит минимизировать риски возникновения такой ситуации.
Также в коде могут содержаться заведомо некорректные конструкции (обычно это бывает в тестах), поэтому часто их имеет смысл исключить из проверки (указав проекты или пути) через настройки PVS-Studio. Однако иногда сами тесты содержат ошибки. Такие ситуации достаточно сложно выявить, и в данном случае решение должен принимать разработчик.
Q: А как насчёт поиска уязвимостей?
A: Анализатор PVS-Studio является инструментом SAST (Static Application Security Testing) и позволяет выявлять потенциальные уязвимости, классифицируемые согласно CWE (Common Weakness Enumeration). Предупреждения CWE во многом пересекаются с классическими предупреждениями PVS-Studio. Подробнее про SAST вы можете узнать из документации. Важно понимать, что потенциальные уязвимости не обязательно приводят к реальным уязвимостям, которые могут быть использованы хакером. Выявленные уязвимости классифицируют по CVE (Common Vulnerabilities and Exposures). Тем не менее, устранение потенциальных уязвимостей однозначно способствует повышению безопасности программы и минимизирует риск выявления реальных уязвимостей в будущем.
Q: Я руковожу командой разработчиков. Как именно мне поможет использование PVS-Studio?
A: Помимо повышения качества и надёжности кода, внедрение PVS-Studio позволит решать и чисто управленческие задачи, связанные, например, с разделением ответственности. В состав поставки анализатора входит утилита BlameNotifier, которая позволяет автоматически определять сотрудников, которые отправили ошибочный код в систему контроля версий. При этом производится рассылка почтовых уведомлений как исполнителю, так и его руководителю.
Также вы можете настроить конвертацию отчётов об ошибках в любую удобную для вас форму, включая детализированный html-отчёт, удобный для использования руководителем.
Наконец, в случае применения SonarQube вы можете использовать все преимущества этого инструмента для обеспечения непрерывного контроля качества кода, выгружая в SonarQube результаты проверки проекта анализатором PVS-Studio при помощи специализированного плагина.
Q: Используете или планируете использовать машинное обучение?
A: Это большая и интересная тема. Мы планируем написать про это статью критического плана. Сейчас же озвучу только пару коротких мыслей.
Незачем делать калькулятор методом машинного обучения. Есть определённое правило (формула), и его надо применить к коду и сделать какой-то вывод. Непонятно, зачем настраивать нейронную сеть для выявления нового паттерна ошибки, когда эти паттерны уже существуют, и надо просто правильно их применить. И, главное, непонятно где взять базу для такого обучения. Где та выборка из сотен тысяч проектов с выписанными ошибками, на которых можно обучиться?
Единственное, где, на наш взгляд, может иметь смысл применение алгоритмов машинного обучения, это фильтрация ложных срабатываний.
Q: Проверяете ли вы код PVS-Studio при помощи PVS-Studio?
A: Конечно! Более того, в случае обнаружения ошибок, список виновных предаётся огласке с их последующим отлучением от холодильника с мороженым. А если серьёзно, мы считаем, что очень полезно применять собственный инструмент. Это позволяет взглянуть на продукт с точки зрения пользователя и заметить некоторые недостатки.
Q: Как получить ваши замечательные статусы для рабочего стола и брендированную шапку-ушанку?
A: Приходите на наш стенд с единорогом на ближайшей выставке, где мы будем присутствовать со стендом. Что-нибудь придумаем :)
Надеюсь, я сумел ответить на наиболее популярные вопросы посетителей наших стендов на выставках. Конечно, бывают и более сложные вопросы, для ответа на которые может потребоваться написание отдельной статьи.
При общении с посетителями мы стараемся донести главную мысль: статический анализ — не панацея от всех бед, но его использование очень полезно для здоровья (ваших программ). Используйте PVS-Studio и не болейте!
В заключение ещё раз приведу ряд полезных ссылок:
- Сайт PVS-Studio
- Попробовать PVS-Studio
- Купить PVS-Studio
- Как использовать PVS-Studio бесплатно
- Документация
- Поиск потенциальных уязвимостей
- Наш блог
- Обратная связь
Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Sergey Khrenov. Everything You Wanted to Know about PVS-Studio and Dared to Ask
Комментарии (23)
VAAKAraceGUM
26.11.2018 16:141. Скажите, пожалуйста, если у вас есть возможность бесплатного использования анализатора, тогда почему плагин для SonarQube идет только для коммерческого использования в то время как большинство Open Source проектов как раз его (SonarQube) и используют? Сама платформа SonarQube также бесплатна для использования. Где-то что-то не сходится.
2. Я так понимаю, что плагины для Intellij Idea это тоже только коммерческая фишка? Вы о нем уже говорите в 3-й статье, а в общем репозитории его не найти. А как же CLion и Rider?SvyatoslavMC
26.11.2018 17:26Ниже ответ на Ваши вопросы. Сложно отвечать на последние сообщение в списке :D
Andrey2008
27.11.2018 21:21По поводу 1.
Мы просто не думали про описанный Вами сценарий. Вы первый, кто обратил на это наше внимание. Возможно, мы поддержим такой вариант. А может и нет :).
Не очень понятно, зачем в академическом или индивидуальном проекте вдруг понадобилось одновременно использовать PVS-Studio и SonarQube, да ещё и в связке. Подозрительно это :). Точно ли коллектив, работающий над этим проектом, не должен купить коммерческую лицензию?
unsafePtr
27.11.2018 01:44Что интересно, есть бесплатный плагин от SonarQube — SonarLint. Недавно его опробовал, и в целом доволен, до этого я использовал Roslynator у которого довольно простые анализаторы. У PVS-Studio гораздо более сложные анализаторы, и это объяснят причину почему они предпочитают иметь stand-alone приложение для анализа. Это позволяет более тщательно проанализировать проект не нагружая основной процесс VS. Что касаеться лицинзий, то SonarLint находиться под лицинзией GPLv3, что позволяет его спокойно использовать в комерческих проектах с закрытым исходным кодом (поправьте если я ошибаюсь, не пробовал пока). PVS-Studio тоже можно бесплатно использовать но надо везде указывать комментарии. Честно говоря с удовольствием бы поставил PVS-Studio, но писать, или добавлять везде комментарии как по мне это слишком. Но это выбор разработчиков, и его надо уважать.
VAAKAraceGUM
27.11.2018 15:06Я тоже пользуюсь SonarLint, однако для CLion его нет, хотя при этом проект с c++ инспекциями есть, но пока у них даже в roadmap нет на CLion никаких планов. Также есть еще плагин для SonarQube под названием sonar-cxx, также бесплатный. Туда же можно подцепить coverity, cppcheck, facebook-infer и clang-tidy. Единственное неудобство доставляет PVS, который приходится запускать через скрипт и анализировать результаты отдельно)
SvyatoslavMC
27.11.2018 15:09+1Поясните, пожалуйста, неудобство PVS-Studio.
В сценариях интеграции PVS-Studio и Cppcheck в SonarQube нет разницы…
SvyatoslavMC
27.11.2018 15:12+1Также есть еще плагин для SonarQube под названием sonar-cxx, также бесплатный
Это языковой плагин, с которым PVS-Studio совместим. Нет проблемы накидать в C++ профиль диагностики от всех инструментов.
SvyatoslavMC
27.11.2018 16:56+1Ну и чтоб у Вас совсем не осталось вопросов и сомнений)
sonar.cxx.cppcheck.reportPath=build/cppcheck_report.xml
sonar.pvs-studio.reportPath=build/pvs-studio_report.xmlVAAKAraceGUM
27.11.2018 17:27Ну хорошо, для того, чтобы это работало надо иметь плагин sonar-pvs-studio-plugin, который Вы распространяете по коммерческой лицензии (это тут написано www.viva64.com/ru/m/0037). А если перейти к корневому комментарию, то об этом я Вам и сообщил)
SvyatoslavMC
26.11.2018 17:24Плагин для Intellij IDEA сейчас доступен только для участников тестирования предварительной версии анализатора. Но в дальнейшем он не будет иметь специфичных ограничений, как и плагин для Visual Studio. Плагины для других IDE будут разрабатываться постепенно. SonarQube Plugin и ещё рад компонентов являются, являются дополнительными опциями к коммерческим лицензиям, причём не ко всем.
finlandcoder
26.11.2018 18:40Хорошо бы Java, Scala, Kotlin. Тогда можно и с JB говорить о долгосрочном лицензировании и интеграции в их продукт.
unsafePtr
27.11.2018 01:46У JB есть большой опыт в использовании решарпера. По моему для них не проблема сделать подобный анализатор для других языков программирования
DelphiCowboy
27.11.2018 07:38PVS-Studio — статический анализатор кода для языков C, C++, C#, Java
Если продолжать линию C-подобных языков, то пора добавить Rust.EvgeniyRyzhkov
27.11.2018 13:03Напишите, пожалуйста, пять наиболее известных open source проектов на Rust, чтобы мы могли написать статьи про них.
PsyHaSTe
27.11.2018 13:23+2- https://github.com/rust-lang/rust
- https://github.com/serde-rs/serde + https://github.com/serde-rs/json
- https://github.com/paritytech/parity-ethereum
- https://github.com/rust-lang-nursery/chalk
- https://github.com/actix/actix-web (это который в бенчах в топ-3 все время светится)
- https://github.com/exonum/exonum
- https://github.com/Geal/nom
- … (пока хватит наверное)
А еще есть вот такой полезный ресурс: https://github.com/trending/rust?since=monthly
red75prim
27.11.2018 13:39+2Известность сложно оценить, но по-моему (и по статистике гитхаба) эти проекты достаточно известны
1. Компилятор Rust: github.com/rust-lang/rust
2. Servo (рендеринг веб-страниц): github.com/servo/servo
3. Tokio (асинхронный рантайм для Rust): github.com/tokio-rs/tokio
4. ripgrep (аналог grep): github.com/BurntSushi/ripgrep
5. Alacritty (эмулятор терминала): github.com/jwilm/alacritty
6. Amazon только что открыл код firecracker (виртуализация): github.com/firecracker-microvm/firecracker
Space__Elf
27.11.2018 16:24пять наиболее известных open source проектов на Rust, чтобы мы могли написать статьи про них
Буду ждать с нетерпением ваших статей!
VAAKAraceGUM
27.11.2018 15:09У Rust итак очень хороший статический анализ, предусмотренный его инфраструктурой и компилятором. Его разработчики в этом преуспели.
dmitriym09
27.11.2018 18:51А когда ближайшее мероприятие с вашим стендом? Есть ли где календарь?
Andrey2008
27.11.2018 19:18В этом году стендов уже нигде не будет. А последняя конференция в 2018 году, где мы примем участие, это Heisenbug. Я выступлю там с докладом.
В следующем году, скорее всего, мы будем стоять со стендами на таких конференциях как C++Russia, HighLoad++, CoreHard, TeamLead, SECR и т.д. Но пока определённости где и как мы участвуем нет.
P.S. Если Вы спрашиваете с целью раздобыть наши перекидные статусы для программистов или для тимлидов, или для тестеров, то как вариант, просто можете написать нам, мы вышлем сувенир по почте. :)
Filex
Планируются в ближайшем будущем статьи о применении анализатора к проектам написанным на Java?
Andrey2008
Да!