В последнее время стало появляться много сообщений об обнаружении в разных программах ошибок, связанных с целочисленным переполнением.
Допустим у нас есть код, где одна переменная время от времени увеличивается на некоторое заранее неизвестное значение. Например так:unsigned int counter;
void accounting( unsigned int delta )
{
counter = counter + delta;
}
В определенный момент может быть достигнуто такое состояние, когда после прибавления очередной дельты у нас будет переполнение. Я придумал такой путь решения проблемы:
void accounting2( unsigned int delta )
{
if( counter < (counter + delta) )
{
counter = counter + delta;
}
else
{
printf("Overflow detected\n");
}
}
Однако этот способ аппаратно зависимый и не лишен недостатков: он не будет работать, если при переполнении не происходит циклического перехода в регистре. (т.е. допустим у нас есть восьмиразрядный регистр А, содержащий число 0xFE. Если добавить к нему 0x1, то мы получим 0xFF, а если добавить 0x3, то мы получим переполнение, и в регистре у нас будет 0x1. По крайней мере это характерно для платформы ИНТЕЛ)
Вопрос: как правильно отслеживать факт целочисленного переполнения?