这是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版本中的以下问题:

  • 修复arm-linux-androideabi-4.4.3工具链中的编译器错误。 处理带符号的字符时,先前的二进制生成无效的Thumb指令序列。
  • 链接地址: http://www.djcxy.com/p/4001.html

    上一篇: Is this a bug in GCC or is my code wrong?

    下一篇: Attribute similar to [ActionName] but for controller