假设我正在制作一个持久的应用程序,并且不会由于任何正常原因而终止(例如,用户终止应用程序,例如:HTTP服务器)。
我main
用C ++ 11 standard属性对其自身进行了标记[[noreturn]]
,指示该属性必须在不中止或引发异常的情况下绝对不能将控制权返回给被调用方。
[[noreturn]] int main(
int const argc,
char const * const[] argv
) { ... }
我首先解析CLI参数,然后将提取的数据传递到我的“真实”主函数中,在此继续进行更多的工作。
我们将其称为的另一个函数realMain
也标记为[[noreturn]]
。
在我的代码中,我向该main
函数返回了return语句realMain
,并迅速收到有关从noreturn函数返回的通用Clang警告。
[[noreturn]] int realMain(Data const data) {
...
std::cerr << "Unreachable!" << std::endl;
std::abort();
}
[[noreturn]] int main(...) {
...
auto const parsed_cli_args = parse(argv, argc);
...
return realMain(parsed_cli_args);
}
返回其他noreturn函数是否安全,还是这种未定义的行为?
(并且与此无关,任何编译器都可以利用这一点吗?例如,main
直接制作jmp而不是call realMain
?)
返回其他noreturn函数是否安全,还是这种未定义的行为?
我想知道这里是否存在语言混乱。
我不确定您是不是要main()
使用假设的返回值从UB中获取该值,realMain()
而该值永远不会从中得到?还是realMain()
返回的UB main()
。
无论如何,基于Casey链接到的cppreference的示例:
void q [[ noreturn ]] (int i) {
// behavior is undefined if called with an argument <= 0
if (i > 0) {
throw "positive";
}
}
我明白,仅仅具有return realMain();
在main()
不UB。如果realMain()
真的回来的话,那只是UB 。到那时为止,做什么都没有关系main()
,因为先realMain()
打破了“不归还”诺言就已经是UB 。
但是由于都不应该返回,所以我不明白为什么return
在任何情况下都要编写the ,而不是例如仅将torealMain()
作为最后一个语句保留main()
,而没有返回。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句