PVS-Studio C#\Java\C++Сегодня важный день – после 28 релизов шестой версии мы выпускаем PVS-Studio 7.00, где ключевым новшеством является поддержка языка Java. Однако за 2018 год накопилось много других важных изменений, касающихся С++, С#, инфраструктуры и поддержки стандартов кодирования. Поэтому предлагаем вашему вниманию заметку, которая обобщает основные изменения, произошедшие в PVS-Studio за последнее время.

PVS-Studio — это инструмент для выявления ошибок и потенциальных уязвимостей в исходном коде программ, написанных на языках С, C++, C# и Java. Работает в среде Windows, Linux и macOS.

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

Начнём мы с изменения, из-за которого, собственно, и было решено сменить номер версии с 6.x на 7.x. Это поддержка в анализаторе языка Java, к которому мы давно готовились.

Java


Самое важное в Java анализаторе то, что он появился :). Приглашаем Java разработчиков скачать инструмент и проверить проекты, над которыми они работают.

Мы сделали доступными для пользователей самые популярные способы интеграции анализатора в сборочную систему:

  • Плагин для Maven.
  • Плагин для Gradle.
  • Плагин для IntelliJ IDEA.

В случае использования самописных сборочных систем имеется возможность запускать анализатор напрямую, перечислив исходники и classpath.

Подробную информацию о всех способах запуска анализатора вы можете найти на странице документации "Как запустить PVS-Studio Java".

Мы не могли обойти стороной платформу контроля качества кода SonarQube, так популярную среди Java разработчиков, поэтому добавили поддержку языка Java в наш плагин для SonarQube.

C, C++


В 2018 году наша команда активно поработала над развитием C++ анализатора. Появилось много новых диагностик, а также усовершенствованы алгоритмы, позволяющие собирать и обрабатывать информацию, извлекаемую из синтаксического дерева.

CWE, CERT

