>В последнее время стало появляться много сообщений об обнаружении в разных программах >ошибок, связанных с целочисленным переполнением. >Допустим у нас есть код, где одна переменная время от времени увеличивается >на некоторое заранее неизвестное значение. Например так: > >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. По крайней мере это характерно для платформы ИНТЕЛ) > >Вопрос: как правильно отслеживать факт целочисленного переполнения? if ( counter > ~delta ) fprintf( stderr, "Overflow!!!\n" );
|