我有一段C代码:
int test(signed char anim_col)
{
if (anim_col >= 31) {
return 1;
} else if (anim_col <= -15) {
return -2;
}
return 0;
}在-Os -mthumb中,使用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但使用最新的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 -c-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 -c-temps -mthumb
这是一个已知的GCC漏洞吗?我发现很难相信,这在现实生活中是不会发生的!我的代码肯定是错的?!
发布于 2010-12-08 17:54:18
It's a GCC bug!
从NDK r5b开始,此错误已修复。
与r5相比,
此版本的NDK不包含任何新功能。r5b版本解决了r5版本中的以下问题:
https://stackoverflow.com/questions/4369265
复制相似问题