>
>
Всё, что вы хотели знать о PVS-Studio и…

Сергей Хренов
Статей: 39

Всё, что вы хотели знать о 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 и не болейте!

В заключение ещё раз приведу ряд полезных ссылок: