c++ - sprintf 缓冲区全局数据溢出 - 如何检测它,Windows

标签 c++ visual-studio-2012 embedded windows-ce static-analysis

我想知道是否有可能在 Windows 中以某种方式检测到这种缓冲区溢出。缓冲区是全局的(不在堆栈上)所以 Visual Studio 2008 中的/RTC,VS2012 不检查它。 MinGW gcc 也失败了。

#include <stdio.h>
char buffer[2];
void main()
{
  sprintf(buffer,"12345");
}

我的第一个想法是静态分析。

  1. VS2012 代码分析:无
  2. CppCheck:无
  3. PCLint 在线:无 (http://www.gimpel-online.com/OnlineTesting.html)
  4. PVS-Studio:没有

另一种解决方案是使用 _s 版本。

#include <stdio.h>
char buffer[2];
void main()
{
  sprintf_s(buffer, sizeof(buffer), "12345");
}

但是代码看起来像那样

#include <stdio.h>
char buffer[2];
void main()
{
  sprintf_s(buffer, 20, "12345");
}

仍然存在未检测到缓冲区溢出的相同问题。

是否可以在全局数据(如堆栈)上使用内存保护、金丝雀,或者使用更好的静态、动态分析来解决这个问题?

最佳答案

我是一名 Cppcheck 开发人员。 Cppcheck 应该很容易检测到这一点。你用的是什么 Cppcheck 版本?最新的 Cppcheck 版本是 1.64。

这是使用 cppcheck-1.64 时的预期输出:

danielm@HP-Z220-2CMT:~/cppcheck$ ./cppcheck a.c 
Checking a.c...
[a.c:5]: (error) Buffer is accessed out of bounds.

关于c++ - sprintf 缓冲区全局数据溢出 - 如何检测它,Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22684670/

相关文章:

c - 构建时删除并写入闪存会出错

c++ - gcc 中的新位置

c++ - 通过 C 接口(interface)传递 C++ i/o 类的特定于编译器的问题

c++ - CMake 和 Visual Studio 构建错误

c - C语言中的 '##'是什么?

c++ - 从 Atmel Studio 6 运行单元测试

c++ - 从文件中读取数字

c++ - 绘制真实坐标

c++ - Qt Creator 找不到cl.exe(VS2012)编译器

c# - 如何在更改存储库路径后重置 HintPath