Considérons le programme suivant.
#include <stdio.h>
int negative(int A) {
return (A & 0x80000000) != 0;
}
int divide(int A, int B) {
printf("A = %d\n", A);
printf("negative(A) = %d\n", negative(A));
if (negative(A)) {
A = ~A + 1;
printf("A = %d\n", A);
printf("negative(A) = %d\n", negative(A));
}
if (A < B) return 0;
return 1;
}
int main(){
divide(-2147483648, -1);
}
Lorsqu'il est compilé sans les optimisations du compilateur, il produit les résultats attendus.
gcc -Wall -Werror -g -o TestNegative TestNegative.c
./TestNegative
A = -2147483648
negative(A) = 1
A = -2147483648
negative(A) = 1
Lorsqu'il est compilé avec les optimisations du compilateur, il produit la sortie incorrecte suivante.
gcc -O3 -Wall -Werror -g -o TestNegative TestNegative.c
./TestNegative
A = -2147483648
negative(A) = 1
A = -2147483648
negative(A) = 0
Je suis en train de courir gcc version 5.4.0
.
Puis-je modifier le code source pour empêcher le compilateur de produire ce comportement ? -O3
?