SlideShare a Scribd company logo
1 of 4
Download to read offline
Трудности сравнения анализаторов
кода или не забывайте об удобстве
использования
Авторы: Андрей Карпов, Евгений Рыжков

Дата: 31.03.2011


Аннотация
Желание пользователей сравнить между собой разные анализаторы кода понятно и естественно.
Однако реализовать это желание совсем не так просто как может показаться на первый взгляд.
Дело в том, что непонятно какие конкретно факторы между собой сравнивать.


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

Вы сомневаетесь, что сравнивать указанные параметры бессмысленно? Приведем несколько
примеров.


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

Здесь уместна следующая аналогия. Человек заходит в магазин, чтобы купить обогреватель. Ему
интересен отдел бытовой техники и если в этом отделе большой выбор, то это хорошо. А вот
другие отделы ему не интересны. Нет ничего плохого, если в этом магазине можно купить
надувную лодку, сотовый телефон и стул. Но наличие отдела надувных лодок никак не улучшает
ассортимент обогревателей.

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

inline int x;
Анализатор Klocwork имеет диагностическое сообщение, позволяющее обнаружить эту аномалию
в коде: "The 'inline' keyword is applied to something other than a function or method". Получается, что
вроде хорошо, что есть такая диагностика. Но, скажем, разработчик, использующий компилятор
Microsoft Visual C++ или другой адекватный компилятор, никакой пользы от этой диагностики не
имеет. Visual C++ просто не компилирует такой код: "error C2433: 'x' : 'inline' not permitted on data
declarations".

Другой пример. Некоторые компиляторы плохо поддерживают тип bool. Поэтому Klocwork может
предупредить о ситуации, когда член класса имеет тип bool: "PORTING.STRUCT.BOOL: This checker
detects situations in which a struct/class has a bool member".

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

Подобных примеров можно привести очень много. И получается, что общее количество
диагностических правил никак не связано с тем, какое количество ошибок анализатор обнаружит
в определенном проекте. Анализатор, реализующий 100 диагностик и ориентированный для
Windows-приложений, может найти намного больше ошибок в проекте, собираемом Microsoft
Visual Studio, чем кросс-платформенный анализатор, реализующий 1000 диагностик.

Итак, мы получили, что нельзя сравнивать полезность анализатора по такому параметру, как
число диагностических проверок.

Можно сказать: "Давайте тогда сравнивать количество проверок, актуальных для определенной
системы. Например, отберем все правила, которые позволяют искать ошибки в Windows
программах". Но и такой подход не работает по двум причинам:

Во-первых, нередко бывает так, что в каком-то анализаторе проверка реализована одним
диагностическим правилом, а в другом – несколькими правилами. И если сравнивать по
количеству правил диагностики, то вроде бы один из анализаторов лучше, хотя они одинаковы по
обнаруживаемым ошибкам.

Во-вторых, реализация тех или иных диагностик может быть различного качества. Например,
почти во всех анализаторах есть поиск "магических чисел". Но, к примеру, в одном анализаторе
могут обнаруживаться только магические числа, опасные с точки зрения переноса кода на 64-
битные системы (4, 8, 32 и т.п.), то в другом – просто все магические числа (1, 2, 3 и т.п.). И просто
в таблице сравнения в графе "поиск магических чисел" поставить и там, и там "плюсик" будет
недостаточно.

Еще очень любят приводить такую характеристику, как скорость работы инструмента, или
количество обрабатываемых строк кода в минуту. Но ведь и она не имеет практического смысла.
Нет никакой связи между скоростью работы анализатора кода и скоростью анализа проекта
человеком! Во-первых, нередко запуск анализа кода производится автоматически во время
ночных сборок. И важно просто "успеть" проверить до утра. А, во-вторых, часто забывают при
сравнении про такой параметр как удобство использования. Впрочем, давайте разберемся с этим
вопросом подробнее.
Удобство использования инструмента очень важно для
правильного сравнения
Дело в том, что очень большую роль в реальном применении анализаторов кода играет то,
насколько инструмент удобно применять...

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

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

Вторая проблема связана с тем, как реализована обработка дублирующихся сообщений
анализатора. Речь о диагностике проблем в заголовочных файлах (.h-файлах). Пусть анализатор
обнаружил проблему в .h-файле, который включается в десять .cpp-файлов. Анализируя каждый
из этих десяти .cpp-файлов встроенный в Visual Studio анализатор выдает одно и то же сообщение
про проблему в .h-файле десять раз! Конкретный пример. При проверке eMule сообщение

c:usersevgdocumentsemuleplusdialogmintraybtn.hpp(450):

warning C6054: String 'szwThemeColor' might not be zero-terminated:

Lines: 434, 437, 438, 443, 445, 448, 450

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

Третья проблема – выдача сообщений на проблемы в системных подключаемых файлах (из папок
вида C:Program Files (x86)Microsoft Visual Studio 10.0VCinclude). Встроенный в Visual Studio
анализатор не стесняется клеймить позором системные заголовочные файлы, хотя практического
смысла в этом не много. Опять же пример. Многократно встречалось при проверке eMule одно и
то же сообщение про системные файлы:

1>c:program files (x86)microsoft

