标题:return语句引起的栈错误 出处:Felix021 时间:Mon, 29 Dec 2008 20:28:32 +0000 作者:felix021 地址:https://www.felix021.com/blog/read.php?1370 内容: 被牛逼哄哄的Snoopy雷到了。 事情是这样的,今天打开 http://acm.whu.edu.cn/woj 检查oak的运行情况 发现在status的第二页有好多个submit都处于Running状态 ssh到服务器上去看了一下,发现Judge在Compile OK以后就挂掉了。 有一堆Stack的信息,但是看不太懂~ DEBUG了一阵,定位到了错误:在判断Restricted_Function的那个函数里面。 加入了调试代码以后的大概结构是这样的: ...... bool Restricted_Function(){ char f[30], ...; ...... cout << "DEBUG 1" << endl; return false; } ...... bool WOJ_JUDGE(){ ...... cout << "DEBUG 0“ << endl; if(Restricted_Function(){ cout << "DEBUG 2" << endl; return RF; } cout << "DEBUG 2" << endl; ...... } 然后发现非常神奇地,程序输出的是 引用 DEBUG 0 DEBUG 1 然后跟上一堆程序出现错误的信息。 于是我就懵了,居然一个return语句也能出现错误? 然后请教snoopy大牛,经过一番七荤八素的DEBUG以后,终于找到了症结所在: 原来在Restricted_Function里面定义的那个char f[30]空间太小了 由于是分配在栈空间里面的,所以在运行的时候,出现了少量越界写入的情况 在程序返回的时候,由于返回地址等被未预料到的字符覆盖了,于是就出现了上述问题。 一个return语句也能"出错",暴露出这样严重的内存使用问题 ——可能存在于任何地方,写程序的时候务必要小心啊! 同时,通过这种方式"定位"到的错误点,未必就是错误真正发生的地方! Generated by Bo-blog 2.1.0