这是GCC中的错误还是我的代码错了?

ric*_*chq 7 gcc thumb android-ndk

我有这个C代码:

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

使用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
Run Code Online (Sandbox Code Playgroud)

但是使用最新的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
Run Code Online (Sandbox Code Playgroud)

这似乎......很奇怪.如果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错误吗?我觉得很难相信,这在现实生活中不会发生!当然我的代码错了?!

ric*_*chq 3

这是海湾合作委员会的错误!

从NDK r5b开始,此错误已得到修复。

与 r5 相比,此版本的 NDK 不包含任何新功能。r5b 版本解决了 r5 版本中的以下问题:

  • 修复了 arm-linux-androideabi-4.4.3 工具链中的编译器错误。以前的二进制文件在处理带符号的字符时生成无效的拇指指令序列。