关于stack around the variable “” was corrupted问题

错误:stack around the variable “XX” was corrupted.,中文翻译就是“在变量XX周围的堆栈已损坏”。后面在上网看了很多技术资料,发现大多数网站都有这样的文章:

Code:
  1. 把 project->配置属性->c/c++->代码生成->基本运行时检查 为 默认值 就不会报本异常。具体原因正在研究中。。。    
  2. 如果改为其他就有exception。    
  3. exception有时是有道理的    
  4. // step 1   
  5. STRINGC2& STRINGC2::operator += (const char x)   
  6. {   
  7. // if (x == 0) return *this;    
  8. char ptr[1]; // max is 1 digit    
  9. ptr[0] = x;   
  10. ptr[1] = '/0';   
  11. *this += ptr; // off to step 2 and back    
  12. return *this// step 4 crash   
  13. }   
  14. 这个也会导致上述exception。    
  15.   
  16. 问题描述:    
  17. Problem   
  18.     
  19. The following error message occurs when building on Test RealTIme environment with the cvisual7 TDP?    
  20. Run-Time Check Failure #2 - Stack around the variable 'xxx' was corrupted.     
  21.     
  22. Cause     
  23. Stack pointer corruption is caused writing outside the allocated buffer in stack memeory.    
  24.     
  25. Solution    
  26. This kind of error is detected by setting /RTC1 compiler option from menu Project -> Settings -> Configuration properties -> Build -> Compiler -> Compiler flags when using TDP cvisual7 in IBM® Rational® Test RealTime environment.. This enables stack frame run-time error checking. For example, the following code may cause the above error messge.    
  27. #include <stdio.h>   
  28. #include <string.h>    
  29. #define BUFF_LEN 11 // 12 may fix the Run-Time Check Failure #2   
  30. int rtc_option_test(char * pStr);    
  31. int main()   
  32. {   
  33. char * myStr = "hello world";   
  34. rtc_option_test(myStr);   
  35. return 0;   
  36. }    
  37. int rtc_option_test(char * pStr)   
  38. {   
  39. char buff[BUFF_LEN];   
  40. strcpy(buff, pStr); //cause Run-Time Check Failure #2 - Stack around   
  41. //the variable 'buff' was corrupted.   
  42. return 0;   
  43. }   
  44.   

把“project->配置属性->c/c++->代码生成->基本运行时检查 设置为默认值,就没有这样的错误了。关于MSDN的解释是在堆栈外面读写某数据。错误是名为RTC1的编译器检测的。又看了更多的技术文章,发现这样的错误是程序员在项目到了一定大的时候,它占用的堆栈量就比较大。我也深有体会。因为自己本来编写一个类,运行时没有错,但是在添加成员属性的时候,在其它方式不变的情况下就容易发生这样的错误。所以据此我猜应该是VS2005(2008)在内部就限定了堆栈的大小,当项目足够大的时候,就会溢出。

 

以上是理论部分。

#define BUFF_LEN 11 // 12 may fix the Run-Time Check Failure #2 

问题原因在这里,存在字符越界。

posted @ 2011-09-21 15:54 陈朋 阅读(...) 评论(...) 编辑 收藏