如何解决潜在抛出的函数信号安全吗?
除非包含以下任一内容,否则评估是信号安全的:
- ...
- 引发异常;
- 输入try-block或function-try-block的控件;
- ...
如果信号处理程序调用包含不安全信号的评估,则它具有未定义的行为。
这是否意味着调用潜在抛出的函数(例如用noexcept
说明符声明且其结果为false
的函数)会导致未定义的行为?还是评估有效地导致抛出异常,这只是未定义的行为?
这里是一个例子:
static void g() noexcept(false) {}
extern "C" void signal_handler(int sig)
{
try {
g(); // always UB
}
catch (...) {
}
g(); // always UB?
}
解决方法
“抛出异常”应从字面上准确地进行:抛出异常。没什么,没什么。
输入可能引发异常的范围不是一回事。只要代码实际上没有引发异常,就不会违反信号安全性。
g()
不会引发异常,因此它本身是信号安全的。即使它不是明确地noexcept(false)
,因为它不会引发异常,所以它是信号安全的。
signal_handler()
进入一个try
块,该块不是信号安全的。在信号处理程序中输入它是未定义的行为。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。