为什么`__builtin _ {{s,u} {add,sub,mul} ll_overflow`给出一个`long int`结果而不是`long long int`结果?

时间:2015-06-01 18:49:32

标签: c gcc clang

GCC中溢出检查add / subtract / multiply builtins的int版本返回int结果(好),long int版本返回long int结果(也很好),但long long int版本返回long int结果(不好)。为什么是这样?这对我来说似乎很疯狂。

示例:

bool __builtin_uadd_overflow (unsigned int a, unsigned int b, unsigned int *res)
bool __builtin_uaddl_overflow (unsigned long int a, unsigned long int b, unsigned long int *res)
bool __builtin_uaddll_overflow (unsigned long long int a, unsigned long long int b, unsigned long int *res)

这太破碎了,我甚至不敢相信。这意味着在longlong long大小不同的目标(例如,32位ARM iOS目标)上,ll版本的函数完全没用。

1 个答案:

答案 0 :(得分:6)

这是GCC中的一个尚未修复的错误。

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65007