[Homeros] Fwd: Ошибки в Voiceman

Michael Pozhidaev msp на altlinux.ru
Чт Сен 22 00:58:10 UTC 2011


Дмитрий, добрый день!

> for (int i=0, len=strlen(s); i < len; i++)
>   putchar(s[i]);
>
> Компилируется без предупреждений и работает без ошибок для всех s, длина
> которых не превосходит INT_MAX. Впрочем, в этом примере особой разницы

Ну да, всё верно, операция сравнения сама по себе стала безопасной. Это
к делу не относится, но кстати сказать, что так писать весьма даже
рекомендуется, поскольку общая работа фрагмента стала линейной вместо
квадратичной в случае i < strlen(). Я бы сказал больше, что строка

> Насчёт грабель. Я имел в виду вот эти:

Ух ты, ну ты и достал из чулана. Про это уже много раз забыть успел,
что когда-то правил этот кусок. Да, тоже абсолютно верно, что это
натуральная грабля любого цикла к нулю, если используется беззнаковая
переменная.

Но опять же, поскольку речь  идёт об индексации символов в строке,
правильнее всё-таки просто сделать  код безопасным, чем начать смешивать
числа со знаком и без. 

-- 
Michael Pozhidaev. Tomsk, Russia.
Russian info page: http://www.marigostra.ru/


Подробная информация о списке рассылки Homeros