以下代码写入内存中的无效区域,但没有编译错误。
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'
行的运行时异常?
按照其他帖子中的建议设置/RTCs 和/GS 标志没有帮助。
运行 Visual Studio 代码分析(ANALZYE -> 运行代码分析)也没有结果。
这里有第三方工具列表:C++ static code analysis tool on Windows但我希望有一种方法可以仅通过 Visual Studio 检测到这一点?
最佳答案
根据 http://msdn.microsoft.com/en-us/library/8dbf701c.aspx ,/GS (Buffer Security Check) 是在运行时进行的,而不是编译型的。
/RTCs(根据 http://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx )控制运行时检查。因此,这两个开关都不是设计用于对代码进行静态分析的。也就是说,它们不应该在编译时检测到您的问题。
我认为静态代码分析总体上仍处于研究阶段,我很惊讶 VS 2012 将提供全面的支持。
另一种可能性是您尝试检测的特定类型的错误是数组越界错误。缓冲区溢出可能不是进行搜索的正确关键字。
关于c++ - 在 Visual Studio C++ 2012 上检测缓冲区溢出的静态分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21689875/