我想知道是否有可能在 Windows 中以某种方式检测到这种缓冲区溢出。缓冲区是全局的(不在堆栈上)所以 Visual Studio 2008 中的/RTC,VS2012 不检查它。 MinGW gcc 也失败了。
#include <stdio.h>
char buffer[2];
void main()
{
sprintf(buffer,"12345");
}
我的第一个想法是静态分析。
- VS2012 代码分析:无
- CppCheck:无
- PCLint 在线:无 (http://www.gimpel-online.com/OnlineTesting.html)
- 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/