无限循环或堆栈溢出之间哪个更糟?

时间:2017-05-16 07:04:38

标签: java error-handling

stackoverflow是堆栈到达堆然后停止的时候。存在与stackoverflow相关的安全问题,而无限循环只是继续运行。

有人在接受采访时问道,我回答了stackoverflow。这是对的吗?

2 个答案:

答案 0 :(得分:0)

我倾向于同意你的观点。 stackoverflow可能会导致你的直接shell之外的问题,其中无限循环只会占用处理器时间。

但这可能是一个没有正确答案的问题的例子。他们可能只是想看到你处理问题并给出一个经过深思熟虑的答案。

答案 1 :(得分:-2)

安全问题可能是由 SO 引起的,但它可能是由任何原因引起的。无限循环也会导致内存泄漏(不总是,但经常)。

缓冲区溢出通常不是由 SO 引起的,而是由缓冲区过载引起的(欺骗代码覆盖它自己的返回地址,在理想情况下是我们刚刚发送到缓冲区的内容)。但是:

  • 今天有许多防御缓冲区溢出的方法(各种地址空间随机化、编译器支持等 - 无论如何它只能在机器级代码中工作,而且今天所有最常用的语言都被解释或标记化)。
  • 可以通过将一些无法访问的页面映射到其末尾来保护堆栈,从而导致 SO 导致内存保护错误,但不会损坏堆。

两者都使程序不再运行。

不同之处在于,在 SO 中,您有一个堆栈跟踪,并且您当场知道原因是什么。它通常很容易修复(典型的修补程序是将大堆栈分配更改为动态堆分配,即在 C 中,您将 int x[BIG_BIG_NUMBER] 转换为 int *x = malloc(sizeof(int) * BIG_BIG_NUMBER); ...; free(x);

在无限循环中,您没有这些信息,而且您没有简单的方法知道程序是否处于无限循环中,或者它只是很慢。此外,最重要的是:您可以轻松调试程序的当前状态,但您没有关于导致它的先前状态的追溯信息。

基于这些原因,我认为 SO 更好。虽然这在很大程度上取决于情况。例如,由递归函数而不是由大量堆栈分配引起的 SO 可能像无限循环一样有问题。