[devel] IA: destination buffer overflow
Damir Shayhutdinov
=?iso-8859-1?q?damir_=CE=C1_altlinux=2Eorg?=
Вт Ноя 27 17:25:22 MSK 2007
> Этот кусок кода можно упростить до
>
> 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.
Да, но проблема в том что это символ препроцессора, и насколько я
понимаю, авторы в будущем поменяют его значение. Сам по себе код
вполне правомочен, если бы компилятор не знал, что MAX_PLAYERS = 1.
Авторы писали код так, чтобы он не зависел от значения MAX_PLAYERS.
А в итоге получается что компилятор из-за оптимизации запаниковал на
ровном месте. Формально он конечно прав, а практически - нет. Это я и
считаю несовершенством проверки.
Из-за него к каждому предупреждению компилятора приходится подходить
индивидуально. Обидно также то, что апстриму необходимость guard-а
будет сложно объяснить.
> Добавенная вами проверка -- это не лишний guard, благодаря ней
> компилятор выкинул весь цикл.
Ну да, если основываться на предположении что MAX_PLAYERS будет всегда равно 1.
Подробная информация о списке рассылки Devel