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

    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
    PVS-Studio
    640,00
    Static Code Analysis for C, C++, C# and Java
    Поделиться публикацией

    Комментарии 24

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

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

          Не очень понятно, зачем в академическом или индивидуальном проекте вдруг понадобилось одновременно использовать PVS-Studio и SonarQube, да ещё и в связке. Подозрительно это :). Точно ли коллектив, работающий над этим проектом, не должен купить коммерческую лицензию?
            +1
            Что интересно, есть бесплатный плагин от SonarQube — SonarLint. Недавно его опробовал, и в целом доволен, до этого я использовал Roslynator у которого довольно простые анализаторы. У PVS-Studio гораздо более сложные анализаторы, и это объяснят причину почему они предпочитают иметь stand-alone приложение для анализа. Это позволяет более тщательно проанализировать проект не нагружая основной процесс VS. Что касаеться лицинзий, то SonarLint находиться под лицинзией GPLv3, что позволяет его спокойно использовать в комерческих проектах с закрытым исходным кодом (поправьте если я ошибаюсь, не пробовал пока). PVS-Studio тоже можно бесплатно использовать но надо везде указывать комментарии. Честно говоря с удовольствием бы поставил PVS-Studio, но писать, или добавлять везде комментарии как по мне это слишком. Но это выбор разработчиков, и его надо уважать.
              0
              Я тоже пользуюсь SonarLint, однако для CLion его нет, хотя при этом проект с c++ инспекциями есть, но пока у них даже в roadmap нет на CLion никаких планов. Также есть еще плагин для SonarQube под названием sonar-cxx, также бесплатный. Туда же можно подцепить coverity, cppcheck, facebook-infer и clang-tidy. Единственное неудобство доставляет PVS, который приходится запускать через скрипт и анализировать результаты отдельно)
                +2
                Поясните, пожалуйста, неудобство PVS-Studio.

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

                    sonar.cxx.cppcheck.reportPath=build/cppcheck_report.xml
                    sonar.pvs-studio.reportPath=build/pvs-studio_report.xml
                      0
                      Ну хорошо, для того, чтобы это работало надо иметь плагин sonar-pvs-studio-plugin, который Вы распространяете по коммерческой лицензии (это тут написано www.viva64.com/ru/m/0037). А если перейти к корневому комментарию, то об этом я Вам и сообщил)
                0
                Плагин для Intellij IDEA сейчас доступен только для участников тестирования предварительной версии анализатора. Но в дальнейшем он не будет иметь специфичных ограничений, как и плагин для Visual Studio. Плагины для других IDE будут разрабатываться постепенно. SonarQube Plugin и ещё рад компонентов являются, являются дополнительными опциями к коммерческим лицензиям, причём не ко всем.
                  0
                  Хорошо бы Java, Scala, Kotlin. Тогда можно и с JB говорить о долгосрочном лицензировании и интеграции в их продукт.
                    +1
                    У JB есть большой опыт в использовании решарпера. По моему для них не проблема сделать подобный анализатор для других языков программирования
                    +1
                    PVS-Studio — статический анализатор кода для языков C, C++, C#, Java

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

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

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

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

                      P.S. Если Вы спрашиваете с целью раздобыть наши перекидные статусы для программистов или для тимлидов, или для тестеров, то как вариант, просто можете написать нам, мы вышлем сувенир по почте. :)
                        +1
                        Кстати, прорисовывается картина того, где можно нас будет повстречать в 2019 году. Как минимум, мы будем стоять со стендом здесь:
                        • C++ Siberia, 14-16 февраля, Новосибирск, siberia-2019.cppug.ru
                        • TeamLead Conf, 25-26 февраля, Москва, teamleadconf.ru/moscow/2019
                        • AgileDays, 21-22 марта, Москва, Центр Международной Торговли, agiledays.ru
                        • CodeFest X, 30-31 марта, Новосибирск, Экспоцентр, 2019.codefest.ru
                        • JPoint, 5-6 апреля, Москва, Конгресс-центр ЦМТ, Краснопресненская наб., 12, 4й подъезд, jpoint.ru
                        • Saint HighLoad++, 8 и 9 апреля, Санкт-Петербург, Park Inn Пулковская, www.highload.ru/spb/2019
                        • ProductSense, 15-16 апреля, Москва, Radisson Славянская пл. Европы, 2, Москва, 121059 (м. Киевская), productsense.io
                        • C++Russia, 19-20 апреля, Москва, Кутузовский просп., 2/1, стр. 1, Конгресс-парк гостиницы «Рэдиссон Ройал Москва», cppconf.ru
                        • DotNext 2019 Piter, 15-16 мая, г. Санкт-Петербург, гостиница «Park Inn by Radisson Пулковская», площадь Победы, 1, dotnext-piter.ru
                        • Positive Hack Days, 21–22 мая, Москва, www.phdays.com/ru
                        • Saint TeamLead Conf, 23-24 сентября, г. Санкт-Петербург, пл. Победы, д.1, гостиница «Park Inn Пулковская»
                        • C++ Conf, 11 октября, Москва, 1-й Зачатьевский пер., 4, «Инфопространство»
                        • Joker 2019, октябрь 2019, г. Санкт-Петербург, Петербургское шоссе, 64/1, Экспофорум
                        • DotNext 2019 Moscow, ноябрь 2019, г. Москва, Кутузовский просп., 2/1, стр. 1, Конгресс-парк гостиницы «Рэдиссон Ройал Москва»
                        Приходите, пообщаемся, задарим сувениры. Плюс будет кое-что новое, чего небыло раньше.

                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                    Самое читаемое