sdkswindowsv7.0aincludews2tcpip.h(729):

warning C6386: Buffer overrun: accessing 'argument 1',

the writable size is '1*4' bytes,

but '4294967272' bytes might be written:

Lines: 703, 704, 705, 707, 713, 714, 715, 720,
721, 722, 724, 727, 728, 729

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

Сюда же можно отнести невозможность указать инструменту, чтобы он не проверял некоторые
файлы по маске. Например, все файлы "*_generated.cpp" или "c:libs". В PVS-Studio указать
исключаемые файлы можно.

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

Пятая проблема – фильтрация сообщений не только по коду, но и по тексту. Например, полезно
скрыть все сообщения, содержащие "printf". Во встроенном в Visual Studio анализаторе такой
возможности нет, в PVS-Studio есть.

Наконец, шестая проблема – это насколько удобно можно указать инструменту на то, что это
сообщение – ложное срабатывание. Механизм с #pragma warning disable, используемый в Visual
Studio, позволяет спрятать сообщение только при перезапуске анализа. В отличие от механизм в
PVS-Studio, где сообщения можно пометить как "False Alarm" и скрыть без перезапуска анализа.

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

Итого, получаем следующую картину. Проект eMule проверяется статическим анализатором,
встроенным в Visual Studio, в несколько раз быстрее, чем это делает PVS-Studio. Но для работы с
анализатором Visual Studio понадобилось 3 дня (на самом деле меньше, но приходилось
переключаться на другие задачи, чтобы отдохнуть). А для работы с PVS-Studio потребовалось
только 4 часа.

Примечание. По поводу количества найденных ошибок – оба анализатора показали
приблизительно равнее результаты, и нашли в этом проекте одни и те же ошибки.


Заключение
Сравнение статических анализаторов между собой – очень сложная и комплексная задача. И
ответить на вопрос какой инструмент лучше ВООБЩЕ – нельзя. Можно только говорить о том,
какой инструмент лучше для конкретного проекта и пользователя.

More Related Content

What's hot

Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокTatyanazaxarova
 
Реклама PVS-Studio - статический анализ кода на языке Си и Си++
Реклама PVS-Studio - статический анализ кода на языке Си и Си++Реклама PVS-Studio - статический анализ кода на языке Си и Си++
Реклама PVS-Studio - статический анализ кода на языке Си и Си++Andrey Karpov
 
Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")
Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")
Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")Tatyanazaxarova
 
Проблемы тестирования 64-битных приложений
Проблемы тестирования 64-битных приложенийПроблемы тестирования 64-битных приложений
Проблемы тестирования 64-битных приложенийTatyanazaxarova
 
Ошибки начинающих Tdd практиков, плюсы применения
Ошибки начинающих Tdd практиков, плюсы примененияОшибки начинающих Tdd практиков, плюсы применения
Ошибки начинающих Tdd практиков, плюсы примененияzheldak
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомTatyanazaxarova
 
Константин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороныКонстантин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороныTatyanazaxarova
 
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)Tatyanazaxarova
 
Программа для регрессионного тестирования анализаторов PVS-Studio, CppCat
Программа для регрессионного тестирования анализаторов PVS-Studio, CppCatПрограмма для регрессионного тестирования анализаторов PVS-Studio, CppCat
Программа для регрессионного тестирования анализаторов PVS-Studio, CppCatAndrey Karpov
 
Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...
Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...
Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...Tatyanazaxarova
 
Что такое "Parallel Lint"?
Что такое "Parallel Lint"?Что такое "Parallel Lint"?
Что такое "Parallel Lint"?Tatyanazaxarova
 
Статический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийСтатический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийTatyanazaxarova
 
Инструментальный подход к разработке протоколов
Инструментальный подход к разработке протоколовИнструментальный подход к разработке протоколов
Инструментальный подход к разработке протоколовfurj
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
 
Построение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кодаПостроение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кодаTatyanazaxarova
 
Сравнение PVS-Studio с другими анализаторами кода
Сравнение PVS-Studio с другими анализаторами кодаСравнение PVS-Studio с другими анализаторами кода
Сравнение PVS-Studio с другими анализаторами кодаTatyanazaxarova
 
C# Desktop. Занятие 17.
C# Desktop. Занятие 17.C# Desktop. Занятие 17.
C# Desktop. Занятие 17.Igor Shkulipa
 

What's hot (20)

TAP
TAPTAP
TAP
 
Урок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибокУрок 8. Статический анализ для выявления 64-битных ошибок
Урок 8. Статический анализ для выявления 64-битных ошибок
 
Реклама PVS-Studio - статический анализ кода на языке Си и Си++
Реклама PVS-Studio - статический анализ кода на языке Си и Си++Реклама PVS-Studio - статический анализ кода на языке Си и Си++
Реклама PVS-Studio - статический анализ кода на языке Си и Си++
 
Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")
Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")
Неудачная попытка сравнить PVS-Studio (VivaMP) и Intel C/C++ ("Parallel Lint")
 
Проблемы тестирования 64-битных приложений
Проблемы тестирования 64-битных приложенийПроблемы тестирования 64-битных приложений
Проблемы тестирования 64-битных приложений
 
