潜在抛出函数是信号安全的吗?

Is a potentially-throwing function signal-safe?

根据support.signal

An evaluation is signal-safe unless it includes one of the following:

  • ...
  • throwing of an exception;
  • control entering a try-block or function-try-block;
  • ...

A signal handler invocation has undefined behavior if it includes an evaluation that is not signal-safe.

这是否意味着调用一个潜在的抛出函数,例如用 noexcept 说明符声明的计算结果为 false 的函数,会导致未定义的行为?或者如果评估有效地导致抛出异常,它只是未定义的行为吗?

这是一个例子:

static void g() noexcept(false) {}
 
extern "C" void signal_handler(int sig)
{
    try {
        g(); // always UB
    }
    catch (...) {
    }

    g(); // always UB?
}

“抛出异常”应该按字面理解,准确地说:抛出异常。不多也不少。

进入一个可能会抛出异常的范围不是一回事。只要代码实际上没有抛出异常,就没有违反信号安全。

g() 最终不会抛出异常,因此,就其本身而言,它是 signal-safe。即使它不是显式 noexcept(false),因为它不会抛出异常,所以它是信号安全的。

signal_handler()进入一个try块,不是signal-safe。在信号处理程序中输入它是未定义的行为。