[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