请看下面的代码:
很明显缺少返回值。在这种情况下,对于ARM处理器的clang和ndk编译器都会生成一个无限循环。反汇编后可以看出编译器生成的是普通分支指令而非条件分支。
float test(int len, int* tab)
{
for(int i = 0; i<len; i++)
tab[i] = i;
}
很明显缺少返回值。在这种情况下,对于ARM处理器的clang和ndk编译器都会生成一个无限循环。反汇编后可以看出编译器生成的是普通分支指令而非条件分支。
mov r0, #0
.LBB0_1:
str r0, [r1, r0, lsl #2]
add r0, r0, #1
b .LBB0_1
这里可以找到一个出错的示例: https://godbolt.org/z/YDSFw-
请注意,C++规范说明缺少返回值被视为未定义行为,但仅涉及返回值。它不应影响前面的指令。
我有遗漏什么吗?有什么想法吗?
9.6.3
中的第二部分“返回语句”指出:“否则,从函数(main
除外)(6.8.3.1)的末尾流出会导致未定义行为”。对我来说,这并没有说明未定义性只适用于返回值是什么。 - Michael