检测到段故障和堆栈粉碎之间的差异

时间:2016-02-03 06:22:04

标签: c

我遇到过两种错误,一种是分段错误,另一种是Stack smashing检测到的。我想知道它们之间有什么不同以及造成它们的不同原因。

4 个答案:

答案 0 :(得分:7)

这通常是未定义的行为。

  • 细分错误通常是在您的进程访问其无权访问的内存位置或该位置不存在时。

  • 堆栈粉碎是一个警报(例如由gcc生成),用于警告例如堆栈上的边界访问。通常,当堆栈被写入不应该写入的位置时会发生这种情况 - 就像写入索引超出范围的本地数组一样。

您的代码中存在产生未定义行为的问题。也许您可以与我们分享,以便我们可以帮助您。

特别检查:

  • 数组边界访问
  • NULL指针

答案 1 :(得分:2)

堆栈溢出和堆栈粉碎这两个问题都与错误的代码或变量中的值有关。 例如,当循环运行时,它运行在数组的extras索引和 然后覆盖代码的另一个变量的值,它就成了问题 到函数prolog和epilog继续下一个函数因此当前函数变得无法返回到calle函数,因为llop的溢出只是覆盖了calle指令的返回地址,因此EIP指向某个地方它不允许获取指令。所有代码进入操作系统会在内存保护方案中运行,因此会出现堆栈溢出或堆栈粉碎。 分段错误是在Linux操作系统中处理数组和指针时的正常情况。 试试这个http://www.drdobbs.com/security/anatomy-of-a-stack-smashing-attack-and-h/240001832

答案 2 :(得分:1)

分段故障是由具有内存保护的硬件引发的故障,通知操作系统(OS)存储器访问冲突。当程序的调用堆栈中存在数据溢出时,会报告堆栈粉碎。通常程序的调用堆栈是固定长度的。

答案 3 :(得分:1)

两者都是内存访问冲突。 分段错误更为通用,意味着您正在访问不允许的内容。 堆栈粉碎更具体,意味着堆栈中存在错误。 实际上,堆栈粉碎会导致分段错误。 你可以参考: https://en.wikipedia.org/wiki/Segmentation_fault 要么 Stack smashing detected