Ошибки начинающих Tdd практиков, плюсы применения
Ошибки начинающих Tdd практиков, плюсы примененияОшибки начинающих Tdd практиков, плюсы применения
Ошибки начинающих Tdd практиков, плюсы применения
 
Разница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментомРазница в подходах анализа кода компилятором и выделенным инструментом
Разница в подходах анализа кода компилятором и выделенным инструментом
 
Unit Testing
Unit TestingUnit Testing
Unit Testing
 
Константин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороныКонстантин Книжник: статический анализ, взгляд со стороны
Константин Книжник: статический анализ, взгляд со стороны
 
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)
Интервью с Дмитрием Вьюковым – автором верификатора Relacy Race Detector (RRD)
 
Программа для регрессионного тестирования анализаторов PVS-Studio, CppCat
Программа для регрессионного тестирования анализаторов PVS-Studio, CppCatПрограмма для регрессионного тестирования анализаторов PVS-Studio, CppCat
Программа для регрессионного тестирования анализаторов PVS-Studio, CppCat
 
Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...
Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...
Поиск ловушек в Си/Си++ коде при переносе приложений под 64-битную версию Win...
 
Что такое "Parallel Lint"?
Что такое "Parallel Lint"?Что такое "Parallel Lint"?
Что такое "Parallel Lint"?
 
PVS-Studio vs Chromium
PVS-Studio vs ChromiumPVS-Studio vs Chromium
PVS-Studio vs Chromium
 
Статический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложенийСтатический анализ кода для верификации 64-битных приложений
Статический анализ кода для верификации 64-битных приложений
 
Инструментальный подход к разработке протоколов
Инструментальный подход к разработке протоколовИнструментальный подход к разработке протоколов
Инструментальный подход к разработке протоколов
 
Статический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMergeСтатический анализ исходного кода на примере WinMerge
Статический анализ исходного кода на примере WinMerge
 
Построение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кодаПостроение систем автоматического протоколирования Си/Си++ кода
Построение систем автоматического протоколирования Си/Си++ кода
 
Сравнение PVS-Studio с другими анализаторами кода
Сравнение PVS-Studio с другими анализаторами кодаСравнение PVS-Studio с другими анализаторами кода
Сравнение PVS-Studio с другими анализаторами кода
 
C# Desktop. Занятие 17.
C# Desktop. Занятие 17.C# Desktop. Занятие 17.
C# Desktop. Занятие 17.
 

Viewers also liked

Защита от вредоносного кода бесплатно.
Защита от вредоносного кода бесплатно. Защита от вредоносного кода бесплатно.
Защита от вредоносного кода бесплатно. Andrey Beshkov
 
статические анализаторы кода за и против
статические анализаторы кода  за и противстатические анализаторы кода  за и против
статические анализаторы кода за и противRoman Kalita
 
Статический анализатор кода PVS-Studio
Статический анализатор кода PVS-StudioСтатический анализатор кода PVS-Studio
Статический анализатор кода PVS-Studiocppclimber
 
Методы поиска уязвимостей в программах
Методы поиска уязвимостей в программахМетоды поиска уязвимостей в программах
Методы поиска уязвимостей в программахVasiliy Shapovalov
 
Windows 8 и Windows server 2012. Что нового с точки зрения безопасности?
Windows 8 и Windows server 2012. Что нового с точки зрения безопасности?Windows 8 и Windows server 2012. Что нового с точки зрения безопасности?
Windows 8 и Windows server 2012. Что нового с точки зрения безопасности?Andrey Beshkov
 
сафонов лука. Byod векторы атак обзор мобильных угроз вредоносное по androi...
сафонов лука. Byod   векторы атак обзор мобильных угроз вредоносное по androi...сафонов лука. Byod   векторы атак обзор мобильных угроз вредоносное по androi...
сафонов лука. Byod векторы атак обзор мобильных угроз вредоносное по androi...elenae00
 
Security stronghold antivirus
Security stronghold antivirusSecurity stronghold antivirus
Security stronghold antivirusw_harker
 
Безопасность гибридных облаков
Безопасность гибридных облаковБезопасность гибридных облаков
Безопасность гибридных облаковAndrey Beshkov
 
Современные методы борьбы с ботнетами
Современные методы борьбы с ботнетамиСовременные методы борьбы с ботнетами
Современные методы борьбы с ботнетамиAndrey Beshkov
 
Вирусы и способы борьбы с ними
Вирусы и способы борьбы с нимиВирусы и способы борьбы с ними
Вирусы и способы борьбы с нимиMihail_Morozov
 
вирусы и антивирусы
вирусы и антивирусывирусы и антивирусы
вирусы и антивирусыГимназия
 
NetResident - мониторинг и контент-анализ трафика
NetResident -  мониторинг и контент-анализ трафикаNetResident -  мониторинг и контент-анализ трафика
NetResident - мониторинг и контент-анализ трафикаMilla Bren
 
Поиск уязвимостей в программах с помощью анализаторов кода
Поиск уязвимостей в программах с помощью анализаторов кодаПоиск уязвимостей в программах с помощью анализаторов кода
Поиск уязвимостей в программах с помощью анализаторов кодаTatyanazaxarova
 
