【问题标题】:Is a segmentation fault an effect of undefined behavior?分段错误是未定义行为的影响吗?
【发布时间】:2014-09-24 21:35:48
【问题描述】:

当您访问不应该访问的内存时会发生分段错误。例如,当您取消引用数组绑定之外的地址时,也可能出现这种情况。标准将此定义为未定义的行为,那么当在这种情况下发生未定义的行为时会发生分段错误吗?

换句话说,分段错误是否是 UB 的结果,并且与执行内存访问冲突时发生的任何其他行为一样可变?

【问题讨论】:

  • 好吧,如果未定义的行为意味着任何事情都可能发生,那么分段错误就是可能发生的事情之一。
  • 哇,这越来越哲学了。无论如何,UB 可以是任何东西,但有些可以被认为“极有可能导致平台 X 上的分段错误”。此外,一些平台可以提供一种实现定义的、可靠的引发段错误(或其 Windows 等效项,访问冲突)的方式,在这种情况下,它不会是未定义的行为。
  • @Medinoc "未定义的行为" 的意思是 "C++ 标准未定义"。
  • 分段错误可能在您访问不该访问的内存时发生。
  • 这样说:标准从不说“这会导致分段错误”。因此,如果您遇到分段错误,它要么是未定义的行为,要么是在您的代码之外。

标签: c++ segmentation-fault


【解决方案1】:

“是 UB 导致的分段错误”。它们当然不是已定义行为甚至未指定行为的结果。我不认为它们是实现定义的行为。

“[它们] 是否与执行内存访问冲突时发生的任何其他行为一样可变?

它们通常更容易预测。写入分配给您的进程的内存可能会导致各种奇怪的错误。当您写入其他地址时会发生段错误,结果始终是段错误或总线错误(地址空间之外的未对齐写入仍然未对齐)

【讨论】:

  • @Deduplicator 不会触发段错误,它会触发段错误等的信号处理程序。
  • @MattMcNabb:你怎么区分?
  • 如果你的意思是从信号处理程序内部 - 你不能。但这并不能改变是否发生分段错误的事实
  • @Deduplicator:例如,raise(SIGSEGV) 在 Windows 上工作,即使它没有 SegFaults 但访问冲突。 SegFault 是一个 POSIX 的东西。此外,一个段错误集siginfo_t.si_addr
  • @MSalters:嗯,Linux 没有蓝屏,只有内核恐慌。使用不同的绰号不会改变所描述的内容。
猜你喜欢
  • 1970-01-01
  • 2021-06-21
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 2012-05-25
  • 2020-06-15
  • 2011-05-19
相关资源
最近更新 更多