Est-ce un bogue dans GCC ou est mon mauvais code?
-
09-10-2019 - |
Question
Je le code C:
int test(signed char anim_col)
{
if (anim_col >= 31) {
return 1;
} else if (anim_col <= -15) {
return -2;
}
return 0;
}
compilant au code suivant avec le pouce de -Os utilisant Android NDK R4b:
test:
mov r3, #1
cmp r0, #30
bgt .L3
mov r3, #0
add r0, r0, #14
bge .L3
mov r3, #2
neg r3, r3
.L3:
mov r0, r3
bx lr
Mais avec la dernière Android NDK r5 il compile à ce code cassé:
test:
mov r3, #1
cmp r0, #30
bgt .L3
lsl r0, r0, #24
lsr r0, r0, #24
mov r3, #0
cmp r0, #127 @@ WTF?! should be <= -15 @@
bls .L3
mov r3, #2
neg r3, r3
.L3:
mov r0, r3
bx lr
Cela semble étrange .... Si anim_col est inférieure à 0, il retourne -2 au lieu de seulement -2 retour quand inférieure ou égale à -15. La ligne de commande complète de reproduire est la suivante:
android-NDK-R4b / build / préconstruits / linux-x86 / bras-eabi-4.4.0 / bin / bras eabi-gcc -c -o test.o -OS Test.c --save-temps - mthumb
et
android-NDK-r5 / toolchains / bras-linux-androideabi-4.4.3 / préconstruits / linux-x86 / bin / bras-linux-androideabi-gcc -c -o test.o -Os test.c - save-temps -mthumb
Est-ce un bug connu de GCC? Je trouve difficile à croire, cela ne se produit pas dans la vraie vie! Certes, mon code est erroné!
La solution
Au NDK R5b , ce bug a été corrigé.
Cette version du NDK ne inclure toutes les nouvelles fonctionnalités par rapport à r5. Les adresses de libération de la R5b suite à des problèmes dans la version r5:
- Correction d'un bogue du compilateur dans le arm-linux-androideabi-4.4.3 toolchain. Le binaire précédent généré invalide des séquences d'instructions pour le pouce lorsque traitant de caractères signés.