它应该发生缓冲区溢出吗?

时间:2012-09-19 11:53:28

标签: loops for-loop overflow buffer

昨天我遇到了一个我无法做出头脑或尾巴的错误。经过几个小时的软件工作,它突然崩溃并向我展示了以下类型的消息(可能不一样,因为我只能重现一次并且没有保存消息 - 但这是一个BEX错误,使用另一个代码片段,请参见下文):

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;}

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

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

1 个答案:

答案 0 :(得分:0)

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

第一次迭代之前的值是:  bob = 0;  pop = 0;

因为0(pop)不小于0(bob),所以pop&lt; bob返回false,for循环不应该执行。如果正在执行for循环,请检查bob的值。也许您已将bob的变量初始化放在不执行的代码路径中。

我个人建议使用调试器。