【问题标题】:Object or function not permitted within signal handlers信号处理程序中不允许的对象或函数
【发布时间】:2014-08-29 03:59:32
【问题描述】:

我正在寻找“信号处理程序中不允许的对象或函数”的定义。它在秒内使用。 N3797 的 3.6.3/4:

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

总的来说,我想为这个 UB 规则找到一个例子。

【问题讨论】:

  • @BЈовић 感谢您的参考。但标准中有规范性参考吗?
  • 我不知道“规范性参考”是什么,但你在问题中写了标准告诉的内容。
  • @BЈовић 当然,我在 c++ 标准中寻找这个参考。

标签: c++ signals std


【解决方案1】:

在 18.10/9 的引用草案中:

C 和 C++ 语言的公共子集包括所有可能出现在格式良好的 C++ 程序和符合标准的 C 程序中的声明、定义和表达式。 POF(“plain old function”)是一种仅使用此常见功能的功能 子集,并且不直接或间接使用任何函数 不是 POF,但它可以使用第 29 条中定义的功能 不是成员函数。所有信号处理程序都应具有 C 连锁。可以用作符合标准的信号处理程序的 POF C 程序在用作信号时不会产生未定义的行为 C++ 程序中的处理程序。在 C++ 程序中用作信号处理程序的任何其他函数的行为是实现定义的。228

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

228) 特别是,使用异常处理的信号处理程序非常 可能有问题。此外,调用 std::exit 可能会导致 对象的破坏,包括标准库的对象 实现,通常会在 信号处理程序(见 1.9)。

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

【讨论】:

  • 明确答案!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多