これはGCCのバグですか、それとも私のコードが間違っていますか?

StackOverflow https://stackoverflow.com/questions/4369265

  •  09-10-2019
  •  | 
  •  

質問

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

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

Android NDK R4Bを使用して、-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 -OS TEST.C - SAVE-TEMPS -mhumb

これは既知のGCCバグですか?信じがたいと思う、それは実生活では起こらない!確かに私のコードは間違っていますか?!

役に立ちましたか?

解決

GCCのバグです!

のように NDK R5B, 、このバグは修正されました。

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

  • ARM-LINUX-ANDROIDEABI-4.4.3ツールチェーンでコンパイラバグを修正します。以前のバイナリは、署名された文字を扱うときに無効な親指命令シーケンスを生成しました。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top