Всё, что вы хотели знать о PVS-Studio и не постеснялись спросить
В последнее время мы усилили наше присутствие на различных профильных 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 и не болейте!
В заключение ещё раз приведу ряд полезных ссылок:
Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Sergey Khrenov. Everything You Wanted to Know about PVS-Studio and Dared to Ask