Несколько дней назад я задал вопрос об обнаружении переполнения буфера (глобальное переполнение буфера sprintf - как это обнаружить, Windows) и проблема может быть решена только cppcheck со стандартной функцией (не защищенная версия _s).
Я пошел глубже и изменил код с
#include <stdio.h>
char buffer[2];
void main()
{
sprintf(buffer,"12345");
}
to
#include <stdio.h>
void f( char *b )
{
sprintf(b,"12345");
}
char buffer[2];
void main()
{
f( buffer );
}
Visual Studio 2012 / RTC может обрабатывать переполнение выделенного буфера стека - во время выполнения, но глобальные данные остаются незамеченными.
Я полагаю, что невозможно провести глубокий анализ с помощью cppcheck, и эта проблема не обнаруживается cppcheck-1.64. Кроме того, я попытался использовать clang с AddressSanitizer (Windows) также без хороших результатов.
Можно ли предотвратить такие проблемы под Windows (желательно бесплатный инструмент), если нет, может быть, какой-нибудь Linux-инструмент может помочь?