7 Stimmen

Ist dies ein Fehler im GCC oder ist mein Code falsch?

Ich habe diesen C-Code:

int test(signed char anim_col)
{
    if (anim_col >= 31) {
        return 1;
    } else if (anim_col <= -15) {
        return -2;
    }
    return 0;
}

Das kompiliert zu folgendem Thumb-Code mit -Os -mthumb unter Verwendung von 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

Aber mit der neuesten Android NDK r5 kompiliert er zu diesem fehlerhaften Code:

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

Dies scheint ... seltsam. Wenn anim_col kleiner als 0 ist, wird -2 zurückgegeben, anstatt nur -2 zurückzugeben, wenn es kleiner oder gleich -15 ist. Die vollständige Befehlszeile, um dies zu reproduzieren, lautet wie folgt:

Android-ndk-r4b/build/prebuilt/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc -c -o test.o -Os test.c --save-temps -mthumb

y

Android-ndk-r5/toolchains/arm-linux-androideabi-4.4.3/prebuilt/linux-x86/bin/arm-linux-androideabi-gcc -c -o test.o -Os test.c --save-temps -mthumb

Ist dies ein bekannter GCC-Fehler? Ich finde es schwer zu glauben, dass so etwas im wirklichen Leben nicht vorkommt! Sicherlich ist mein Code falsch?!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X