7

私はこのCコードを持っています:

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

これは、AndroidNDKr4bを使用して-Os-mthumbを使用して次のサムコードにコンパイルされます。

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

しかし、最新のAndroid NDK r5では、次の壊れたコードにコンパイルされます。

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

これは...奇妙に思えます。anim_colが0未満の場合、-15以下の場合に-2を返すだけでなく、-2を返します。これを再現するための完全なコマンドラインは次のとおりです。

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

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

これは既知のGCCバグですか?信じがたいことですが、それは現実には起こりません。確かに私のコードは間違っていますか?!

4

1 に答える 1

3

これはGCCのバグです。

NDK r5bの時点で、このバグは修正されています。

このリリースのNDKには、r5と比較した新機能は含まれていません。r5bリリースは、r5リリースの次の問題に対処します。

  • arm-linux-androideabi-4.4.3ツールチェーンのコンパイラのバグを修正します。以前のバイナリは、符号付き文字を処理するときに無効なサム命令シーケンスを生成しました。
于 2010-12-08T09:54:18.003 に答える