концепция защиты виртуального цод. михаил савушкин, Symantec.
концепция защиты виртуального цод. михаил савушкин, Symantec.концепция защиты виртуального цод. михаил савушкин, Symantec.
концепция защиты виртуального цод. михаил савушкин, Symantec.AKlimchuk
 
Essential security aspects in heterogenous Data Centers
Essential security aspects in heterogenous Data CentersEssential security aspects in heterogenous Data Centers
Essential security aspects in heterogenous Data CentersNikolay Romanov
 
Автоматический поиск уязвимостей в программах без исходных текстов
Автоматический поиск уязвимостей в программах без исходных текстовАвтоматический поиск уязвимостей в программах без исходных текстов
Автоматический поиск уязвимостей в программах без исходных текстовd_olex
 
Где прячутся мобильные вирусы — Григорий Земсков
Где прячутся мобильные вирусы — Григорий ЗемсковГде прячутся мобильные вирусы — Григорий Земсков
Где прячутся мобильные вирусы — Григорий ЗемсковYandex
 
Заблуждения и стереотипы относительно анализа кода
Заблуждения и стереотипы относительно анализа кодаЗаблуждения и стереотипы относительно анализа кода
Заблуждения и стереотипы относительно анализа кодаRISSPA_SPb
 
RedSeal - система визуализации и анализа рисков сетевой безопасности
RedSeal - система визуализации и анализа рисков сетевой безопасностиRedSeal - система визуализации и анализа рисков сетевой безопасности
RedSeal - система визуализации и анализа рисков сетевой безопасностиDialogueScience
 
Эволюция архитектуры безопасности для эры всеобъемлющего интернета
Эволюция архитектуры безопасности для эры всеобъемлющего интернетаЭволюция архитектуры безопасности для эры всеобъемлющего интернета
Эволюция архитектуры безопасности для эры всеобъемлющего интернетаCisco Russia
 

Viewers also liked (20)

Защита от вредоносного кода бесплатно.
Защита от вредоносного кода бесплатно. Защита от вредоносного кода бесплатно.
Защита от вредоносного кода бесплатно.
 
статические анализаторы кода за и против
статические анализаторы кода  за и противстатические анализаторы кода  за и против
статические анализаторы кода за и против
 
Статический анализатор кода PVS-Studio
Статический анализатор кода PVS-StudioСтатический анализатор кода PVS-Studio
Статический анализатор кода PVS-Studio
 
Методы поиска уязвимостей в программах
Методы поиска уязвимостей в программахМетоды поиска уязвимостей в программах
Методы поиска уязвимостей в программах
 
Windows 8 и Windows server 2012. Что нового с точки зрения безопасности?
Windows 8 и Windows server 2012. Что нового с точки зрения безопасности?Windows 8 и Windows server 2012. Что нового с точки зрения безопасности?
Windows 8 и Windows server 2012. Что нового с точки зрения безопасности?
 
сафонов лука. Byod векторы атак обзор мобильных угроз вредоносное по androi...
сафонов лука. Byod   векторы атак обзор мобильных угроз вредоносное по androi...сафонов лука. Byod   векторы атак обзор мобильных угроз вредоносное по androi...
сафонов лука. Byod векторы атак обзор мобильных угроз вредоносное по androi...
 
Security stronghold antivirus
Security stronghold antivirusSecurity stronghold antivirus
Security stronghold antivirus
 
Безопасность гибридных облаков
Безопасность гибридных облаковБезопасность гибридных облаков
Безопасность гибридных облаков
 
Современные методы борьбы с ботнетами
Современные методы борьбы с ботнетамиСовременные методы борьбы с ботнетами
Современные методы борьбы с ботнетами
 
Вирусы и способы борьбы с ними
Вирусы и способы борьбы с нимиВирусы и способы борьбы с ними
Вирусы и способы борьбы с ними
 
вирусы и антивирусы
вирусы и антивирусывирусы и антивирусы
вирусы и антивирусы
 
NetResident - мониторинг и контент-анализ трафика
NetResident -  мониторинг и контент-анализ трафикаNetResident -  мониторинг и контент-анализ трафика
NetResident - мониторинг и контент-анализ трафика
 
Поиск уязвимостей в программах с помощью анализаторов кода
Поиск уязвимостей в программах с помощью анализаторов кодаПоиск уязвимостей в программах с помощью анализаторов кода
Поиск уязвимостей в программах с помощью анализаторов кода
 
концепция защиты виртуального цод. михаил савушкин, Symantec.
концепция защиты виртуального цод. михаил савушкин, Symantec.концепция защиты виртуального цод. михаил савушкин, Symantec.
концепция защиты виртуального цод. михаил савушкин, Symantec.
 
Essential security aspects in heterogenous Data Centers
Essential security aspects in heterogenous Data CentersEssential security aspects in heterogenous Data Centers
Essential security aspects in heterogenous Data Centers
 
Автоматический поиск уязвимостей в программах без исходных текстов
Автоматический поиск уязвимостей в программах без исходных текстовАвтоматический поиск уязвимостей в программах без исходных текстов
Автоматический поиск уязвимостей в программах без исходных текстов
 
