请考虑下面的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
的旧版本,假设它们可以在终止程序执行的函数调用之前进行类似的trap 指令移动(由于检测到内部错误).