#include <stdio.h>
#include <limits.h>
void sanity_check(int x)
{
if (x < 0)
{
x = -x;
}
if (x == INT_MIN)
{
printf("%d == %d\n", x, INT_MIN);
}
else
{
printf("%d != %d\n", x, INT_MIN);
}
if (x < 0)
{
printf("negative number: %d\n", x);
}
else
{
printf("positive number: %d\n", x);
}
}
int main(void)
{
sanity_check(42);
sanity_check(-97);
sanity_check(INT_MIN);
return 0;
}
Quando compilo il programma di cui sopra con gcc wtf.c
, ottengo i risultati attesi:strano comportamento intero con gcc -O2
42 != -2147483648
positive number: 42
97 != -2147483648
positive number: 97
-2147483648 == -2147483648
negative number: -2147483648
Tuttavia, quando compilo il programma con gcc -O2 wtf.c
, ottengo un output diverso :
42 != -2147483648
positive number: 42
97 != -2147483648
positive number: 97
-2147483648 != -2147483648
positive number: -2147483648
Nota le ultime due righe. Cosa diavolo sta succedendo qui? Gcc 4.6.3 sta ottimizzando troppo un po 'troppo?
(ho anche provato questo con g ++ 4.6.3, e ho osservato lo stesso comportamento strano, quindi tag C++.)
non si sentono a proprio agio a dare consigli per possibilmente sviluppatori molto più esperti, ma in ogni caso potrebbe essere utile per non così esperti. Se vedo differenze "strane" causate solo dal livello di ottimizzazione, la prima cosa che cercherò è UB. – ThomasMore