Это ошибка в 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;
}
Это компилируется в следующий код thumb с помощью -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 вместо того, чтобы возвращать значение -2 только тогда, когда оно меньше или равно -15.Полная командная строка для воспроизведения этого выглядит следующим образом:
android-ndk-r4b/сборка/ предустановленный/linux-x86/arm-eabi-4.4.0/bin/arm-eabi-gcc -c -o test.o -Os test.c --сохранить-временные рамки -mthumb
и
android-ndk-r5/наборы инструментов/arm-linux-androideabi-4.4.3/готовые/linux-x86/bin/arm-linux-androideabi-gcc -c -o test.o -Os test.c --сохранить временные рамки -mthumb
Это известная ошибка GCC?Мне трудно поверить, что в реальной жизни такого не бывает!Неужели мой код неправильный?!
Решение
По состоянию на NDK r5b, эта ошибка была исправлена.
Этот выпуск NDK не включает никаких новых функций по сравнению с r5.В выпуске r5b решаются следующие проблемы в выпуске r5:
- Исправлена ошибка компилятора в наборе инструментов arm-linux-androideabi-4.4.3.Предыдущий двоичный файл сгенерировал недопустимые последовательности команд thumb при работе с символами со знаком.