【问题标题】:buffer overflow does not happen when it should?缓冲区溢出不应该发生在什么时候?
【发布时间】:2012-09-19 11:53:28
【问题描述】:

昨天我在我的 proggy 中遇到了一个我无法确定的错误。在使用该软件数小时后,它突然崩溃并向我显示以下类型的消息(可能不一样,因为我只能重现一次并且没有保存该消息 - 但这是一个 BEX 错误,使用了另一个代码sn-p,见下文):

Problemsignatur:
  Problemereignisname:  BEX
  Anwendungsname:   ----.exe
  Anwendungsversion:    0.0.0.0
  Anwendungszeitstempel:    5059a92f
  Fehlermodulname:  ----.exe
  Fehlermodulversion:   0.0.0.0
  Fehlermodulzeitstempel:   5059a92f
  Ausnahmeoffset:   0000cae3
  Ausnahmecode: c0000417
  Ausnahmedaten:    00000000
  Betriebsystemversion: 6.0.6000.2.0.0.---.-
  Gebietsschema-ID: 1031
  Zusatzinformation 1:  d752
  Zusatzinformation 2:  becd3a3c3e2751afee56698a1f79a48e
  Zusatzinformation 3:  4c74
  Zusatzinformation 4:  91af6395315cadbb5a06842f28b0d430

所以当我发现这是一个缓冲区溢出错误时,我试图找出缓冲区溢出的发生位置。我想出了一个 for 循环,它不应该工作并导致这样的错误。问题的类型大致如下:

int bob=0;int pop;
for(pop=0;pop<bob;pop++){cout<<pop;}

除了使用 pop 值代替 cout 来用元素填充数组。我在这里用零初始化它只是为了演示,在程序中,用户可以将 bob 更改为 >0 的值,但是无论 bob 是零还是 !=0,都会连续调用 for 循环。当我执行上面的代码时,proggy 立即崩溃(如预期的那样),而在实际情况下它没有,只是在很长一段时间后,即使我使用 cout 命令检查 for 循环是否确实执行。也许这是因为代码在函数内部,而该函数是从 while 循环内部调用的?

所以我的问题是,这是缓冲区溢出的最可能原因,还是我应该寻找其他地方。我真的不知道还有什么其他问题会导致这个零星且非常烦人的错误。

【问题讨论】:

    标签: loops for-loop overflow buffer


    【解决方案1】:

    在提供的示例中没有无限循环。

    第一次迭代之前的值是: 鲍勃 = 0; 弹出 = 0;

    因为0(pop)不小于0(bob),所以pop

    我个人建议使用调试器。

    【讨论】:

    • 正如我所说的,我已经通过在 for 循环中编写 cout 命令来检查 for 循环是否确实在执行:cout
    • 显然问题不在于您在此处发布的代码。如果不知道您的代码做了什么以及它是如何做的,就不可能说出出了什么问题。不能使用调试器有什么原因吗?
    • 同时我能够重现错误消息,我想我现在已经修复了它。顺便说一句,错误消息与我通过执行上面的代码 sn-p 收到的相同。因此,确实很难从这样的消息中判断到底出了什么问题。尽管如此,我仍然不知道为什么 for 循环执行一次而另一次不执行。也许是因为它在一个函数内部,该函数再次从一个 while 循环中调用。我只是将其放入 if 排除项(if (bob>0)) 中,因此它不再是可能的缓冲区溢出的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多