Где прячутся мобильные вирусы — Григорий Земсков
Где прячутся мобильные вирусы — Григорий ЗемсковГде прячутся мобильные вирусы — Григорий Земсков
Где прячутся мобильные вирусы — Григорий Земсков
 
Заблуждения и стереотипы относительно анализа кода
Заблуждения и стереотипы относительно анализа кодаЗаблуждения и стереотипы относительно анализа кода
Заблуждения и стереотипы относительно анализа кода
 
RedSeal - система визуализации и анализа рисков сетевой безопасности
RedSeal - система визуализации и анализа рисков сетевой безопасностиRedSeal - система визуализации и анализа рисков сетевой безопасности
RedSeal - система визуализации и анализа рисков сетевой безопасности
 
Эволюция архитектуры безопасности для эры всеобъемлющего интернета
Эволюция архитектуры безопасности для эры всеобъемлющего интернетаЭволюция архитектуры безопасности для эры всеобъемлющего интернета
Эволюция архитектуры безопасности для эры всеобъемлющего интернета
 

Similar to Трудности сравнения анализаторов кода или не забывайте об удобстве использования

60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста60 антипаттернов для С++ программиста
60 антипаттернов для С++ программистаAndrey Karpov
 
Облегчаем процесс разработки с помощью статического анализа кода: Наш опыт
Облегчаем процесс разработки с помощью статического анализа кода: Наш опытОблегчаем процесс разработки с помощью статического анализа кода: Наш опыт
Облегчаем процесс разработки с помощью статического анализа кода: Наш опытAndrey Karpov
 
Разработка ресурсоемких приложений в среде Visual C++
Разработка ресурсоемких приложений в среде Visual C++Разработка ресурсоемких приложений в среде Visual C++
Разработка ресурсоемких приложений в среде Visual C++Tatyanazaxarova
 
Изменения в инфраструктуре инструментов для программистов
Изменения в инфраструктуре инструментов для программистовИзменения в инфраструктуре инструментов для программистов
Изменения в инфраструктуре инструментов для программистовTatyanazaxarova
 
Сравнение диагностических возможностей анализаторов при проверке 64-битного кода
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаСравнение диагностических возможностей анализаторов при проверке 64-битного кода
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаTatyanazaxarova
 
Mortal Sins and Guilty Pleasures of Automation Engineers
Mortal Sins and Guilty Pleasures of Automation EngineersMortal Sins and Guilty Pleasures of Automation Engineers
Mortal Sins and Guilty Pleasures of Automation EngineersÞorgeir Ingvarsson
 
Многопроцессорным компьютерам - параллельные программы!
Многопроцессорным компьютерам -  параллельные программы!Многопроцессорным компьютерам -  параллельные программы!
Многопроцессорным компьютерам - параллельные программы!Tatyanazaxarova
 
Модульное тестирование с помощью visual studio 2012 MS Test, Nunit, X-unit.ne...
Модульное тестирование с помощью visual studio 2012 MS Test, Nunit, X-unit.ne...Модульное тестирование с помощью visual studio 2012 MS Test, Nunit, X-unit.ne...
Модульное тестирование с помощью visual studio 2012 MS Test, Nunit, X-unit.ne...Александр Шамрай
 
Борьба с багами: RailsClub на DevConf 2015
Борьба с багами: RailsClub на DevConf 2015Борьба с багами: RailsClub на DevConf 2015
Борьба с багами: RailsClub на DevConf 2015Александр Ежов
 
Коллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программахКоллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программахTatyanazaxarova
 
PVS-Studio научился следить за тем, как вы программируете
PVS-Studio научился следить за тем, как вы программируетеPVS-Studio научился следить за тем, как вы программируете
PVS-Studio научился следить за тем, как вы программируетеTatyanazaxarova
 
Mva stf module 2 - rus
Mva stf module 2 - rusMva stf module 2 - rus
Mva stf module 2 - rusMaxim Shaptala
 

Similar to Трудности сравнения анализаторов кода или не забывайте об удобстве использования (13)

60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста60 антипаттернов для С++ программиста
60 антипаттернов для С++ программиста
 
Это сложно
Это сложноЭто сложно
Это сложно
 
Облегчаем процесс разработки с помощью статического анализа кода: Наш опыт
Облегчаем процесс разработки с помощью статического анализа кода: Наш опытОблегчаем процесс разработки с помощью статического анализа кода: Наш опыт
Облегчаем процесс разработки с помощью статического анализа кода: Наш опыт
 
Разработка ресурсоемких приложений в среде Visual C++
Разработка ресурсоемких приложений в среде Visual C++Разработка ресурсоемких приложений в среде Visual C++
Разработка ресурсоемких приложений в среде Visual C++
 
Изменения в инфраструктуре инструментов для программистов
Изменения в инфраструктуре инструментов для программистовИзменения в инфраструктуре инструментов для программистов
Изменения в инфраструктуре инструментов для программистов
 
Сравнение диагностических возможностей анализаторов при проверке 64-битного кода
Сравнение диагностических возможностей анализаторов при проверке 64-битного кодаСравнение диагностических возможностей анализаторов при проверке 64-битного кода
Сравнение диагностических возможностей анализаторов при проверке 64-битного кода
 
Mortal Sins and Guilty Pleasures of Automation Engineers
Mortal Sins and Guilty Pleasures of Automation EngineersMortal Sins and Guilty Pleasures of Automation Engineers
Mortal Sins and Guilty Pleasures of Automation Engineers
 
Многопроцессорным компьютерам - параллельные программы!
Многопроцессорным компьютерам -  параллельные программы!Многопроцессорным компьютерам -  параллельные программы!
Многопроцессорным компьютерам - параллельные программы!
 
Модульное тестирование с помощью visual studio 2012 MS Test, Nunit, X-unit.ne...
Модульное тестирование с помощью visual studio 2012 MS Test, Nunit, X-unit.ne...Модульное тестирование с помощью visual studio 2012 MS Test, Nunit, X-unit.ne...
Модульное тестирование с помощью visual studio 2012 MS Test, Nunit, X-unit.ne...
 
Борьба с багами: RailsClub на DevConf 2015
Борьба с багами: RailsClub на DevConf 2015Борьба с багами: RailsClub на DevConf 2015
Борьба с багами: RailsClub на DevConf 2015
 
Коллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программахКоллекция примеров 64-битных ошибок в реальных программах
Коллекция примеров 64-битных ошибок в реальных программах
 
PVS-Studio научился следить за тем, как вы программируете
PVS-Studio научился следить за тем, как вы программируетеPVS-Studio научился следить за тем, как вы программируете
PVS-Studio научился следить за тем, как вы программируете
 
Mva stf module 2 - rus
Mva stf module 2 - rusMva stf module 2 - rus
Mva stf module 2 - rus
 

More from Tatyanazaxarova

Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияTatyanazaxarova
 
Урок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программУрок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программTatyanazaxarova
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокTatyanazaxarova
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиTatyanazaxarova
 
Урок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурУрок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурTatyanazaxarova
 
Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхTatyanazaxarova
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияTatyanazaxarova
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиTatyanazaxarova
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаTatyanazaxarova
 
Урок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхУрок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхTatyanazaxarova
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейTatyanazaxarova
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаTatyanazaxarova
 
Урок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаУрок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаTatyanazaxarova
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовTatyanazaxarova
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаTatyanazaxarova
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеTatyanazaxarova
 
Урок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияУрок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияTatyanazaxarova
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииTatyanazaxarova
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийTatyanazaxarova
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кодаTatyanazaxarova
 

More from Tatyanazaxarova (20)

Урок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окруженияУрок 27. Особенности создания инсталляторов для 64-битного окружения
Урок 27. Особенности создания инсталляторов для 64-битного окружения
 
Урок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программУрок 26. Оптимизация 64-битных программ
Урок 26. Оптимизация 64-битных программ
 
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибокУрок 25. Практическое знакомство с паттернами 64-битных ошибок
Урок 25. Практическое знакомство с паттернами 64-битных ошибок
 
Урок 24. Фантомные ошибки
Урок 24. Фантомные ошибкиУрок 24. Фантомные ошибки
Урок 24. Фантомные ошибки
 
Урок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структурУрок 23. Паттерн 15. Рост размеров структур
Урок 23. Паттерн 15. Рост размеров структур
 
Урок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данныхУрок 21. Паттерн 13. Выравнивание данных
Урок 21. Паттерн 13. Выравнивание данных
 
Урок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. ИсключенияУрок 20. Паттерн 12. Исключения
Урок 20. Паттерн 12. Исключения
 
Урок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен даннымиУрок 19. Паттерн 11. Сериализация и обмен данными
Урок 19. Паттерн 11. Сериализация и обмен данными
 
Урок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметикаУрок 17. Паттерн 9. Смешанная арифметика
Урок 17. Паттерн 9. Смешанная арифметика
 
Урок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединенияхУрок 16. Паттерн 8. Memsize-типы в объединениях
Урок 16. Паттерн 8. Memsize-типы в объединениях
 
Урок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателейУрок 15. Паттерн 7. Упаковка указателей
Урок 15. Паттерн 7. Упаковка указателей
 
Урок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметикаУрок 13. Паттерн 5. Адресная арифметика
Урок 13. Паттерн 5. Адресная арифметика
 
Урок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвигаУрок 11. Паттерн 3. Операции сдвига
Урок 11. Паттерн 3. Операции сдвига
 
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументовУрок 10. Паттерн 2. Функции с переменным количеством аргументов
Урок 10. Паттерн 2. Функции с переменным количеством аргументов
 
Урок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числаУрок 9. Паттерн 1. Магические числа
Урок 9. Паттерн 1. Магические числа
 
Урок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном кодеУрок 6. Ошибки в 64-битном коде
Урок 6. Ошибки в 64-битном коде
 
Урок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложенияУрок 5. Сборка 64-битного приложения
Урок 5. Сборка 64-битного приложения
 
Урок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурацииУрок 4. Создание 64-битной конфигурации
Урок 4. Создание 64-битной конфигурации
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
 
Статический анализ Си++ кода
Статический анализ Си++ кодаСтатический анализ Си++ кода
Статический анализ Си++ кода
 

