gpt4 book ai didi

c++ - 如果从 noreturn 函数返回未定义的行为,如果它通过调用另一个 noreturn 函数返回?

转载 作者:行者123 更新时间:2023-12-03 23:00:05 24 4
gpt4 key购买 nike

假设我正在制作一个持久的应用程序,并且预计不会因任何正常原因而终止(例如用户终止应用程序,例如:HTTP 服务器)。
我标main本身具有 C++11 标准属性 [[noreturn]] ,表明它绝不能在不中止或抛出异常的情况下将控制权返回给被调用者。

[[noreturn]] int main(
int const argc,
char const * const[] argv
) { ... }
我首先解析 CLI 参数,然后将提取的数据传递到我的“真实”主函数中,在那里继续进行更多的工作。
另一个函数,我们称之为 realMain , 也标记为 [[noreturn]] .
在我的代码中,我给出了 main函数返回语句到 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 而不是调用 realMain ?)

最佳答案

Is it safe to return into other noreturn functions, or is this undefined behavior?


我想知道这里是否有一些语言困惑。
我不确定你的意思是不是 main() 的 UB使用来自 realMain() 的假设返回值返回它永远不应该得到;或者如果它是 realMain() 的 UB返回 main() .
无论如何,基于 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()确实,它已经是 UB,因为 realMain()首先打破了“noreturn”的 promise 。
但由于两者都不应该返回,我不明白你为什么要写 return在任何情况下,而不是例如只需将电话留到 realMain()作为 main()的最后一句话,一去不复返。

关于c++ - 如果从 noreturn 函数返回未定义的行为,如果它通过调用另一个 noreturn 函数返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66414510/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com