我在Android NDK编译器(r16b)中发现了一个错误。代码段如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int frameWidth = 208;
int main(int argc, char* argv[])
{
int32_t count = (argc > 1) ? atoi(argv[1]) : -1;
int width = frameWidth;
int rows = count / (width * sizeof(int16_t));
if (rows >= 3) {
printf("rows=%u\n", rows);
} else {
printf("count=%d rows=%d\n", count, rows);
}
}
问题是gcc / llvm编译器将除法视为无符号除法。您可以通过将代码编译为cmdline可执行文件并在不带参数或负数的情况下运行和/或生成汇编代码并查看arm源代码来查看这一点:
@DEBUG_VALUE: main:count <- %R4
.loc 1 11 22 is_stmt 0 @ ./main.c:11:22
mov r0, r4
.Ltmp8:
bl __aeabi_uidiv
mov r2, r0
.Ltmp9:
@DEBUG_VALUE: main:rows <- %R2
.loc 1 12 9 is_stmt 1 @ ./main.c:12:9
cmp r2, #3
blt .LBB0_5
我在哪里报告此错误,以便可以对其进行修复?我可以想象我们的代码中还有其他地方应该有一个符号分隔。