如果通过调用另一个noreturn函数返回,则从noreturn函数返回的行为是否未定义?

贾登·加西亚(Jaden Garcia)

假设我正在制作一个持久的应用程序,并且不会由于任何正常原因而终止(例如,用户终止应用程序,例如: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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果通过调用另一个noreturn函数返回,则从noreturn函数返回的行为是否未定义?

来自分类Dev

在另一个函数React返回的匿名函数中,“ this”是未定义的

来自分类Dev

当我的函数调用另一个函数时,未定义“ sqlContext”

来自分类Dev

JavaScript表示未定义被另一个函数调用的编程函数

来自分类Dev

在另一个函数中调用时未定义函数(Python)

来自分类Dev

从另一个类调用函数时属性未定义

来自分类Dev

nodejs-在另一个js文件中打印未定义的调用函数

来自分类Dev

从另一个类调用函数时属性未定义

来自分类Dev

在调用另一个函数之前返回

来自分类Dev

如果从另一个函数调用,为什么Laravel的Response :: json返回空白?

来自分类Dev

如果定义了一个函数,则单行调用,否则调用另一个函数

来自分类Dev

隐式超级构造函数Person()未定义。必须显式调用另一个构造函数?

来自分类Dev

eval(“ {}”)vs eval(“ x = {}”),一个返回未定义,而另一个{}

来自分类Dev

eval(“ {}”)vs eval(“ x = {}”),一个返回未定义,而另一个{}

来自分类Dev

返回可选的,因为它是如果返回的可选具有价值,否则调用另一个函数

来自分类Dev

为什么我不能从 python 中的另一个函数调用一个函数。函数未定义错误

来自分类Dev

为另一个函数中使用的函数获取未定义

来自分类Dev

通过将函数指针转换为void函数然后调用它来“破坏”返回值是否是未定义的行为?

来自分类Dev

MVC - 当返回视图不同时,是否可以从另一个 ActionResult 函数调用 actionResult 函数

来自分类Dev

如果-则函数返回变量未定义

来自分类Dev

RxSwift如何调用1个或多个函数以返回另一个函数

来自分类Dev

如果另一个函数没有返回错误,If 语句如何返回 True?

来自分类Dev

自调用函数返回“未定义”

来自分类Dev

js函数调用返回未定义

来自分类Dev

错误:声明为“ noreturn”的函数不应返回

来自分类Dev

我期待一个函数返回一个字符串,但似乎返回未定义。它没有通过摩卡测试

来自分类Dev

当需要另一个文件的模式时,Mongoose Populate返回未定义的

来自分类Dev

另一个异步服务返回未定义

来自分类Dev

函数声明返回另一个函数的指针

Related 相关文章

  1. 1

    如果通过调用另一个noreturn函数返回,则从noreturn函数返回的行为是否未定义?

  2. 2

    在另一个函数React返回的匿名函数中,“ this”是未定义的

  3. 3

    当我的函数调用另一个函数时,未定义“ sqlContext”

  4. 4

    JavaScript表示未定义被另一个函数调用的编程函数

  5. 5

    在另一个函数中调用时未定义函数(Python)

  6. 6

    从另一个类调用函数时属性未定义

  7. 7

    nodejs-在另一个js文件中打印未定义的调用函数

  8. 8

    从另一个类调用函数时属性未定义

  9. 9

    在调用另一个函数之前返回

  10. 10

    如果从另一个函数调用,为什么Laravel的Response :: json返回空白?

  11. 11

    如果定义了一个函数,则单行调用,否则调用另一个函数

  12. 12

    隐式超级构造函数Person()未定义。必须显式调用另一个构造函数?

  13. 13

    eval(“ {}”)vs eval(“ x = {}”),一个返回未定义,而另一个{}

  14. 14

    eval(“ {}”)vs eval(“ x = {}”),一个返回未定义,而另一个{}

  15. 15

    返回可选的,因为它是如果返回的可选具有价值,否则调用另一个函数

  16. 16

    为什么我不能从 python 中的另一个函数调用一个函数。函数未定义错误

  17. 17

    为另一个函数中使用的函数获取未定义

  18. 18

    通过将函数指针转换为void函数然后调用它来“破坏”返回值是否是未定义的行为?

  19. 19

    MVC - 当返回视图不同时,是否可以从另一个 ActionResult 函数调用 actionResult 函数

  20. 20

    如果-则函数返回变量未定义

  21. 21

    RxSwift如何调用1个或多个函数以返回另一个函数

  22. 22

    如果另一个函数没有返回错误,If 语句如何返回 True?

  23. 23

    自调用函数返回“未定义”

  24. 24

    js函数调用返回未定义

  25. 25

    错误:声明为“ noreturn”的函数不应返回

  26. 26

    我期待一个函数返回一个字符串,但似乎返回未定义。它没有通过摩卡测试

  27. 27

    当需要另一个文件的模式时,Mongoose Populate返回未定义的

  28. 28

    另一个异步服务返回未定义

  29. 29

    函数声明返回另一个函数的指针

热门标签

归档