[devel] IA: destination buffer overflow
Dmitry V. Levin
=?iso-8859-1?q?ldv_=CE=C1_altlinux=2Eorg?=
Вт Ноя 27 17:33:27 MSK 2007
On Tue, Nov 27, 2007 at 05:25:22PM +0300, Damir Shayhutdinov wrote:
> > Этот кусок кода можно упростить до
> >
> > 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.
>
> А в итоге получается что компилятор из-за оптимизации запаниковал на
> ровном месте. Формально он конечно прав, а практически - нет. Это я и
> считаю несовершенством проверки.
Он и практически прав: поскольку у функции CopyMeToNetworkMe() глобальная
линковка, нет никаких гарантий того что она будет вызвана правильно.
> Из-за него к каждому предупреждению компилятора приходится подходить
> индивидуально. Обидно также то, что апстриму необходимость guard-а
> будет сложно объяснить.
Моё объяснение может оказаться недостаточно доступно?
> > Добавенная вами проверка -- это не лишний guard, благодаря ней
> > компилятор выкинул весь цикл.
>
> Ну да, если основываться на предположении что MAX_PLAYERS будет всегда равно 1.
Альтернативный вариант -- завернуть этот злополучный цикл в #if MAX_PLAYERS > 1.
--
ldv
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип : application/pgp-signature
Размер : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20071127/252a9d58/attachment-0002.bin>
Подробная информация о списке рассылки Devel