以下代码写入内存中的无效区域但没有编译错误。
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 - &gt;运行代码分析)也没有结果。
此处发布了第三方工具列表:C++ static code analysis tool on Windows但我希望单独使用Visual Studio可以检测到这种方法吗?
答案 0 :(得分:3)
根据http://msdn.microsoft.com/en-us/library/8dbf701c.aspx,/ GS(缓冲区安全检查)在运行时执行,而不是在编译类型中执行。
/ RTC(根据http://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx)控制运行时检查。因此,这两个开关都没有设计用于对代码进行静态分析。也就是说,它们不应该在编译时检测到你的问题。
我认为静态代码分析一般还处于研究阶段,我很惊讶VS 2012会提供全面的支持。
另一种可能性是您尝试检测的特定类型的错误是数组越界错误。缓冲区溢出可能不是进行搜索的正确关键字。