考虑以下C程序:
double local_array[10];
double *p = local_array+i;
/* local computations */
f(); // f() cannot modify the local_array since the local_array has not escaped
*p += 5.0;
如果已知f()
正常返回,那么可以在调用之前移动*p += 5.0;
,也许是为了提高效率(可以将加载-浮点加法-存储序列与前面的计算混合在一起)。
但是,如果f()
不知道是否正常返回,那么这就可能违反标准。实际上,如果f()
打印错误消息并退出,那么在它之前访问*p
可能会失败,这将是危险的(由于i
的值不正确而导致的错误指针)。我们无法知道p
是否指向有效的可写内存。也许f()
执行了排除p
无效值的检查。
所以我的问题是有没有办法告诉编译器(可能是gcc或clang)一个函数总是正常返回?
有一个nothrow
属性,但似乎略有不同。
这样的属性是noreturn
的“dual”,这意味着函数永远不会返回。
如果你想知道这是关于什么的:PostgresSQL bug #616180是关于旧版本的gcc
,假设它们可以在终止程序执行的函数调用之前进行类似的捕获指令移动(由于检测到内部错误)。我认为gcc
所做的是不正确的......但是如何才能告诉它允许执行这样的优化?
1条答案
按热度按时间ctzwtxfj1#
对于GCC:否,这样的属性不存在,甚至在编译器内部也不存在(从GCC 13开始)。
对于Clang/LLVM:LLVM IR有
willreturn
function attribute,但Clang没有为C和C++公开它。