gre*_*eth 6 c++ visual-studio-2008
我正在处理的程序有时会尝试在地址上读取数据0xCCCCCCCC.谷歌(和StackOverflow)是我的朋友我看到它是未初始化的堆栈变量的MSVC调试代码.要了解问题的来源,我试图重现这种行为:问题是我无法做到这一点.
问题是:你有一个代码片段显示指针如何指向0xCCCCCCCC?
谢谢.
Jam*_*lis 10
int main()
{
int* p;
}
Run Code Online (Sandbox Code Playgroud)
如果使用Visual C++调试运行时构建,将断点放入main()并运行,您将看到其p值为0xcccccccc.
使用/ GZ编译器开关或/ RTC开关编译代码.确保/ Od开关也用于禁用任何优化.
小号
启用堆栈帧运行时错误检查,如下所示:
将局部变量初始化为非零值.这有助于识别在调试模式下运行时未出现的错误.由于编译器优化了发布版本中的堆栈变量,因此与发布版本相比,调试版本中堆栈变量仍然更有可能为零.一旦程序使用了其堆栈区域,编译器就不会将其重置为0.因此,碰巧使用相同堆栈区域的后续未初始化堆栈变量可以返回先前使用该堆栈存储器遗留的值.
检测局部变量(如数组)的溢出和欠载./当访问由结构内的编译器填充导致的内存时,/ RTC不会检测到溢出.填充可以通过使用align(C++),/ Zp(Struct Member Alignment)或pack,或者如果您以要求编译器添加填充的方式对结构元素进行排序.
堆栈指针验证,检测堆栈指针损坏.堆栈指针损坏可能是由调用约定不匹配引起的.例如,使用函数指针,可以调用导出为__stdcall的DLL中的函数,但是将指向函数的指针声明为__cdecl.
| 归档时间: |
|
| 查看次数: |
11682 次 |
| 最近记录: |