On Tue, Nov 27, 2007 at 01:11:10PM +0300, Damir Shayhutdinov wrote: [...] > Я вчера наблюдал пример ложного срабатывания, которое пришлось > залечить вот таким вот патчем: > > http://git.altlinux.org/people/damir/packages/?p=freedroidrpg.git;a=blob;f=freedroidrpg-0.10.3-alt-fix-buffer-overflow.patch;h=3cf47e900b1368bdbfde78c5722c8dc2c9b7b123;hb=778a38a4dd43d61abd87e07946937c9de6a8a8a9 > > Ложное срабатывание было в freedroidrpg/src/network.c:654 > > Формулировка компилятора была однозначна - always overflow. На самом > деле, до тех пор пока 0 <= PlayerNum < MAX_PLAYERS (а это именно так > при всех вызовах этой функции), никакого overflow не будет. > > Пришлось добавлять лишний guard, чтобы умилостивить компилятор. Этот кусок кода можно упростить до extern struct { char a; } from[1], to[1]; void copy(int n) { if (n != 0) memcpy(&to[1], &from[0], sizeof(to[1])); } Компилятор однозначно говорит: will always overflow destination buffer Он прав, если случится n != 0, то будет выполнен код, который всегда приводит к overflow. Если n всегда 0, то этот вредоносный код не выполнится никогда, и его можно убрать вместе с проверкой n != 0. В вашем случае предупреждение компилятора пропадёт, как только MAX_PLAYERS станет больше 1. Добавенная вами проверка -- это не лишний guard, благодаря ней компилятор выкинул весь цикл. -- ldv