潜在抛出函数是信号安全的吗?
Is a potentially-throwing function signal-safe?
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。在信号处理程序中输入它是未定义的行为。
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。在信号处理程序中输入它是未定义的行为。