使用单个变量作为GCC的__builtin_*_overflow
函数的源和目标是否合法?
例如,给定以下代码:
int a, b;
我想把一个被检查过的 a += b
写成
__builtin_add_overflow(a, b, &a)
这个安全吗?
__builtin_add_overflow(a, b, &a)
的作用等同于 a += b
。__builtin_add_overflow(10, 5, &a)
#include <stdio.h>
int main(void)
{
int a = 10;
int b = 5;
__builtin_add_overflow(a, b, &a);
printf("%d\n", a);
}
在GCC 6.3.0上使用-O0进行翻译,得到的结果为(参见godbolt.org/g/UJqenc):
mov DWORD PTR [rbp-8], 10 ; place a and b on stack
mov DWORD PTR [rbp-4], 5
mov edx, DWORD PTR [rbp-8] ; copy a and b into GP registers
mov eax, DWORD PTR [rbp-4]
add eax, edx
mov DWORD PTR [rbp-8], eax ; move the sum into a
mov eax, DWORD PTR [rbp-8]
mov esi, eax ; pass a into printf
mov edi, OFFSET FLAT:.LC0
mov eax, 0
call printf
a/b
是用汇编实现的。对于真正使用汇编实现的函数,存在代码生成方面的影响,而这并不适用于内置函数。 - zneak
__builtin_*_overflow_p()
如何实现为真正的函数呢? - EOF&a
,破坏它,然后再评估a
...如果我没有漏掉什么的话。 - Eugene Sh.