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é!

Était-ce utile?

La solution

C'est un bug de GCC!

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.
  •   
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top