Еще одно тестирование PVS-Studio

    Интерес к статическим анализаторам кода у меня уже давно, с первого знакомства с Klocwork где-то лет шесть назад. Кроме него, довелось некоторое время поработать с PCLint. И вот теперь немного потестировал PVS-Studio. (А на очереди – Parasoft и Coverity).

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

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

    Чтобы запустить анализатор, достаточно из этого меню выбрать, например, Check Solution. Процесс, надо сказать, небыстрый – на моем не очень большом проекте он занял 18 минут (для сравнения — полная сборка проекта длится около 2 минут). Из плюсов – анализатор показывает адекватный прогресс-бар и оставшееся время!

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

    Вывод результатов анализа – в отдельной вкладке PVS-Studio. Сделано все весьма удобно: по каждой найденной (потенциальной) проблеме показывается описание, место (файл и строка), а также ссылка на подробное описание проблем данного типа: почему это проблема, каким образом ее можно исправить и т.п. Описания сделаны очень подробно и качественно!

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

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

    Пункт меню “Incremental analysis after build”, на мой взгляд, делает не совсем то, что я бы ожидал. Если включить этот пункт, то анализ будет сделан только для изменившейся части проекта (единица изменения – файл, т.е. изменив в одном файле одну строку в одной функции, вы увидите все проблемы, найденные в этом файле). Я бы ожидал увидеть сравнение состояний между «было – стало», хотя может быть, вышеописанный режим работы тоже имеет смысл.

    Похоже, что нет (по крайней мере, я не увидел) возможности увидеть результат очередного билда/исправления вроде «было 40 проблем, после исправления 6 проблем исчезло, 2 новые добавились». Без этого очень сложно отслеживать динамику проекта.

    Сохранить отчет можно или во внутренний формат, или в plaintext. Сохранив его и открыв в текстовом редакторе, я вначале сильно удивился тому, что в отчете было гораздо больше проблем, чем показывалось в студии. Однако потом понял, в чем было дело – по умолчанию в студии включено отображение только “General analysis results”, а кроме этого есть еще и “64 bit analysis results”, выключенный по умолчанию, но попадающий в сохраненный отчет.

    Что же, вернулся в студию и посмотрел еще и проблемы готовности к 64-м битам. Впечатлился. Однозначно могу рекомендовать тем, кто планирует переход на 64-битную платформу, анализатор находит множество неочевидных моментов, о которых даже не задумываешься, программируя в 32-битной системе, но которые приведут к проблеме при переходе на 64 бита. Например, «V104. Implicit type conversion to memsize type in an arithmetic expression» или «V102. Usage of non memsize type for pointer arithmetic», для вполне безобидного на первый взгляд кода:

        uint8 * pRecv;
        int cur = 0;
        
        // somewhere later...
    
        pRecv += cur;
    

    Из непонравившегося – слишком тесная интеграция с Visual Studio. В документации настолько явно было написано, что работа с кроссплатформенными компиляторами очень сложна и не поддерживается, что даже не стал и пробовать, хотя хотелось бы. Теоретически есть возможность запустить PVS-Studio из командной строки, указав ему опции компилятора и список файлов, но – во первых, не так это и просто, если файлов много, и во-вторых, поддержка компилятора gnu в документации заявлена как отсутствующая, хотя возможно, что приложив некоторые усилия, удастся заставить анализатор что-то выдать и на проекте под кроссплатформенный компилятор.

    И напоследок – краткое сравнение PVS-Studio с PC-Lint и Klocwork.

    PVS-Studio гораздо более удобен в использовании, чем PC-Lint. Основная проблема PC-Lint – слишком большое количество потенциальных проблем, на этом же проекте с установками по умолчанию он выдает более 23 тысячи сообщений! (PVS-Studio – лишь 42). При этом PC-Lint не умеет скрывать повторяющиеся проблемы (если один и тот же .h файл подключается из двух .c файлов, то PC-Lint покажет проблему в .h файле дважды, а PVS-Studio – только один раз). И в PC-Lint нельзя отметить как false positive отдельно взятую проблему, можно только «выключить» весь класс проблем.

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

    При этом PC-Lint более универсален, хотя и гораздо более сложен в использовании, хотя интеграция в Visual Studio у него тоже достаточно простая.

    Но в целом здесь PVS-Studio – безусловный лидер. Ибо с ней можно просто взять и начать работать, чего не скажешь о PC-Lint, где только на просмотр всех выданных сообщений легко может уйти пару дней!..

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

    Если сравнить по ценам, то получится вот такой расклад (информация с сайтов разработчиков):
    • за PVS-Studio просят €3500 евро за 5 лицензий или €9000 за 30, за год использования.
    • за PC-Lint — $389 за одну лицензию или $3500 – за 10, неограниченно по времени.
    • за Klocwork — €30000 за пакет «сервер + 20 клиентов» за год использования.

    Что же, цена примерно соответствует функциональности, PVS-Studio где-то посредине между дешевым, но тяжелым и неудобным в использовании PC-Lint и удобным и красивым, но дорогим Klocwork.

    И напоследок – пару примеров реально найденных ошибок в проекте, над которым уже успели «поиздеваться» как Klocwork, так и PC-Lint, и который уже находится на стадии эксплуатации.

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

    Например, PVS-Studio хорошо сообщает о проблемах вот такого типа (и этого не делают, насколько я заметил, вышеупомянутые анализаторы!):

    V519. The 'x' variable is assigned values twice successively. Perhaps this is a mistake

    В моем случае одна из таких выявленных проблем привела вот к такому коду:

        Year = Payload[1];
        Month = Payload[2];
        Year = Payload[3];
    

    Который, конечно же, должен был выглядеть вот так:

        Year = Payload[1];
        Month = Payload[2];
        Day = Payload[3];
    

    И это, кстати, на достаточно хорошо отлаженном, оттестированном и давно уже сданном в эксплуатацию продукте! Да и в целом все остальные выявленные подобные проблемы хоть и не были явными ошибками, но как минимум, указывали на, так сказать, не самый качественный, понятный и красивый код:

            txtL = _T("None");
            txtL = _T("Not found");
    

    или

        POSITION pos = m_items.GetHeadPosition();
        pos = m_ownedItems.GetHeadPosition();
    

    Также PVS-Studio хорошо обнаруживает подобные места в коде (хоть и не ошибка, но я бы предпочел, чтобы такого в коде не было):

        if (m_sc)
        {
            result = DoubleToString(m_highLimit,3);
        }
        else
        {
            result = DoubleToString(m_highLimit,3);
        }
    

    сообщая про них, что: «The 'then' statement is equivalent to the 'else' statement»

    Или вот такое (здесь m2 и m1 типа float):

        if ((m2 - m1) == 0.0)
        {
           doSomethingHere();
        }
    

    говоря, что «An odd precise comparison. It's probably better to use a comparison with defined precision: fabs(A — B) < Epsilon or fabs(A — B) > Epsilon»

    В целом, если у вас в отделе около 30 разработчиков и вы пишете преимущественно в Visual Studio, а 30 тыс. евро на Klocwork у вас нет, то PVS-Studio – очень даже неплохой выбор!
    Share post

    Similar posts

    Comments 24

      +1
      Кто подскажет что то ( хорошо бы с триалом ) для статического анализа проекта под линукс.
      Пробовал натравливать просто на папку Cppcheck виндовый — в основном указал на неиспользуемые переменные и постфиксные инкременты, нашел один баг который совсем недавно внесли в проект — но уверен его бы нашли уже при выкладке. Хочется напустить на проект что то серьезноею. Собираем cmake — ом если это важно.
        +1
        Вот тут есть много разных: en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis
        Например линуксовое ядро проверяется тулзой Sparse. Она в принципе находит разные косяки, но большого опыта работы с ней у меня небыло.
          +1
          Cppcheck будет более эффективен с корректно настроенными параметрами. Последнего удобно добиваться используя опцию --check-config.

          P.S. Проект под Linux, что то мне подсказывает, удобнее проверять под Linux'ом, тем более, что, во-первых: cppcheck кросс-платформенный, а во-вторых: для некоторых дистрибутитов он может быть установлен из репозиториев.
            +2
            Попробуйте статический анализатор clang-а. Без проблем прикручивается к системе сборки (в моём случае CMake), просто подменой компилятора. И это FOSS, не нужны никакие триалы. И развивается ж активно.
              0
              Пробовали — понравилось, вот только ниасилили прикрутить его к Jenkins'у…
            +1
            Неделя PVS-Studio на Хабре! :-)
              +3
              Какой-то конкурс проводите или чего?
                +1
                Нет. Просто люди, наконец, узнали про PVS-Studio и инструмент им начал нравиться. Автор недавно попросил пробный ключ, мы ему дали. А теперь вот написал стать. Благодарю его за это!
            • UFO just landed and posted this here
                +3
                Любой желающий может обратиться за ключиком и написать свой беспристрастный обзор.
                • UFO just landed and posted this here
                    +7
                    Что вы считаете рекламой? Мне стало интересно попробовать еще один анализатор, я попросил пробный ключ на две недели, автор ключ предоставил и попросил оставить отзыв. Никакой другой заинтересованности у меня не было.

                    А то, что анализатор не подвисает на 18 минут, а показывает адекватный прогресс-бар — так что с того, что мне это реально понравилось? Будто бы вы никогда не видели псевдо-прогресс-баров я-ля «виндоуз виста». Компилятор студии, кстати, прогресс-бар не показывает почему-то.
                +2
                Гланый недостаток PVS-Studio это то что она работает только с студией и из под винды
                  +8
                  Гланый недостаток PVS-Studio это то что про нее говорят слишком много и абсолютно однообразно.
                  –5
                  >«Еще одно тестирование PVS-Studio»

                  Еще одна реклама PVS-Studio
                    +4
                    Как я уже написал выше — что вы считаете рекламой и как отличаете ее от обзора?
                      +11
                      Ну как, очевидно же, если ни разу не использовано выражение «полное гавно» — значит реклама. :)
                    0
                    >>> (отмечу только отслеживание состояния от билда к билду – сколько проблем было исправлено, сколько осталось, а сколько добавилось, а также удобные отчеты),

                    А в чем польза отслеживания? Не очень понятно, приведите примеры.
                      0
                      Беру я проект, уже существующий, запускаю анализатор, нахожу, скажем, 20 проблем. Это отправная точка. Раздаю проблемы ответственным, проходит какое-то время, пишется новый код, исправляются существующие проблемы… Делается новый билд (и проверка анализатором) — и по-моему, вполне естественное желание: увидеть, сколько было исправлено из первых 20 найденных, а сколько было внесено новых. Нет?

                      Иначе, если я вижу только цифру 20 после второго билда, то как я могу увидеть, это были исправлены старые и добавлены новые, или просто остались старые?
                        +1
                        Так вот и не ясно. Казалось бы при регулярном использовании анализатора количество обнаруживаемых ошибок должно стремиться к нулю (понятно, что из-за нового кода, оно никогда не будет именно ноль). Но какую информацию дает знание что не просто в проекте 20 ошибок, а 10 старых и 10 новых? Я хочу понять, как пользоваться этой информацией.
                          +1
                          Вот допустим я сам запустил анализатор, нашел 20 проблем и стал их одна за одной исправлять. Исправил одну из них и хочу посмотреть, исправил ли? Пересобрал проект, запустил анализатор — получил опять 20. Что мне делать теперь? Вчитываться заново в описания всех 20, чтобы понять, что произошло — я исправил одну и добавил другую, или же почему-то не исправил первую?

                          Если однажды на проекте будет достигнуто состояние «ни одного предупреждения» — тогда да, необходимость в трекинге не столь важна. Но — насколько это реально на более-менее серьезном проекте, особенно если анализатор применяется не регулярно, а эпизодически и не с самого начала?

                          Также трекинг полезен для ПМ для контроля исправления найденных проблем назначенными для этого ответственными. Как это делать без трекинга? Раскидал ПМ все 20 найденных проблем по людям, решил через неделю посмотреть, как эти 20 проблем были закрыты — и что? Что он должен сделать без трекинга? Вносить каждую проблему по отдельности в багтрекинг и следить там? Можно, но все же дополнительные усилия. А мог бы прямо в результатах следующего анализа увидеть.
                            0
                            У нас есть внутренний инструмент, который делает очень похожую вещь. Он берет два лога, сравнивает их и пишет, какие сообщения добавились, какие пропали.

                            Но что делать в случае, если не просто сообщение пропало/добавилось, а сдвинулись строки из-за редактирования файла?

                            Была ошибка C111 в строке 43 в старом логе. В новом логе в строке 43 ошибки нет, но есть такая же ошибка C111 в строке 91. Наш инструмент скажет, что старая ошибка пропала, а новая добавилась. Но ведь это может быть просто в начало файла код функции вставили.

                            Klocwork как поступит в этом случае?
                              0
                              У них (у Klocwork) привязка более точная вроде бы, не к строкам, а к классам-функциям как минимум. Во всяком случае, на сдвиги строк он правильно реагировал, когда, например, часть кода удалялась или добавлялась. Подробно я этот момент не тестировал — насколько точно он определяет стар

                              Похожая задача стоит перед сравнивалками файлов. И например Winmerge часто неправильно сдвиг определяет (особенно если сдвиг вместе с модификацией), а Araxis делает это в разы лучше (но за деньги).
                      +2
                      Twitter: twitter.com/diverofdark/status/150581681013788673

                      Чем дальше читаю хабр — тем больше мне кажется что весь хабрахабр — это такой рекламный проект от авторов PVS-Studio...

                      :-)

                      Only users with full accounts can post comments. Log in, please.