Хабрахабр

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

Picture 1

В последнее время мы усилили наше присутствие на различных профильных IT-конференциях в России и за рубежом. На большинстве мероприятий стараемся стоять со стендом, на некоторых выступаем с докладами. Конференции позволяют не только повысить узнаваемость нашего продукта (статический анализатор кода PVS-Studio), но и, главное, ближе познакомиться с потенциальными и действующими пользователями. Общаясь с посетителями на стенде, наши сотрудники часто отвечают на однотипные вопросы, которые иногда бывают довольно курьёзными. В данной статье я постараюсь ответить на наиболее часто задаваемые вопросы посетителей о статическом анализе вообще и PVS-Studio в частности.
Для начала немного юмора на тему «Ожидание и реальность». Мы пишем достаточно много статей и наивно полагаем, что если уж люди их читают, то они хотя бы в общих чертах знают о нашем продукте и его особенностях. К сожалению, это не всегда так. Вот пример реального общения с посетителем на одной из последних конференций. Посетитель: «Читаем ваши статьи на Хабре. Интересно. Жалко, что ваш анализатор нам совсем не подходит. У нас все исходники секретные, наружу мы их не можем отправлять. А у вас же там всё на облаке работает

Picture 4

Вероятно, нашему отделу маркетинга есть над чем поработать.

Далее я приведу другие распространённые вопросы от среднестатистического посетителя нашего стенда на выставке, а также ответы на них в формате импровизированного диалога.

Откуда вы, что делаете, и как узнать о вас подробнее? Q: Что-то слышал про вас.

Разрабатываем PVS-Studio — статический анализатор кода для языков C, C++, C#, Java. A: Мы небольшая независимая команда из Тулы. Также мы пишем статьи и размещаем их в нашем блоге, на Хабре и других ресурсах. Подробнее о нас можно узнать на сайте PVS-Studio.

В нашей команде нам вполне хватает предупреждений компилятора и совместных обзоров кода. Q: Что за статический анализ?

Например, недостижимый код или использование неинициализированных переменных. A: Компилятор способен указать только на грубые и довольно очевидные ошибки. Да, в последнее время компиляторы стали довольно интеллектуальными. Выявление ошибок для компилятора — побочная задача. Но любой специализированный инструмент для поиска ошибок в коде значительно превосходит компилятор, позволяя проводить детальный анализ кода и выявлять опечатки, логические ошибки, потенциальное использование нулевых указателей/ссылок и т.п.

Но и она имеет недостатки, связанные с необходимостью привлечения дополнительных сотрудников к работе над чужим кодом. Совместные обзоры кода — неплохая, проверенная временем технология. Это увеличивает стоимость разработки, при этом вероятность пропустить ошибку или добавить новую остаётся, так как человеку свойственно ошибаться.

Мы рекомендуем использовать инструменты статического анализа кода как дополнительный барьер на пути ошибок. Статический анализ — это проверка исходного кода программы без необходимости её выполнения.

Q: PVS-Studio анализирует исполняемые файлы или непосредственно исходный код?

A: Если говорить про поиск уязвимостей, то анализ исполняемого кода больше похож на то, как работает антивирус, выискивая в бинарном коде сигнатуры из некоторой базы данных.

Это позволяет выявлять намного больший круг ошибок и потенциальных уязвимостей, увеличивает скорость работы и даёт более достоверные результаты. PVS-Studio анализирует исходный код.

Но надо понимать, что в бинарном коде очень много информации потеряно. Да, конечно, можно пытаться дизассемблировать код и найти ошибку в алгоритме. Например, всегда истинное условие будет просто удалено при компиляции кода, и нет никакой возможности узнать, что с этим условием что-то было не в порядке.

Есть ли у вас плагины для каких-либо IDE? Q: А какие возможности интеграции?

Есть Java-плагин для IntelliJ IDEA. A: В настоящее время PVS-Studio интегрируется в Visual Studio 2010-2017 в качестве плагина. Также благодаря специализированному модулю вы можете управлять CMake проектами в Qt Creator и CLion.

Анализатор постоянно развивается, поэтому самую актуальную информацию о возможностях продукта вы можете узнать, посетив наш сайт.

Q: Мы используем SonarQube.

Плагин PVS-Studio для SonarQube позволит импортировать результаты анализа в SonarQube и работать с ними привычным образом. A: Отличный выбор.

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: Я не понял, так вы ищете ошибки только в некомпилируемом коде?

PVS-Studio ищет и находит ошибки только в скомпилированных программах. A: Это не так. Эти программы не просто компилируются без ошибок, некоторые из них проверяются другими анализаторами. В реально действующих приложениях. Про это мы часто пишем статьи в нашем блоге, проверяя проекты с открытым кодом. И всё равно мы выискиваем там ошибки.

Только опечатки? Q: А какие ошибки PVS-Studio сможет выявить в нашем проекте?

Но помимо этого, PVS-Studio потенциально может выявить еще несколько сотен паттернов ошибок. A: Опечатки, конечно, относятся к классу классических ошибок, обнаруживаемых при статическом анализе. Полный перечень ошибок приведен на странице документации. Примеры: разыменование нулевого указателя, деление на ноль, условие всегда ложно или истинно, некорректные операции с индексом, выход за границу массива и многие другие.

Q: После проверки вашим анализатором я могу быть уверен, что программа не содержит ошибок?

PVS-Studio не является инструментом доказательства правильности программ. A: Нет. Задача нашего анализатора — максимально быстро и достоверно указать на потенциальную ошибку в коде. Это отдельный класс инструментов. А анализатор помогает разработчику, по возможности сводя к минимуму число ложных срабатываний и предоставляя дополнительные возможности по обработке списка полученных предупреждений. Решение об ошибочности той или иной конструкции всегда принимает разработчик, используя контекст возникновения ошибки и свои знания о проекте.