Трудности сравнения анализаторов кода или не забывайте об удобстве использования

  • 1. Трудности сравнения анализаторов кода или не забывайте об удобстве использования Авторы: Андрей Карпов, Евгений Рыжков Дата: 31.03.2011 Аннотация Желание пользователей сравнить между собой разные анализаторы кода понятно и естественно. Однако реализовать это желание совсем не так просто как может показаться на первый взгляд. Дело в том, что непонятно какие конкретно факторы между собой сравнивать. Введение Если отбросить уж совсем нелепые идеи типа "сравнить количество диагностируемых ошибок" или "сравнить количество сообщений, которые выдал инструмент", то даже разумный параметр "соотношение сигнал/шум" не кажется идеальным критерием оценки анализатора кода. Вы сомневаетесь, что сравнивать указанные параметры бессмысленно? Приведем несколько примеров. Какие параметры сравнивать просто бессмысленно Рассмотрим такую простую на первый взгляд характеристику, как количество диагностических проверок. Кажется, что чем их больше, тем лучше. Но для конечного пользователя, использующего определенный набор операционных систем и компиляторов, общее количество правил ничего не значит. Правила диагностики, актуальные для систем, библиотек и компиляторов, которые он не использует, ничего ему не дают. Они даже мешают ему, загромождая систему настройки и документацию, усложняют использование и внедрение инструмента. Здесь уместна следующая аналогия. Человек заходит в магазин, чтобы купить обогреватель. Ему интересен отдел бытовой техники и если в этом отделе большой выбор, то это хорошо. А вот другие отделы ему не интересны. Нет ничего плохого, если в этом магазине можно купить надувную лодку, сотовый телефон и стул. Но наличие отдела надувных лодок никак не улучшает ассортимент обогревателей. Возьмем, например, инструмент Klocwork, поддерживающий большое количество разнообразных систем, в том числе и экзотических. В одной из таких систем есть компилятор, который "проглатывает" вот такой вот код: inline int x;
  • 2. Анализатор Klocwork имеет диагностическое сообщение, позволяющее обнаружить эту аномалию в коде: "The 'inline' keyword is applied to something other than a function or method". Получается, что вроде хорошо, что есть такая диагностика. Но, скажем, разработчик, использующий компилятор Microsoft Visual C++ или другой адекватный компилятор, никакой пользы от этой диагностики не имеет. Visual C++ просто не компилирует такой код: "error C2433: 'x' : 'inline' not permitted on data declarations". Другой пример. Некоторые компиляторы плохо поддерживают тип bool. Поэтому Klocwork может предупредить о ситуации, когда член класса имеет тип bool: "PORTING.STRUCT.BOOL: This checker detects situations in which a struct/class has a bool member". Написали bool в классе, вот ужас то... Понятно, что пользу от такого диагностического сообщения может получить крайне малый процент разработчиков. Подобных примеров можно привести очень много. И получается, что общее количество диагностических правил никак не связано с тем, какое количество ошибок анализатор обнаружит в определенном проекте. Анализатор, реализующий 100 диагностик и ориентированный для Windows-приложений, может найти намного больше ошибок в проекте, собираемом Microsoft Visual Studio, чем кросс-платформенный анализатор, реализующий 1000 диагностик. Итак, мы получили, что нельзя сравнивать полезность анализатора по такому параметру, как число диагностических проверок. Можно сказать: "Давайте тогда сравнивать количество проверок, актуальных для определенной системы. Например, отберем все правила, которые позволяют искать ошибки в Windows программах". Но и такой подход не работает по двум причинам: Во-первых, нередко бывает так, что в каком-то анализаторе проверка реализована одним диагностическим правилом, а в другом – несколькими правилами. И если сравнивать по количеству правил диагностики, то вроде бы один из анализаторов лучше, хотя они одинаковы по обнаруживаемым ошибкам. Во-вторых, реализация тех или иных диагностик может быть различного качества. Например, почти во всех анализаторах есть поиск "магических чисел". Но, к примеру, в одном анализаторе могут обнаруживаться только магические числа, опасные с точки зрения переноса кода на 64- битные системы (4, 8, 32 и т.п.), то в другом – просто все магические числа (1, 2, 3 и т.п.). И просто в таблице сравнения в графе "поиск магических чисел" поставить и там, и там "плюсик" будет недостаточно. Еще очень любят приводить такую характеристику, как скорость работы инструмента, или количество обрабатываемых строк кода в минуту. Но ведь и она не имеет практического смысла. Нет никакой связи между скоростью работы анализатора кода и скоростью анализа проекта человеком! Во-первых, нередко запуск анализа кода производится автоматически во время ночных сборок. И важно просто "успеть" проверить до утра. А, во-вторых, часто забывают при сравнении про такой параметр как удобство использования. Впрочем, давайте разберемся с этим вопросом подробнее.
  • 3. Удобство использования инструмента очень важно для правильного сравнения Дело в том, что очень большую роль в реальном применении анализаторов кода играет то, насколько инструмент удобно применять... Недавно мы проверяли проект eMule двумя анализаторами кода, оценивая удобство этой операции. Одним из них был статический анализатор, встроенный в некоторые редакции Visual Studio. Другой же – наш PVS-Studio. И мы сразу же увидели несколько проблем в работе с анализатором кода, встроенным в Visual Studio. Причем эти проблемы не относятся к самому качеству анализа и скорости работы. Первая проблема – это невозможность сохранить список сообщений от анализатора для дальнейшей работы с ним. Например, при проверке встроенным анализатором eMule я получил две тысячи сообщений. Вдумчиво обработать их все сразу невозможно, поэтому приходится возвращаться к ним в течение нескольких дней. Однако невозможность сохранить результаты анализа приводит к тому, что приходится перепроверять проект каждый раз, что сильно утомляет. В PVS-Studio есть возможность сохранить результаты анализа для того, чтобы вернутся к работе с ними позже. Вторая проблема связана с тем, как реализована обработка дублирующихся сообщений анализатора. Речь о диагностике проблем в заголовочных файлах (.h-файлах). Пусть анализатор обнаружил проблему в .h-файле, который включается в десять .cpp-файлов. Анализируя каждый из этих десяти .cpp-файлов встроенный в Visual Studio анализатор выдает одно и то же сообщение про проблему в .h-файле десять раз! Конкретный пример. При проверке eMule сообщение c:usersevgdocumentsemuleplusdialogmintraybtn.hpp(450): warning C6054: String 'szwThemeColor' might not be zero-terminated: Lines: 434, 437, 438, 443, 445, 448, 450 выдавалось более десяти раз. Из-за этого захламляются результаты анализа, и просматривать приходится практически постоянно одни и те же сообщения. Надо сказать, что в PVS-Studio с самого начала дубликаты сообщений не показывались, а фильтровались. Третья проблема – выдача сообщений на проблемы в системных подключаемых файлах (из папок вида C:Program Files (x86)Microsoft Visual Studio 10.0VCinclude). Встроенный в Visual Studio анализатор не стесняется клеймить позором системные заголовочные файлы, хотя практического смысла в этом не много. Опять же пример. Многократно встречалось при проверке eMule одно и то же сообщение про системные файлы: 1>c:program files (x86)microsoft sdkswindowsv7.0aincludews2tcpip.h(729): warning C6386: Buffer overrun: accessing 'argument 1', the writable size is '1*4' bytes, but '4294967272' bytes might be written: Lines: 703, 704, 705, 707, 713, 714, 715, 720,
  • 4. 721, 722, 724, 727, 728, 729 Все равно править системные файлы никто не будет. Так зачем же на такие файлы "ругаться"? PVS- Studio никогда не ругался на системные файлы. Сюда же можно отнести невозможность указать инструменту, чтобы он не проверял некоторые файлы по маске. Например, все файлы "*_generated.cpp" или "c:libs". В PVS-Studio указать исключаемые файлы можно. Четвертая проблема затрагивает собственно работу со списком сообщений от анализатора кода. В любом анализаторе кода, конечно же, можно отключить любые диагностические сообщения по коду. Только вот делать это можно с разным уровнем удобства. Точнее вопрос в том нужно ли перезапускать анализ для сокрытия лишних сообщений по коду или не нужно. В анализаторе кода из Visual Studio нужно переписать коды отключаемых сообщений в настройки проекта, затем перезапустить анализ. При этом, разумеется, сразу же все "лишние" диагностики указать вряд ли удастся, поэтому перезапуск придется повторить несколько раз. В PVS-Studio можно легко скрывать и показывать сообщения по коду без перезапуска и намного более удобно. Пятая проблема – фильтрация сообщений не только по коду, но и по тексту. Например, полезно скрыть все сообщения, содержащие "printf". Во встроенном в Visual Studio анализаторе такой возможности нет, в PVS-Studio есть. Наконец, шестая проблема – это насколько удобно можно указать инструменту на то, что это сообщение – ложное срабатывание. Механизм с #pragma warning disable, используемый в Visual Studio, позволяет спрятать сообщение только при перезапуске анализа. В отличие от механизм в PVS-Studio, где сообщения можно пометить как "False Alarm" и скрыть без перезапуска анализа. Все шесть перечисленных проблем хоть и не затрагивают качество собственно анализа кода, но имеют очень большое значение. Ведь удобство использования инструмента – это тот интегральный показатель, от которого зависит: дойдет ли дело собственно до оценки качества анализа или нет. Итого, получаем следующую картину. Проект eMule проверяется статическим анализатором, встроенным в Visual Studio, в несколько раз быстрее, чем это делает PVS-Studio. Но для работы с анализатором Visual Studio понадобилось 3 дня (на самом деле меньше, но приходилось переключаться на другие задачи, чтобы отдохнуть). А для работы с PVS-Studio потребовалось только 4 часа. Примечание. По поводу количества найденных ошибок – оба анализатора показали приблизительно равнее результаты, и нашли в этом проекте одни и те же ошибки. Заключение Сравнение статических анализаторов между собой – очень сложная и комплексная задача. И ответить на вопрос какой инструмент лучше ВООБЩЕ – нельзя. Можно только говорить о том, какой инструмент лучше для конкретного проекта и пользователя.