Сообщения C++ анализатора (как и C# анализатора) были классифицированы согласно Common Weakness Enumeration (CWE). CWE — это система классификации потенциальных и подтверждённых уязвимостей. Она поддерживается сообществом с целью выявления проблем программного обеспечения и создания автоматизированных инструментов, которые могут использоваться для выявления и устранения этих проблем.

Дополнительно сообщения были классифицированы согласно CERT C Coding Standard и CERT C++ Coding Standard. SEI CERT Coding Standards — это набор стандартов написания программного обеспечения (ПО) на языках C, C++, Java и Perl, разрабатываемых координационным центром CERT (CERT Coordination Center, CERT/CC) для повышения надёжности и безопасности ПО.

Классификация C и C++ диагностик согласно этим предупреждениям позволяет использовать PVS-Studio как SAST решение.

MISRA

В 2018 году статический анализатор кода PVS-Studio начал классифицировать свои предупреждения согласно стандартам MISRA C и MISRA C++. Благодаря поддержке этих стандартов анализатор стало возможным эффективно использовать для улучшения безопасности, переносимости и надежности программ для встраиваемых систем.

Подробнее: "PVS-Studio: поддержка стандартов кодирования MISRA C и MISRA C++".

Поддержка MISRA стала актуальной в связи с развитием в анализаторе поддержки различных embedded систем, о чём будет рассказано в следующем разделе статьи.

Embedded Development

В 2018 году в анализаторе PVS-Studio были поддержаны:

  • Windows. IAR Embedded Workbench, C/C++ Compiler for ARM C, C++
  • Windows/Linux. Keil µVision, DS-MDK, ARM Compiler 5/6 C, C++
  • Windows/Linux. Texas Instruments Code Composer Studio, ARM Code Generation Tools C, C++
  • Windows/Linux/macOS. GNU Arm Embedded Toolchain, Arm Embedded GCC compiler, C, C++

Две заметки на тему поддержки embedded систем:

  1. Статический анализатор кода PVS-Studio 6.22 адаптирован для ARM-компиляторов (Keil, IAR).
  2. В PVS-Studio появилась поддержка GNU Arm Embedded Toolchain.

Расширение пользовательских аннотаций

Иногда в проектах используются собственные реализации разных системных функций, например, memcpy, malloc и т.п. Анализатор очень хорошо умеет искать ошибки с использованием стандартных функций, но в пользовательском коде было невозможно применять такие алгоритмы до недавнего времени. Теперь с помощью аннотации V_FUNC_ALIAS вы можете ставить имена своих функций в соответствие системным.

Формат комментария:

//V_FUNC_ALIAS, implementation:sysf, function:f, namespace:ns, class:c

  • Ключ implementation — задает имя стандартной функции, для которой определяется псевдоним.
  • Ключ function — задает имя псевдонима. Сигнатура функции, имя которой указано в этом ключе, должна совпадать с сигнатурой функции, указанной в ключе implementation.
  • Ключ class — имя класса. Может отсутствовать.
  • Ключ namespace — имя пространства имен. Может отсутствовать.

Рассмотрим пример:

//V_FUNC_ALIAS, implementation:memcpy, function:MyMemCpy

Теперь анализатор будет обрабатывать вызовы функции MyMemCpy так же, как вызовы memcpy. Например, на такой код будет выдаваться предупреждение V512:

int buf[] = { 1, 2, 3, 4 };
int out[2];
MyMemCpy (out, buf, 4 * sizeof(int)); // Warning!

C#


В этом году существенных изменений C# анализатора не было. Были отдельные улучшения диагностик и правки недочётов. Сообщения C# анализатора, как и C++ анализатора были классифицированы согласно Common Weakness Enumeration (CWE). Соответствие C# диагностик с идентификаторами CWE приведены здесь (см. диагностики с номерами 3xxx).

Мы планируем вернуться к более активному развитию C# анализатора в 2019 году. Планируется разработка новых диагностик и усовершенствование механизма анализа потока данных (Data-Flow Analysis).

Конвертеры отчётов


Утилиты PlogConverter.exe и plog-converter входят в дистрибутивы PVS-Studio для Windows и Linux/macOS соответственно. Также исходных код этих утилит доступен на GitHub.

С появлением PVS-Studio для Java мы переработали подсветку кода для C, C++, C# и добавили Java в формате FullHtml (для веб-браузера).

Также для отчёта в этом формате был добавлен столбец MISRA:

PVS-Studio, MISRA

Как и CWE ID, столбец MISRA является опциональным и включается исследователями безопасности кода при изучении результатов анализа.

Плагины SonarQube


1. Полное обновление

Мы переписали наши плагины с использованием нового API. Это позволило добавить новый функционал и обеспечить совместимость с SonarQube 7.x. Минимальной поддерживаемый версией теперь является SonarQube 6.7 LTS.

2. PVS-Studio для Java

В новую версию плагинов добавлена поддержка диагностик для языка Java. Теперь вы можете добавить PVS-Studio к другим инструментам контроля качества своего Java-проекта.

3. Стандарт MISRA

Недавно мы объявляли о поддержке стандартов MISRA C и MISRA C++. В новых плагинах тоже появилась их поддержка. Например, был добавлен параметр (в дополнение к CWE):

sonar.pvs-studio.misra=active

который включает добавление идентификатора MISRA к предупреждениям анализатора:

MISRA


Независимо от этого параметра будет доступен поиск по тегам misra и pvs-studio#misra в результатах анализа. Информация о количестве найденных предупреждений MISRA добавилась и в метрики, о которых пойдёт речь далее.

4. Новые метрики

В меню Projects -> Your Project -> Measures доступны различные метрики кода, среди которых теперь есть различная информация от PVS-Studio:

SonarQube


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

4. Multiline-переходы

Некоторые диагностики анализатора выдают предупреждения на несколько строчек файла. Иногда они находятся очень далеко друг от друга. В новой версии мы добавили multiline-переходы:

SonarQube


SonarQube также поддерживает переходы между разными файлами. Позже мы добавим и такие переходы для диагностик, в которых есть межмодульный анализ.

6. Документация

Документация претерпела большие изменения. PVS-Studio является кросс-платформенным и мультиязыковым продуктом, поэтому все переработки были направлены на написание более общих и понятных инструкций по работе на той или иной системе.

SAST


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

PVS-Studio является средством статического тестирования защищённости приложений (Static Application Security Testing, SAST). Другими словами, анализатор PVS-Studio выявляет не только опечатки, мёртвый код и другие ошибки, но и потенциальные уязвимости.

Для удобства специалистов, которые будут использовать PVS-Studio как SAST инструмент, анализатор отображает свои предупреждения на Common Weakness Enumeration, SEI CERT Coding Standards. Таблицы соответствий диагностик PVS-Studio различным стандартам:

  1. Соответствие CWE
  2. Соответствие SEI CERT

Более подробно данная тема раскрыта в статье "PVS-Studio как SAST решение".

Также предлагаем познакомиться с публикациями:

  1. Как PVS-Studio может помочь в поиске уязвимостей?
  2. Стреляем в ногу, обрабатывая входные данные.
  3. Предоставляем анализатор PVS-Studio экспертам безопасности.

PVS-Studio Free


В канун празднования нового 2019 года команда PVS-Studio решила сделать приятный подарок всем контрибьюторам open-source проектов, хостящихся на GitHub или Bitbucket. Им предоставляется возможность бесплатного использования статического анализатора PVS-Studio для развития открытых проектов.

Подробности: "Бесплатный PVS-Studio для тех, кто развивает открытые проекты".

macOS


В 2018 году PVS-Studio научился работать под управлением macOS. К этому событию наша команда приурочила проверку XNU Kernel: "Релиз PVS-Studio для macOS: 64 weaknesses в Apple XNU Kernel".

XNU — это ядро компьютерных операционных систем, разрабатываемое компанией Apple и используемое в ОС семейства OS X (macOS, iOS, tvOS, watchOS).



Если хотите поделиться этой статьей с англоязычной аудиторией, то прошу использовать ссылку на перевод: Andrey Karpov, Svyatoslav Razmyslov. PVS-Studio 7.00.

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


  1. staticmain
    16.01.2019 14:18

    Эта штука по прежнему нацелена только на мегакорпорации и стоит 250 000+ рублей в год на одного разработчика?


    1. Andrey2008 Автор
      16.01.2019 14:37

      PVS-Studio лицензируется на команду разработчиков. Нет цены «для одного разработчика» :). Как вариант, для индивидуальных проектов можно воспользоваться одним из бесплатных вариантов лицензирования (вариант 1, вариант 2).


      1. staticmain
        16.01.2019 14:41

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

        Сейчас ваш продукт (даже если считать не «для одного разработчика») стоит как новый сотрудник, который может с 8 до 17 непрерывно анализировать код и еще и попутно выяснять у разработчиков что они имели в виду конкретно в этом месте.


        1. MonkAlex
          16.01.2019 14:42
          +1

          Таки как раз в человека, который этим будет заниматься, я верю слабо.
          Потому что тупые вещи пропускаются на ура.


        1. Andrey2008 Автор
          16.01.2019 14:47

          PVS-Studio ROI: как не терять миллионы.

          Аннотация
          Время от времени нам задают вопрос, какую пользу в денежном эквиваленте получит компания от использования анализатора PVS-Studio. Я решил реализовать на сайте ROI-калькулятор и разместить подробное описание принципов его работы. Но прежде я решил вынести свои мысли и расчёты на обсуждение. Я надеюсь получить интересные и полезные комментарии, которые помогут сделать калькулятор как можно более достоверным и убедительным.


          1. staticmain
            16.01.2019 15:02
            -2

            Не поленился, залез в статью, поиграл с калькулятором. У нас в низкоуровневой команде 3 человека (сама компания сверху пишет на скала большим кол-вом сотрудников). Верхний край средней зп программиста в наших краях 50 000

            Обозначим месячную зарплату программиста как S.
            Количество программистов в команде обозначим как N.
            Формула для скептика: N * (S / 160) * 2.66 * 104


            3 * (50 000 / 168) * 2.66 * 104 = 247 000

            Однако по вашим таблицам можно реверснуть цену, при которой зона зеленеет (цену, которую вы предлагаете таким компаниям):

            MAX(RED) = 877 500
            MIN(GREEN) = 1 037 400
            Т.е. реальная цена, предлагаемая для компаний (уже) колеблется где-то между 880 000 р и 1 000 000 р.

            В таких условиях PVS будет окупаться 3.5 года. И мы такие не одни. Все компании, которые работают вне столицы делают это *умышленно*, чтобы минимизировать расходы (разница зарплат 5-10 раз).


            1. Andrey2008 Автор
              16.01.2019 15:12

              Да, PVS-Studio не ориентирован на маленькие низкооплачиваемые команды и арифметика не сходится. В Германии, например, средний заработок программистов: 56 – 93 тыс. евро в год и арифметика сходится. Всё OK :)


              1. staticmain
                16.01.2019 15:17

                В Германии, например, средний заработок программистов: 56 – 93 тыс. евро в год и арифметика сходится. Всё OK


                А зачем тогда вы рекламируете продукт в России? Езжайте в Германию, там зарплаты выше, больше «покупателей».


                1. Andrey2008 Автор
                  16.01.2019 15:27

                  В России есть много взрослых компаний с взрослыми зарплатами. И количество российских клиентов уверенно растёт.


                1. duodvk
                  18.01.2019 13:21
                  +1

                  Давайте вообще всех толковых людей из страны выгоним, что уж… мало ведь их уже уехало и ещё видимо уедет.


            1. dmitry_dvm
              17.01.2019 00:36

              Интересная логика. Либо руководство такой компании просто обирает сотрудников в свой карман, получая рыночную прибыль. Либо демпингует. И то и другое плохо. Вопрос — нафига работать в таких шарагах, где тебе платят в разы меньше, чем стоят твои знания и мотивируют тем, что у тебя дела расходы на жилье меньше?


              1. semmaxim
                18.01.2019 07:55

                Потому что переехать в большой город по тем или иным причинам невозможно?


                1. EvgeniyRyzhkov
                  18.01.2019 08:23
                  +1

                  Согласитесь правда, что PVS-Studio здесь не виноват? :-)


            1. VolodjaT
              17.01.2019 09:17

              это в какой глуши такие низкие ЗП.
              Он в Украине типичная зп синьйора в переводе на рубли будет 180-200 тыс. и это далеко не потолок


        1. Maccimo
          17.01.2019 04:23

          Рабочий день программиста с 8 утра?
          Зачем работать в таких неадекватных конторах?


          1. Cerberuser
            17.01.2019 04:47

            С 9 до 18 — принципиально лучше?


            1. Maccimo
              17.01.2019 06:32

              Если говорить о принципиально лучших вариантах, то это будет что-то навроде «восьмичасовой рабочий день, начало рабочего дня в диапазоне 8-12, по согласованию с непосредственным руководителем».


          1. Papashkin
            17.01.2019 12:08

            Я работаю с 7 до 16, и меня это вполне устраивает. Да и руководство, PM и остальной персонал, находящийся в Челябинске, тоже (в то время, как я в Питере).
            Есть много положительных моментов работать в таком графике. Точнее это мои субъективные положительные моменты. Если будет интересно — я с вами ими поделюсь.

            PS речь в этой статье не об этом. Не будем «офф-топить».


          1. semmaxim
            18.01.2019 08:02

            Серьёзно? Рабочий день с 8 утра — и ты в 17 уже свободен. Можно провести время с семьёй, например. Если бы я жил поближе к работе, то вообще бы с 7 утра работал.


            1. oracle_and_delphi
              18.01.2019 08:18

              Не все жаворонки. Среди программеров не мало сов.


            1. Am0ralist
              18.01.2019 11:38

              то вообще бы с 7 утра работал.
              Ну вот я с 7 до 10 работать могу чисто номинально.
              Когда мне рассказывают сказки, что это просто привычка — я могу лишь криво улыбаться. В школе, в институте, на работу я постоянно вставал в 6-7 часов и к 8-9 всё равно приходил никакой. А лучшая работоспособность всегда была вечером. Итого, за 20 лет насилия над организмом — нифига не выработалась привычка быть жаворонком.


  1. Aquahawk
    16.01.2019 14:56
    +2

    Крутой прогресс. Хотя я и не пишу ни на одном из поддерживаемых языков, но с удовольствием читаю многие ваши статьи, в меру своего понимания C++. Как насчёт также публиковать англоязычные статьи на хабре, раз они у вас уже есть?


    1. Andrey2008 Автор
      16.01.2019 15:06

    1. Misaka10032
      16.01.2019 15:06

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


  1. eao197
    16.01.2019 15:49
    +2

    Самое важное в Java анализаторе то, что он появился

    Молодцы, поздравляю! Надеюсь, это откроет перед вами огромный рынок и сделает вашу компанию еще успешнее.


    1. Andrey2008 Автор
      16.01.2019 15:53
      +2

      Спасибо!


  1. valery1707
    16.01.2019 18:25
    +1

    А не планировали для OpenSource проектов сделать интеграцию с GitHub для автоматического анализа и добавления результатов анализа в PR?
    Ну или что-то типа такого Code Quality: Java?


    1. EvgeniyRyzhkov
      16.01.2019 18:48
      +1

      Со временем сделаем.


  1. alan008
    16.01.2019 19:15

    Иногда в проектах используются собственные реализации разных системных функций, например, memcpy, malloc и т.п.… Теперь с помощью аннотации V_FUNC_ALIAS вы можете ставить имена своих функций в соответствие системным.

    Либо я не понял фразу, либо какая-то гелогичность. Первое предложение звучит так, как будто в проекте может быть функция, называющаяся так же как системная, но делающая что-то другое (или делающая то же, но имеющая отличающуюся семантику). А оказывается наоборот — для системной функуии просто ввели другое название.


    1. Andrey2008 Автор
      16.01.2019 19:37
      +1

      В проектах есть самописные функции, которые ведут себя с точки зрения использования, точно также, как memcpy, malloc, но реализован особенным образом.


  1. olekl
    16.01.2019 19:34

    А не планируете сделать как-нибудь так, чтоб отчеты можно было сравнивать? Чтоб было можно быстро найти новую появившуюся ошибку, имея два отчета?


    1. Andrey2008 Автор
      16.01.2019 19:39

      Пожалуйста, расскажите про сценарий использования. Для чего это нужно?

      И почему, не подходит массовое подавление сообщений анализатора (отключение выдачи предупреждений на существующий код). Которое как раз позволяет видеть только новые срабатывания.


      1. pdima
        17.01.2019 10:58

        например в CI системе найти список новых ошибок в комите и запостить в code review


        1. Paull
          17.01.2019 11:48

          На самом деле, у нас есть внутренние инструменты для «сравнения отчётов», мы их используем, например, в регрессионных тестах. Тем не менее, для конечного пользователя они, скорее всего, окажутся неудобными. Ведь при сравнении результатов работы анализатора, между получением которых прошло какое-то время, нужно учитывать, что проверяемый код мог правиться, в проверяемые файлы добавлялся код, из-за которого старый проверяемый код мог «съехать» и т.п. Поэтому, сравнение двух отчётов «в лоб» обычно неэффективно.

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

          Мы также предоставляем утилиты для рассылки писем с результатами анализа, для преобразования результатов в различные форматы и т.п., так что вставить результат в code review отчёт также не должно быть трудно.


    1. EvgeniyRyzhkov
      16.01.2019 19:44

      Как правило нет цели «сравнивать отчеты». Есть цель видеть новые ошибки. Этот механизм существует. Чтобы дать конкретные ссылки опишите свой сценарий использования.


  1. olekl
    16.01.2019 19:36

    И про стркопи, раз уж всплыло — а если собственная реализация, к примеру, использует в качестве третьего параметра количество символов, а не количество байт, то как избавиться от предупреждения? Поможет аннотация?


    1. Andrey2008 Автор
      16.01.2019 19:42

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

      Для описанного случая, сейчас у нас ничего нет. Никто и не спрашивал. Становитесь клиентом, сделаем :).


  1. Nick_Shl
    17.01.2019 05:10

    Скачал, начал устанавливать и "C:\Program Files (x86)\PVS-Studio"… WTF???
    Утилита которая началась давным давно с проверок переносимого года с 32-х на 64 бита сама до сих пор является 32-хбитной…


    1. Paull
      17.01.2019 11:33

      Ну во первых, наш продукт нельзя назвать чисто «32-битным» или «64-битным» — если говорить конкретно про Windows дистрибутив, то в него входит много разных утилит, некоторые из них (были) в том-числе 32-битными. Постепенно 32-битных утилит становится меньше, например наш C++ анализатор присутствовал в дистрибутиве как в виде 32-битной, так и 64-битной версий (сейчас от 32-битной версии мы отказались).

      Во вторых, в папку Program Files (x86) он ставится, т.к. сам наш Windows инсталятор является 32-битным — можно сказать, что так исторически сложилось. В более старых версиях PVS-Studio, когда мы поддерживали старые IDE, такие как, например, Visual Studio 2008, возможно (я точно не ручаюсь, т.к. уже не помню), установка плагинов к таким IDE накладывала ограничения на создание чисто-64битного установщика. Также, PVS-Studio можно было установить и на 32-битную версию Windows (как я писал выше, сейчас это уже не актуально).

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


      1. EvgeniyRyzhkov
        17.01.2019 11:47

        Хочу акцентировать еще раз внимание присутсвующих. Сам анализатор 64-битный и использует это на полную :-).


        1. Nick_Shl
          17.01.2019 18:18

          Да какая разница какой он, если свою работу выполняет? Комментарий был из разряда "занимательные факты".


  1. ianzag
    17.01.2019 10:28
    +2

    Хорошие у вас художники :)


  1. HDDimon
    17.01.2019 11:18

    Есть ли сравнение с уже существующими анализаторами из java мира? На сколько ваш лучше/хуже?


    1. Andrey2008 Автор
      17.01.2019 11:42

      Лучше/хуже это очень непростой вопрос. Но мы точно хорошо дополним существующие инструменты (и найдём в них ошибки :): habr.com/ru/company/pvs-studio/blog/436434


  1. Andrey2008 Автор
    17.01.2019 15:49

    А вот и первая беглая проверка открытых проектов (IntelliJ IDEA, SpotBugs, SonarQube): PVS-Studio для Java.