PVS-Studio 7.00

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

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

      +2
      Эта штука по прежнему нацелена только на мегакорпорации и стоит 250 000+ рублей в год на одного разработчика?
        0
        PVS-Studio лицензируется на команду разработчиков. Нет цены «для одного разработчика» :). Как вариант, для индивидуальных проектов можно воспользоваться одним из бесплатных вариантов лицензирования (вариант 1, вариант 2).
          0
          Оба варианта не нацелены на компании среднего размера. Либо открытый код (нарушая при этом правила открытого лицензирования, при которых лицензионный комментарий должен идти первым), либо индивидуальный разработчик.

          Сейчас ваш продукт (даже если считать не «для одного разработчика») стоит как новый сотрудник, который может с 8 до 17 непрерывно анализировать код и еще и попутно выяснять у разработчиков что они имели в виду конкретно в этом месте.
            +10
            Таки как раз в человека, который этим будет заниматься, я верю слабо.
            Потому что тупые вещи пропускаются на ура.
              +1
              PVS-Studio ROI: как не терять миллионы.
              Аннотация
              Время от времени нам задают вопрос, какую пользу в денежном эквиваленте получит компания от использования анализатора PVS-Studio. Я решил реализовать на сайте ROI-калькулятор и разместить подробное описание принципов его работы. Но прежде я решил вынести свои мысли и расчёты на обсуждение. Я надеюсь получить интересные и полезные комментарии, которые помогут сделать калькулятор как можно более достоверным и убедительным.
                –6
                Не поленился, залез в статью, поиграл с калькулятором. У нас в низкоуровневой команде 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 раз).
                  +13
                  Да, PVS-Studio не ориентирован на маленькие низкооплачиваемые команды и арифметика не сходится. В Германии, например, средний заработок программистов: 56 – 93 тыс. евро в год и арифметика сходится. Всё OK :)
                    –14
                    В Германии, например, средний заработок программистов: 56 – 93 тыс. евро в год и арифметика сходится. Всё OK


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

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

                        0
                        Кстати, на тему PVS-Studio ROI для иностранных компаний: habr.com/ru/company/pvs-studio/blog/437962
                        +4

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

                          0
                          Потому что переехать в большой город по тем или иным причинам невозможно?
                            +3
                            Согласитесь правда, что PVS-Studio здесь не виноват? :-)
                          +1

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

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

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

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

                            PS речь в этой статье не об этом. Не будем «офф-топить».
                              0
                              Серьёзно? Рабочий день с 8 утра — и ты в 17 уже свободен. Можно провести время с семьёй, например. Если бы я жил поближе к работе, то вообще бы с 7 утра работал.
                                +1
                                Не все жаворонки. Среди программеров не мало сов.
                                  0
                                  то вообще бы с 7 утра работал.
                                  Ну вот я с 7 до 10 работать могу чисто номинально.
                                  Когда мне рассказывают сказки, что это просто привычка — я могу лишь криво улыбаться. В школе, в институте, на работу я постоянно вставал в 6-7 часов и к 8-9 всё равно приходил никакой. А лучшая работоспособность всегда была вечером. Итого, за 20 лет насилия над организмом — нифига не выработалась привычка быть жаворонком.
                                    0
                                    Часов в сутках от этого не прибавится, раньше проснулся — раньше отошёл ко сну.
                            +3
                            Крутой прогресс. Хотя я и не пишу ни на одном из поддерживаемых языков, но с удовольствием читаю многие ваши статьи, в меру своего понимания C++. Как насчёт также публиковать англоязычные статьи на хабре, раз они у вас уже есть?
                              +4
                                +1
                                Так уже же. Я выставил в настройках хабра английский язык и у меня появляется статья на английском.image
                                P.S. Судя по комментарию выше — это отдельная статья, а не потому, что я язык поставил английский.
                                +4
                                Самое важное в Java анализаторе то, что он появился

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

                                  +3
                                  Спасибо!
                                  +2

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

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

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

                                      +4
                                      В проектах есть самописные функции, которые ведут себя с точки зрения использования, точно также, как memcpy, malloc, но реализован особенным образом.
                                      0
                                      А не планируете сделать как-нибудь так, чтоб отчеты можно было сравнивать? Чтоб было можно быстро найти новую появившуюся ошибку, имея два отчета?
                                        0
                                        Пожалуйста, расскажите про сценарий использования. Для чего это нужно?

                                        И почему, не подходит массовое подавление сообщений анализатора (отключение выдачи предупреждений на существующий код). Которое как раз позволяет видеть только новые срабатывания.
                                          0
                                          например в CI системе найти список новых ошибок в комите и запостить в code review
                                            +2
                                            На самом деле, у нас есть внутренние инструменты для «сравнения отчётов», мы их используем, например, в регрессионных тестах. Тем не менее, для конечного пользователя они, скорее всего, окажутся неудобными. Ведь при сравнении результатов работы анализатора, между получением которых прошло какое-то время, нужно учитывать, что проверяемый код мог правиться, в проверяемые файлы добавлялся код, из-за которого старый проверяемый код мог «съехать» и т.п. Поэтому, сравнение двух отчётов «в лоб» обычно неэффективно.

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

                                            Мы также предоставляем утилиты для рассылки писем с результатами анализа, для преобразования результатов в различные форматы и т.п., так что вставить результат в code review отчёт также не должно быть трудно.
                                          +1
                                          Как правило нет цели «сравнивать отчеты». Есть цель видеть новые ошибки. Этот механизм существует. Чтобы дать конкретные ссылки опишите свой сценарий использования.
                                          0
                                          И про стркопи, раз уж всплыло — а если собственная реализация, к примеру, использует в качестве третьего параметра количество символов, а не количество байт, то как избавиться от предупреждения? Поможет аннотация?
                                            0
                                            Если собственная реализация использует в качестве третьего параметра количество элементов, а не количество байт, то это не memcpy, а совсем другая функция. И её размечать её как memcpy нельзя, так как это приведёт к ложным срабатываниям.

                                            Для описанного случая, сейчас у нас ничего нет. Никто и не спрашивал. Становитесь клиентом, сделаем :).
                                            0
                                            Скачал, начал устанавливать и "C:\Program Files (x86)\PVS-Studio"… WTF???
                                            Утилита которая началась давным давно с проверок переносимого года с 32-х на 64 бита сама до сих пор является 32-хбитной…
                                              +1
                                              Ну во первых, наш продукт нельзя назвать чисто «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-битность инсталятора не создаёт для нас или наших пользователей каких-либо проблем, поэтому мы не видим это критичной задачей.
                                                +2
                                                Хочу акцентировать еще раз внимание присутсвующих. Сам анализатор 64-битный и использует это на полную :-).
                                                  –1
                                                  Да какая разница какой он, если свою работу выполняет? Комментарий был из разряда "занимательные факты".
                                              +3
                                              Хорошие у вас художники :)
                                                0
                                                Есть ли сравнение с уже существующими анализаторами из java мира? На сколько ваш лучше/хуже?
                                                  0
                                                  Лучше/хуже это очень непростой вопрос. Но мы точно хорошо дополним существующие инструменты (и найдём в них ошибки :): habr.com/ru/company/pvs-studio/blog/436434
                                                  0
                                                  А вот и первая беглая проверка открытых проектов (IntelliJ IDEA, SpotBugs, SonarQube): PVS-Studio для Java.

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

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