Что за механизмы поиска ошибок? 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 для поиска ошибок и потенциальных уязвимостей".

Нам реально начать использовать PVS-Studio сейчас? Q: Хорошо, у нас проект на С/С++, 15 лет разработки и пять миллионов строк кода.

На этапе внедрения будет необходимо однократно провести полную проверку вашего проекта. A: Да. После этого вы сможете использовать PVS-Studio для регулярной проверки только нового кода. Затем все полученные предупреждения (вероятно, их будет немало) можно отметить как пока неинтересные (временно подавить их вывод), чтобы вернуться к этому техническому долгу позже. Более подробно об этой и других возможностях анализатора можно узнать на странице документации.

И что, всю кодовую базу каждый раз проверять? Q: Как часто надо запускать проверку?

Для этого в PVS-Studio реализован режим инкрементального анализа. A: Наиболее эффективное использование статического анализа предполагает как можно более частые проверки нового кода. Есть и другие режимы работы. На проверку подаются файлы, в которые были внесены изменения с момента последней сборки проекта. Это позволяет выявлять ошибки уже на этапе разработки, что снижает риск их попадания в релиз.

Анализатор находит ошибки, но многие из них в неиспользуемом коде или тестах. Q: Мы используем PVS-Studio. Это нормально?

Одна из особенностей статического анализа, в отличие от динамического, проверка всей кодовой базы, а не только выполняемого при запуске кода. A: Вполне нормально. Но есть функция, которая редко используется, или вообще пока не используется. Допустим, вы потратили много времени и сил на отладку кода программы, и все работает стабильно. И когда в один прекрасный момент функцию начнут использовать, что-то может пойти не так. Вероятность нахождения ошибки в такой функции высока. Применение статического анализа позволит минимизировать риски возникновения такой ситуации.

Однако иногда сами тесты содержат ошибки. Также в коде могут содержаться заведомо некорректные конструкции (обычно это бывает в тестах), поэтому часто их имеет смысл исключить из проверки (указав проекты или пути) через настройки PVS-Studio. Такие ситуации достаточно сложно выявить, и в данном случае решение должен принимать разработчик.

Q: А как насчёт поиска уязвимостей?

Предупреждения CWE во многом пересекаются с классическими предупреждениями PVS-Studio. A: Анализатор PVS-Studio является инструментом SAST (Static Application Security Testing) и позволяет выявлять потенциальные уязвимости, классифицируемые согласно CWE (Common Weakness Enumeration). Важно понимать, что потенциальные уязвимости не обязательно приводят к реальным уязвимостям, которые могут быть использованы хакером. Подробнее про SAST вы можете узнать из документации. Тем не менее, устранение потенциальных уязвимостей однозначно способствует повышению безопасности программы и минимизирует риск выявления реальных уязвимостей в будущем. Выявленные уязвимости классифицируют по CVE (Common Vulnerabilities and Exposures).

Как именно мне поможет использование PVS-Studio? Q: Я руковожу командой разработчиков.

В состав поставки анализатора входит утилита BlameNotifier, которая позволяет автоматически определять сотрудников, которые отправили ошибочный код в систему контроля версий. A: Помимо повышения качества и надёжности кода, внедрение PVS-Studio позволит решать и чисто управленческие задачи, связанные, например, с разделением ответственности. При этом производится рассылка почтовых уведомлений как исполнителю, так и его руководителю.

Также вы можете настроить конвертацию отчётов об ошибках в любую удобную для вас форму, включая детализированный html-отчёт, удобный для использования руководителем.

Наконец, в случае применения SonarQube вы можете использовать все преимущества этого инструмента для обеспечения непрерывного контроля качества кода, выгружая в SonarQube результаты проверки проекта анализатором PVS-Studio при помощи специализированного плагина.

Q: Используете или планируете использовать машинное обучение?

Мы планируем написать про это статью критического плана. A: Это большая и интересная тема. Сейчас же озвучу только пару коротких мыслей.

Есть определённое правило (формула), и его надо применить к коду и сделать какой-то вывод. Незачем делать калькулятор методом машинного обучения. И, главное, непонятно где взять базу для такого обучения. Непонятно, зачем настраивать нейронную сеть для выявления нового паттерна ошибки, когда эти паттерны уже существуют, и надо просто правильно их применить. Где та выборка из сотен тысяч проектов с выписанными ошибками, на которых можно обучиться?

Единственное, где, на наш взгляд, может иметь смысл применение алгоритмов машинного обучения, это фильтрация ложных срабатываний.

Q: Проверяете ли вы код PVS-Studio при помощи PVS-Studio?

Более того, в случае обнаружения ошибок, список виновных предаётся огласке с их последующим отлучением от холодильника с мороженым. A: Конечно! Это позволяет взглянуть на продукт с точки зрения пользователя и заметить некоторые недостатки. А если серьёзно, мы считаем, что очень полезно применять собственный инструмент.

Q: Как получить ваши замечательные статусы для рабочего стола и брендированную шапку-ушанку?

Что-нибудь придумаем 🙂 A: Приходите на наш стенд с единорогом на ближайшей выставке, где мы будем присутствовать со стендом.

Picture 2

Надеюсь, я сумел ответить на наиболее популярные вопросы посетителей наших стендов на выставках. Конечно, бывают и более сложные вопросы, для ответа на которые может потребоваться написание отдельной статьи.

Используйте PVS-Studio и не болейте! При общении с посетителями мы стараемся донести главную мысль: статический анализ — не панацея от всех бед, но его использование очень полезно для здоровья (ваших программ).

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

Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Sergey Khrenov. Everything You Wanted to Know about PVS-Studio and Dared to Ask

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть