Questo è un bug nel GCC o è il mio codice errato?
-
09-10-2019 - |
Domanda
Ho questo codice C:
int test(signed char anim_col)
{
if (anim_col >= 31) {
return 1;
} else if (anim_col <= -15) {
return -2;
}
return 0;
}
che compila il seguente codice di pollice con -Os -mthumb utilizzando 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
Ma con l'ultima Android NDK R5 si compila a questo codice rotto:
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
Questo sembra ... strana. Se anim_col è minore di 0 verrà restituito -2 anziché soltanto tornare -2 quando inferiore o uguale a -15. La riga di comando completa per riprodurre questo è il seguente:
Android-NDK-R4B / build / precompilati / linux-x86 / braccio-EABI-4.4.0 / bin / braccio-EABI-gcc -c -o test.o -Os test.c --save-temps - mthumb
e
Android-NDK-R5 / toolchain / arm-linux-androideabi-4.4.3 / precompilati / linux-x86 / bin / arm-linux-androideabi-gcc -c -o test.o -Os test.c - Salva-temps -mthumb
Si tratta di un noto GCC bug? Trovo difficile credere, che non accade nella vita reale! Sicuramente il mio codice è sbagliato?!
Soluzione
NDK R5B , questo bug è stato corretto.
Questa versione della NDK non lo fa contiene nuove funzionalità rispetto a R5. Gli indirizzi di rilascio R5B le a seguito dei problemi nel rilascio r5:
- corregge un bug nel compilatore arm-linux-androideabi-4.4.3 toolchain. Il binario precedente generato non valida sequenze di istruzioni pollice quando trattare con caratteri firmati.