gpt4 book ai didi

c++ - 调用 [[noreturn]] 函数和破坏顺序

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

考虑到下面的代码,我或者更确切地说是原始代码的开发者,期望函数本地对象在调用 [[noreturn]] fubar() 之前被销毁。功能。

#include <iostream>
#include <iostream>

using std::cout;
using std::endl;

class Static
{
public:
Static() { cout << "Static::Static" << endl; }
~Static() { cout << "Static::~" << endl; }
};

class Automatic
{
public:
Automatic() { cout << "Automatic::Automatic" << endl; }
~Automatic() { cout << "Automatic::~" << endl; }
};

[[noreturn]] void fubar() {
cout << "It's FUBAR" << endl;
throw 42;
}

void foo() {
Automatic a;
static Static b;

fubar();
cout << "It's fine." << endl;
}

int main()
{
try {
foo();
}
catch(int a)
{
cout << "main() was FUBARed. Answer is " << a << endl;
}
return 0;
}
显然这不是真的。例如。使用 GCC 10 编译后的输出显示 Automaticfubar 之后被销毁已输入,但它发生在捕获异常之前。这与 fubar() 不是 noreturn 的行为完全相同。 .
Automatic::Automatic
Static::Static
It's FUBAR
Automatic::~
main() was FUBARed. Answer is 42
Static::~
这是一种定义的行为吗?这是异常处理堆栈展开的结果。进一步调查显示 exit(0); (声明为 [[noreturn]] 本身)。
[[noreturn]] void fubar() {
cout << "It's FUBAR" << endl;
exit(0);
}
导致自动装置的不完全破坏:
Automatic::Automatic
Static::Static
It's FUBAR
Static::~
这实际上是否意味着调用 standard functions声明为 [[noreturn]] 对于在进程执行后不进行清理的操作系统来说是一个很大的“不”,并且如果任何此类调用是可能的,则使用局部变量来初始化任何操作系统范围的资源是不安全的(不会发生适当的取消初始化)还是我发现了一个缺陷?

最佳答案

It's exactly same behaviour as if fubar() wasn't noreturn.


正如预期的那样; [[noreturn]]这里是红鲱鱼,如 fubar()不返回(因此满足该属性旨在发出信号的要求)。
来自 [dcl.attr.noreturn]/2[dcl.attr.noreturn]/3 [ 重点矿]:

/2 If a function f is called where f was previously declared with the noreturn attribute and f eventually returns, the behavior is undefined. [ Note: The function may terminate by throwing an exception. — end note ]

/3 Recommended practice: Implementations should issue a warning if a function marked [[noreturn]] might return.

[[noreturn]]属性仅对于在某些执行路径中返回的函数是必不可少的(这是编译器可能帮助标记的错误);即注释为 [[noreturn]] 的函数实际上确实会返回导致未定义的行为,建议编译器标记包含 [[noreturn]] 的返回程序路径的程序带有警告的注释函数。

关于c++ - 调用 [[noreturn]] 函数和破坏顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65732730/

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