C++ 潜在抛出功能信号是否安全?
根据, 评估是信号安全的,除非它包括以下之一:C++ 潜在抛出功能信号是否安全?,c++,exception,signals,undefined-behavior,C++,Exception,Signals,Undefined Behavior,根据, 评估是信号安全的,除非它包括以下之一: 抛出异常 控制输入try块或函数try块 如果信号处理程序调用包含非信号安全的计算,则该调用具有未定义的行为 这是否意味着调用一个潜在的抛出函数,例如使用noexcept说明符声明的函数,其计算结果为false,会导致未定义的行为?或者,只有在计算有效地导致抛出异常时,才是未定义的行为 以下是一个例子: static void g()noexcept(false){ 外部“C”无效信号处理器(int sig) { 试一试{ g();//总是
- 抛出异常李>
- 控制输入try块或函数try块李>
noexcept
说明符声明的函数,其计算结果为false
,会导致未定义的行为?或者,只有在计算有效地导致抛出异常时,才是未定义的行为
以下是一个例子:
static void g()noexcept(false){
外部“C”无效信号处理器(int sig)
{
试一试{
g();//总是UB
}
捕获(…){
}
g();//总是UB吗?
}
“抛出异常”应该准确地理解为:抛出异常。不多不少
输入可能引发异常的范围不是一回事。只要代码没有实际抛出异常,就不会违反信号安全性
g()
不会引发异常,因此它本身是信号安全的。即使它没有显式地noexcept(false)
,因为它不会引发异常,所以它是信号安全的
signal\u handler()
进入一个try
块,该块不是信号安全的。在信号处理程序中输入它是未定义的行为。根据您的引用,在调用g
之前,在信号处理程序中输入try
块已经是未定义的行为。信号处理程序可以做的事情非常有限。抛出的异常(即使捕获并处理)不是其中之一。考虑到signal\u handler
本身是noexcept(false)
,这可能没什么问题?@IgorTandetnik因此注释“always UB”没有尾随问号,为了比较起见,我在问题中引用并添加了try块