在信号处理程序中不允许对象或函数



我正在寻找"信号处理程序中不允许的对象或函数"的定义。它用于N3797:

第3.6.3/4节

如果使用标准库对象或函数而不是在信号处理程序(18.10)中被允许,以前没有发生过(1.10)完成静态存储对象的销毁std::atexit注册函数(18.5)的持续时间和执行程序有未定义的行为

在一般情况下,我想找到一个例子,这个UB规则

在18.10/9引述的草稿中:

C和c++语言的公共子集包括可能出现在格式良好的c++程序和符合标准的C程序中的所有声明、定义和表达式。一个POF("普通旧函数")是一个函数,它只使用这个通用函数的特性子集,它不直接或间接使用任何函数不是POF,但它可以使用第29条定义的函数它们不是成员函数。所有的信号处理程序都应该有C联系。一种POF,可以在规范中用作信号处理程序C程序作为信号使用时不会产生未定义行为c++程序中的处理程序。c++程序中用作信号处理程序的任何其他函数的行为都是由实现定义的。228

在信号处理程序中允许的

是在c++和C中都有效的函数。此外,你可以使用原子非成员函数(第29条)。实现可能允许其他函数工作,但请注意:

228)特别是,使用异常处理的信号处理程序非常可能会有问题。另外,调用std::exit可能会导致对象的销毁,包括标准库中的对象类中产生未定义的行为信号处理程序(见1.9).

根据你引用的规则,在大多数情况下,在main完成后,留下一些线程运行,所有静态变量都被销毁,将导致UB。只有当函数是信号安全的并且不使用标准库时才允许。

最新更新