如何告知GCC/Clang某函数总会正常返回?
如何告知编译器某函数总会正常返回?
先看这段C代码:
double local_array[10]; /* local computations */ f(); // f()无法修改local_array,因为它没有逃逸 local_array[i] += 5.0;
如果确定f()总会正常返回,编译器可以把local_array[i] += 5.0;移到f()调用前做优化——这样能把加载-浮点加法-存储的指令序列和前置计算交错执行,提升效率。
但如果没法确定f()是否正常返回,这种优化就可能违反C标准。比如f()可能打印错误信息后直接退出程序,要是提前执行local_array[i]的访问,万一i的值非法导致内存访问无效就很危险——毕竟我们没法确认这个指针指向合法可写内存,说不定f()本身会检查并排除i的无效值。
问题来了:有没有办法告诉GCC或Clang这类编译器,某个函数一定会正常返回?
目前有nothrow属性,但它的功能和我们需要的不一样。我们需要的是noreturn属性的“对偶”——noreturn表示函数从不返回,而我们需要的是函数必定返回的标注。
背景补充:PostgreSQL曾遇到过一个问题,旧版GCC会把陷阱指令移到终止程序的函数调用前做优化,这个行为被认为是不正确的,因此需要找到合法启用这类优化的方式。
内容的提问来源于stack exchange,提问作者David Monniaux
相关产品推荐
相关产品推荐

