[英]Why does this code emit buffer overrun warnings(C6385/C6386) in code analysis on Visual Studio 2012?
[英]Static Analysis to detect Buffer Overrun on Visual Studio C++ 2012
以下代码将写入内存中的无效区域,但没有编译错误。
int _tmain(int argc, _TCHAR* argv[])
{
char* s1 = new char[10];
for(int i=0;i<20;i++) s1[i]='a';
cout << s1 << endl;
return 0;
}
在运行时,该代码以返回代码0终止(打印20 a),然后在遇到0之前出现一些垃圾,但是我认为这非常危险,因为它可能污染/非法访问内存中的其他区域。
有什么办法可以在编译时发现这种错误? 还是至少出现一个运行时异常,直接指向s1[i]='a'
行?
按照其他帖子的建议设置/ RTC和/ GS标志没有帮助。
运行Visual Studio代码分析(ANALZYE->运行代码分析)也不会产生任何结果。
这里发布了第三方工具列表: Windows上的C ++静态代码分析工具,但我希望有一种方法可以通过Visual Studio单独检测?
根据http://msdn.microsoft.com/zh-cn/library/8dbf701c.aspx,/GS (缓冲区安全性检查)是在运行时执行的,而不是在编译类型中执行的。
/ RTC(根据http://msdn.microsoft.com/zh-cn/library/8wtf2dfz.aspx )控制运行时检查。 因此,这两个开关都不是为对代码进行静态分析而设计的。 也就是说,他们不应该在编译时检测到您的问题。
我认为静态代码分析总体上仍处于研究阶段,对于VS 2012提供全面的支持我会感到惊讶。
另一种可能性是,您尝试检测的特定类型的错误是数组越界错误。 缓冲区溢出可能不是执行搜索的正确关键字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.