>
>
PVS-Studio 7.09

Андрей Карпов
Статей: 673

PVS-Studio 7.09

Развитие анализатора PVS-Studio ускоряется, и, скорее всего, теперь каждый релиз мы будем сопровождать текстом, чтобы пользователи не пропустили изменения, которые могут быть им полезны. Что интересно, теперь мы не перечисляем всё что добавилось или улучшилось. Скорее, теперь наоборот стоит задача выделить в новости самое главное, чтобы текст не превращался в скучный список изменений. Итак, вашему вниманию предлагается пресс-релиз для PVS-Studio версии 7.09.

Forrester Research

Данный раздел не связан с новой версией PVS-Studio, но хочется отметить приятное для нас событие, которое как раз состоялось незадолго до выхода релиза.

6 августа 2020 года компания Forrester Research выпустила исследование под названием Now Tech: Static Application Security Testing, Q3 2020, в которое анализатор PVS-Studio попал как SAST-специализированное решение. Компания Forrester является одним из ведущих исследователей влияния новых и инновационных технологий на бизнес процессы и рынок, поэтому попадание PVS-Studio в данное исследование является хорошим подтверждением (как для наших пользователей, так и для нас самих) актуальности данного направления развития нашего продукта. Отчёт об исследовании доступен для покупки подписчикам и клиентам Forrester Research.

С++

Постоянные читатели нашего блога, наверное, помнят, что мы используем собственный движок для разбора C и C++ кода. В этом есть как свои преимущества, так и недостатки. Язык C++ сейчас быстро развивается и стало понятно, что требуется серьезная переработка ядра анализатора. В противном случае постепенно анализатор начнёт всё хуже разбирать сложные шаблоны и путаться при выведении типов некоторых объектов. Это немного отвлекло нашу команду от разработки новых диагностик. Зато, проделав запланированные работы, мы сможем сократить количество потребляемой памяти, улучшить поддержку C++20 и сделать множество других улучшений. В свою очередь, эти изменения в будущем позволят сделать механизм анализа потока данных многопроходным и это существенно улучшит точность многих уже существующих диагностик.

Новые диагностики общего назначения:

  • V1059. Macro name overrides a keyword/reserved name. This may lead to undefined behavior.
  • V1060. Passing 'BSTR ' to the 'SysAllocString' function may lead to incorrect object creation.
  • V1061. Extending 'std' or 'posix' namespace may result in undefined behavior.
  • V1062. Class defines a custom new or delete operator. The opposite operator must also be defined.
  • V1063. The modulo by 1 operation is meaningless. The result will always be zero.

Микрооптимизации:

  • V826. Consider replacing standard container with a different one.
  • V827. Maximum size of a vector is known at compile time. Consider pre-allocating it by calling reserve(N).
  • V828. Decreased performance. Moving an object in a return statement prevents copy elision.
  • V829. Lifetime of the heap-allocated variable is limited to the current function's scope. Consider allocating it on the stack instead.

Отдельно рассмотрим новую диагностику V012: Some warnings could have been disabled.

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

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

  • При использовании анализатора с Visual Studio, перейдите в настройки плагина, и активируйте опцию ReportDisabledRules в пункте 'Specific Analyzer Settings'.
  • При использовании анализатора на Linux и macOS, добавьте опцию 'report-disabled-rules=yes' в .cfg файл.
pvs-studio-analyzer analyze ... --cfg source.cpp.PVS-Studio.cfg

В результате, в отчете анализатора появятся сообщения с кодом V012 и информацией об источниках отключения диагностик. IDE плагины PVS-Studio поддерживают навигацию к причине отключения диагностик в файлах исходного кода и файлах конфигурации правил (.pvsconfig). Пути до файлов конфигурации, содержащих правила исключения срабатываний анализатора, также будут добавлены в отчёт анализатора, в виде сообщений V012.

C#

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

Также для C# анализатора PVS-Studio добавлена поддержка переопределения уровней значимости предупреждений в файлах настройки диагностик (.pvsconfig). В C++ анализаторе такая возможность существует уже давно.

Предупреждения анализатора имеют три уровня достоверности: High, Medium, Low. В зависимости от используемых в коде конструкций, анализатор оценивает достоверность предупреждений и присваивает им соответствующий уровень в отчёте.

В некоторых проектах поиск определённых типов ошибок может быть очень важен, независимо от степени достоверности предупреждения. Бывает и обратная ситуация, когда сообщения малополезны, но совсем их отключать не хочется. В таких случаях для диагностик можно вручную задать уровень High/Medium/Low. Для этого следует использовать специальные комментарии, которые можно добавить в файл конфигурации диагностик.

В конфигурационном файле (.pvsconfig) можно написать:

//V_LEVEL_1::3001
//V_LEVEL_2::3010,3020,3030
//V_LEVEL_3::3002

Новые диагностики:

  • V3154. The 'a % b' expression always evaluates to 0.
  • V3155. The expression is incorrect or it can be simplified.

Java

Больше всего новых диагностик в этом релизе добавлено для языка Java. Кстати, на тему создания Java диагностик мы написали небольшую заметку: Под капотом PVS-Studio для Java: разработка диагностик.

Новые диагностики:

  • V6082. Unsafe double-checked locking.
  • V6083. Serialization order of fields should be preserved during deserialization.
  • V6084. Suspicious return of an always empty collection.
  • V6085. An abnormality within similar comparisons. It is possible that a typo is present inside the expression.
  • V6086. Suspicious code formatting. 'else' keyword is probably missing.
  • V6087. InvalidClassException may occur during deserialization.
  • V6088. Result of this expression will be implicitly cast to 'Type'. Check if program logic handles it correctly.
  • V6089. It's possible that the line was commented out improperly, thus altering the program's operation logics.
  • V6090. Field 'A' is being used before it was initialized.
  • V6091. Suspicious getter/setter implementation. The 'A' field should probably be returned/assigned instead.
  • V6092. A resource is returned from try-with-resources statement. It will be closed before the method exits.

Дополнительные ссылки

С момента предыдущего релиза мы опубликовали в нашем блоге несколько заметок, посвященных интеграции PVS-Studio в процесс разработки. Думаем, они могут оказаться полезными DevOps специалистам и программистам, внедряющих у себя в компании методологию статического анализа кода.