这是GCC中的错误还是我的代码错了?
我有这个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,它将返回-2,而不是在小于或等于-15时返回-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错误吗? 我觉得很难相信,这在现实生活中不会发生! 当然,我的代码是错的?!
这是一个GCC错误!
从NDK r5b开始,这个bug已经修复。
与r5相比,此版本的NDK不包含任何新功能。 r5b版本解决了r5版本中的以下问题: