これはGCCのバグですか、それとも私のコードが間違っていますか?
-
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バグですか?信じがたいと思う、それは実生活では起こらない!確かに私のコードは間違っていますか?!
所属していません StackOverflow