Oto fragment kodu z GNU C reference manual Pg 74:Gdzie jest drugi przelew w tym kawałku kodu
Jeśli kod wykorzystuje podpisaną indeksu pętli, upewnij się, że indeks nie może przelewowy, wraz z wszystkie podpisane wyrażenia wyprowadzone z indeksu. Oto przykładowy kod źródłowy z dwoma wystąpieniami przepełnienia .
for(i = INT_MAX - 10 ; i <= INT_MAX; i++)
if(i+1 < 0) //first overflow
{
report_overflow();
break;
}
Ze względu na dwa przepełnienia, kompilator może zoptymalizować dala lub przekształcenia dwóch porównań w sposób, który jest niezgodny z zawijanym założeniu.
Czy możesz wyjaśnić nieco więcej, jakie jest twoje pytanie? – Sorcrer
Drugim może być 'i <= INT_MAX; i ++ ' –
' i <= INT_MAX' jest zawsze prawdziwe, więc pętla nigdy nie może przestać istnieć – mvp