?

Log in

No account? Create an account
 
 
07 November 2008 @ 10:35 am
Статический анализ С++ кода  
Начитавшись про то, как правильные пацаны начитались про правильные практики (http://blog.gamedeff.com/?p=164), решил приобщиться к теме и опробовать пару статических анализаторов: Prefast и анализатор встроенный в Intel C++ Compiler 10.1. Надо сказать, что эта тема интересует меня давно, однако до сих пор удалось опробовать лишь lint, который произвёл впечатление крайне бестолковой тулзы. У него огромное количество шума (бесполезных сообщений), на фильтрацию которых уходит много времени. А после фильтрации обнаруживаешь, что никаких полезных сообщений-то и не осталось. Несколько простых ошибок, внесённых в код для теста, также обнаружены lint’ом не были.

Итак, Prefast и Intel Compiler (далее IC). Для начала был проверен следующий код, имеющий очевидную проблему с переполнением буфера.

void main()
{
char arr[50];
int n=0;
for (int i=0; i<100; ++i)
arr[n++] = 0;
}

Prefast сразу же огорчил, не увидев ошибки. Анализатор из IC нашёл ошибку – значит всё не так плохо. Далее через анализаторы были пропущены 4 небольших проекта (объём исходников в наиболее крупном 0.5Мб). И тут фаворит неожиданно сменился. Prefast обнаружил 7 минорных багов и 1 серьёзный. Анализатор IC не обнаружил ни одной (!) ошибки, даже минорной. Более того, в двух проектах после нескольких часов раздумий он выдал внутреннюю ошибку, полностью расписавшись в своей бесполезности. Однако сам компилятор IC нашёл несколько несоответствий в форматных строках sprintf’ов и типах реальных параметров. Prefast тоже работает с этим типом ошибок, но IC находит некоторые ошибки пропущенные Prefast’ом.

Вывод: На данный момент единственным доступным анализатором, использование которого наносит ощутимую пользу, выглядит только Prefast. Класс обнаруживаемых им ошибок не так велик, как хотелось бы. Тем более, что он не обрабатывает межфункциональные вызовы. Однако, как говорится, на безрыбье и рак – абиссальная галатурия.
 
 
 
Семенsim0nsays on November 7th, 2008 08:23 am (UTC)
Очень удивительно, что не обнаружил. Попробую завтра на работе.
Дмитрий Тюревdtjurev on November 7th, 2008 11:52 am (UTC)
Prefast обнаруживает ошибку, если индексировать arr по i. Использование второго индекса он уже не поддерживает. Кстати, а prefast сейчас развивают? :) Увеличивают число диагностируемых типов ошибок?
shodan_ru on November 7th, 2008 09:53 am (UTC)
Атпиридил!
Дмитрий Тюревdtjurev on November 7th, 2008 11:57 am (UTC)
Интересно почитать и о твоих впечатлениях. :)
Влад Шиховvladshikhov on December 8th, 2009 03:06 pm (UTC)
в 10 версии интела вообще статически анализ добавлен "для галочки". Падал даже у ребят из интела на их собственных ноутах, собственных проектах :)
Семушин Вячеславphp_coder on January 1st, 2010 05:08 pm (UTC)
>Для начала был проверен следующий код, имеющий очевидную проблему с переполнением буфера.

Хм. cppcheck её тоже не обнаружил. Повесил тикет: http://sourceforge.net/apps/trac/cppcheck/ticket/1199 Спасибо за тест-кейс!