воскресенье, 22 января 2012 г.

PVS под лупой

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


Для начала попытаемся его запустить на каком-либо файле без использования VS:
"C:\Program Files\PVS-Studio\x86\PVS-Studio.exe" --source-file "F:\tools_testing\static\C\calc_checks\calc_checks.c" --cfg Settings.xml --output-file out.txt
Incorrect parameter syntax: unknown option яю<
Оно немного странно, но ладно, можно создать проект для VS и посмотреть.

Итак, из того, что PVS смог найти:
  • случай возврата указателя на локальный объект
  • отсутствие возвращаемого значения
  • выход за границу статического значения
  • присваивание внутри условного оператора (например if( a = true ))
  • множественное изменение одной переменной
К сожалению, почти полностью отсутствует работа с памятью. Не определяются случаи утечек, двойного освобождения или некорректного применения new и delete[]. Вообще, оно не декларировалось в списках возможностей, но могло бы значительно повысить качество анализа.

Также отсутствует анализ использования переменных. Например, не проверяется факт инициализации переменной или факт её неиспользования.

Отсутствует проверка соответствия типов, что тоже несколько напрягает. Особенно странно, что на моих примерах не обработался typedef. [прим автора: фраза вычёркивается, т.к. пруфа нет, а без него смысл теряется.]

Резюме: довольно странно, что в инструменте анализа C++ не реализованы обработки многих распространённых ошибок. Поэтому пока что он плохо подходит для общего анализа кода (тот же свободный cppcheck выполняет многое из перечисленного). Сейчас я не стал бы покупать PVS для улучшения качества своих приложений, а воспользовался бы альтернативными решениями.

UPD: ошибка при запуске без создания VS проекта была из-за неправильного параметра в --cfg. Необходимо, чтобы там был файл со строками вида
exclude-path = C:\Program Files (x86)\Microsoft Visual Studio 10.0
vcinstalldir = C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\
platform = Win32
Причём если используется UTF-8 то необходим режим без BOM. Иначе PVS ругнётся на некорректные параметры.