c++ - 在 Visual Studio C++ 2012 上检测缓冲区溢出的静态分析

标签 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' 行的运行时异常?

按照其他帖子中的建议设置/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/

相关文章:

c++ - 图像的逐行像素检查

C++ Sleep 函数没有按预期工作

c++ - 为什么 MSVC 编译器会在没有警告或错误的情况下授予对此私有(private)函数的访问权限?

c++ - 监控事件目录事件

visual-studio-2012 - 在 Visual Studio 2012 中添加外键

c# - LINQ 根据列名动态选择列

.net - Visual Studio 2012 winform 设计器非常慢

C++ 将已存在的对象实例公开给脚本语言

c++ - “安全”DLL 注入(inject)

c++ - 插入和替换成本不统一的 Levenshtein 距离 :