Picture 1

В последнее время мы усилили наше присутствие на различных профильных IT-конференциях в России и за рубежом. На большинстве мероприятий стараемся стоять со стендом, на некоторых выступаем с докладами. Конференции позволяют не только повысить узнаваемость нашего продукта (статический анализатор кода PVS-Studio), но и, главное, ближе познакомиться с потенциальными и действующими пользователями. Общаясь с посетителями на стенде, наши сотрудники часто отвечают на однотипные вопросы, которые иногда бывают довольно курьёзными. В данной статье я постараюсь ответить на наиболее часто задаваемые вопросы посетителей о статическом анализе вообще и PVS-Studio в частности.

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

Picture 4

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

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

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: Приходите на наш стенд с единорогом на ближайшей выставке, где мы будем присутствовать со стендом. Что-нибудь придумаем :)

Picture 2

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

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

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



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

Комментарии (23)


  1. Filex
    26.11.2018 14:04
    +2

    Планируются в ближайшем будущем статьи о применении анализатора к проектам написанным на Java?


    1. Andrey2008
      26.11.2018 14:36
      +2

      Да!


  1. VAAKAraceGUM
    26.11.2018 16:14

    1. Скажите, пожалуйста, если у вас есть возможность бесплатного использования анализатора, тогда почему плагин для SonarQube идет только для коммерческого использования в то время как большинство Open Source проектов как раз его (SonarQube) и используют? Сама платформа SonarQube также бесплатна для использования. Где-то что-то не сходится.
    2. Я так понимаю, что плагины для Intellij Idea это тоже только коммерческая фишка? Вы о нем уже говорите в 3-й статье, а в общем репозитории его не найти. А как же CLion и Rider?


    1. SvyatoslavMC
      26.11.2018 17:26

      Ниже ответ на Ваши вопросы. Сложно отвечать на последние сообщение в списке :D


    1. Andrey2008
      27.11.2018 21:21

      По поводу 1.

      Мы просто не думали про описанный Вами сценарий. Вы первый, кто обратил на это наше внимание. Возможно, мы поддержим такой вариант. А может и нет :).

      Не очень понятно, зачем в академическом или индивидуальном проекте вдруг понадобилось одновременно использовать PVS-Studio и SonarQube, да ещё и в связке. Подозрительно это :). Точно ли коллектив, работающий над этим проектом, не должен купить коммерческую лицензию?


    1. unsafePtr
      27.11.2018 01:44

      Что интересно, есть бесплатный плагин от SonarQube — SonarLint. Недавно его опробовал, и в целом доволен, до этого я использовал Roslynator у которого довольно простые анализаторы. У PVS-Studio гораздо более сложные анализаторы, и это объяснят причину почему они предпочитают иметь stand-alone приложение для анализа. Это позволяет более тщательно проанализировать проект не нагружая основной процесс VS. Что касаеться лицинзий, то SonarLint находиться под лицинзией GPLv3, что позволяет его спокойно использовать в комерческих проектах с закрытым исходным кодом (поправьте если я ошибаюсь, не пробовал пока). PVS-Studio тоже можно бесплатно использовать но надо везде указывать комментарии. Честно говоря с удовольствием бы поставил PVS-Studio, но писать, или добавлять везде комментарии как по мне это слишком. Но это выбор разработчиков, и его надо уважать.


      1. VAAKAraceGUM
        27.11.2018 15:06

        Я тоже пользуюсь SonarLint, однако для CLion его нет, хотя при этом проект с c++ инспекциями есть, но пока у них даже в roadmap нет на CLion никаких планов. Также есть еще плагин для SonarQube под названием sonar-cxx, также бесплатный. Туда же можно подцепить coverity, cppcheck, facebook-infer и clang-tidy. Единственное неудобство доставляет PVS, который приходится запускать через скрипт и анализировать результаты отдельно)


        1. SvyatoslavMC
          27.11.2018 15:09
          +1

          Поясните, пожалуйста, неудобство PVS-Studio.

          В сценариях интеграции PVS-Studio и Cppcheck в SonarQube нет разницы…


        1. SvyatoslavMC
          27.11.2018 15:12
          +1

          Также есть еще плагин для SonarQube под названием sonar-cxx, также бесплатный
          Это языковой плагин, с которым PVS-Studio совместим. Нет проблемы накидать в C++ профиль диагностики от всех инструментов.


        1. SvyatoslavMC
          27.11.2018 16:56
          +1

          Ну и чтоб у Вас совсем не осталось вопросов и сомнений)

          sonar.cxx.cppcheck.reportPath=build/cppcheck_report.xml
          sonar.pvs-studio.reportPath=build/pvs-studio_report.xml


          1. VAAKAraceGUM
            27.11.2018 17:27

            Ну хорошо, для того, чтобы это работало надо иметь плагин sonar-pvs-studio-plugin, который Вы распространяете по коммерческой лицензии (это тут написано www.viva64.com/ru/m/0037). А если перейти к корневому комментарию, то об этом я Вам и сообщил)


  1. SvyatoslavMC
    26.11.2018 17:24

    Плагин для Intellij IDEA сейчас доступен только для участников тестирования предварительной версии анализатора. Но в дальнейшем он не будет иметь специфичных ограничений, как и плагин для Visual Studio. Плагины для других IDE будут разрабатываться постепенно. SonarQube Plugin и ещё рад компонентов являются, являются дополнительными опциями к коммерческим лицензиям, причём не ко всем.


  1. finlandcoder
    26.11.2018 18:40

    Хорошо бы Java, Scala, Kotlin. Тогда можно и с JB говорить о долгосрочном лицензировании и интеграции в их продукт.


    1. unsafePtr
      27.11.2018 01:46

      У JB есть большой опыт в использовании решарпера. По моему для них не проблема сделать подобный анализатор для других языков программирования


  1. DelphiCowboy
    27.11.2018 07:38

    PVS-Studio — статический анализатор кода для языков C, C++, C#, Java

    Если продолжать линию C-подобных языков, то пора добавить Rust.


    1. EvgeniyRyzhkov
      27.11.2018 13:03

      Напишите, пожалуйста, пять наиболее известных open source проектов на Rust, чтобы мы могли написать статьи про них.



      1. 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


      1. Space__Elf
        27.11.2018 16:24

        пять наиболее известных open source проектов на Rust, чтобы мы могли написать статьи про них

        Буду ждать с нетерпением ваших статей!


    1. VAAKAraceGUM
      27.11.2018 15:09

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


  1. dmitriym09
    27.11.2018 18:51

    А когда ближайшее мероприятие с вашим стендом? Есть ли где календарь?


    1. Andrey2008
      27.11.2018 19:18

      В этом году стендов уже нигде не будет. А последняя конференция в 2018 году, где мы примем участие, это Heisenbug. Я выступлю там с докладом.

      В следующем году, скорее всего, мы будем стоять со стендами на таких конференциях как C++Russia, HighLoad++, CoreHard, TeamLead, SECR и т.д. Но пока определённости где и как мы участвуем нет.

      P.S. Если Вы спрашиваете с целью раздобыть наши перекидные статусы для программистов или для тимлидов, или для тестеров, то как вариант, просто можете написать нам, мы вышлем сувенир по почте. :)


  1. valdemartorch
    28.11.2018 09:51
    -1

    Как зовут вашего маскота и почему пони с рогом и без трусов?