[devel] IA: destination buffer overflow
Damir Shayhutdinov
=?iso-8859-1?q?damir_=CE=C1_altlinux=2Eorg?=
Вт Ноя 27 18:25:30 MSK 2007
> > А в итоге получается что компилятор из-за оптимизации запаниковал на
> > ровном месте. Формально он конечно прав, а практически - нет. Это я и
> > считаю несовершенством проверки.
>
> Он и практически прав: поскольку у функции CopyMeToNetworkMe() глобальная
> линковка, нет никаких гарантий того что она будет вызвана правильно.
Угу. А если бы MAX_PLAYERS не было бы равно 1, компилятор бы эту
ошибку вообще пропустил.
Как и у любой проверки, у этой есть ошибки первого и второго родов.
> > Из-за него к каждому предупреждению компилятора приходится подходить
> > индивидуально. Обидно также то, что апстриму необходимость guard-а
> > будет сложно объяснить.
> Моё объяснение может оказаться недостаточно доступно?
Они скажут "а у нас никогда не бывает случая что PlayerNum >=
MAX_PLAYERS". Хотя я не пробовал еще с ними контактировать.
> Альтернативный вариант -- завернуть этот злополучный цикл в #if MAX_PLAYERS > 1.
Возможно, нагляднее и надежнее будет завернуть memcpy в if (WriteIndex
< MAX_PLAYERS), или прям в условие цикла -
for (i=0; i < MAX_PLAYERS && WriteIndex < MAX_PLAYERS; i++)
Думаю в таком виде у патча больше шансов.
Подробная информация о списке рассылки Devel