用于检测Visual Studio C ++ 2012上的缓冲区溢出的静态分析

时间:2014-02-10 23:14:35

标签: c++ visual-c++ visual-studio-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 - &gt;运行代码分析)也没有结果。

此处发布了第三方工具列表:C++ static code analysis tool on Windows但我希望单独使用Visual Studio可以检测到这种方法吗?

1 个答案:

答案 0 :(得分:3)

根据http://msdn.microsoft.com/en-us/library/8dbf701c.aspx,/ GS(缓冲区安全检查)在运行时执行,而不是在编译类型中执行。

/ RTC(根据http://msdn.microsoft.com/en-us/library/8wtf2dfz.aspx)控制运行时检查。因此,这两个开关都没有设计用于对代码进行静态分析。也就是说,它们不应该在编译时检测到你的问题。

我认为静态代码分析一般还处于研究阶段,我很惊讶VS 2012会提供全面的支持。

另一种可能性是您尝试检测的特定类型的错误是数组越界错误。缓冲区溢出可能不是进行搜索的正确关键字。