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

时间:2014-03-27 10:23:52

标签: 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 Online:没有(http://www.gimpel-online.com/OnlineTesting.html
  4. PVS-Studio:没有
  5. 另一个解决方案是使用_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");
    }
    

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

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

4 个答案:

答案 0 :(得分:2)

由于问题标记为C ++,这个简单的解决方案可以完全避免这个问题而根本不使用本质上不安全的C库,而是使用std::ostringstream对象。

#include <sstream>

std::ostringstream buffer ;

int main() 
{
    buffer << "12345" ;
}

答案 1 :(得分:2)

我是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.

答案 2 :(得分:0)

Coverity的安全编码检查程序(SECURE_CODING)将捕获此类错误。请参阅this链接。

答案 3 :(得分:0)

您可以使用Windows SDK附带的gflags:

http://msdn.microsoft.com/en-us/library/windows/hardware/ff543097%28v=vs.85%29.aspx

您使用gflags.exe注册您的应用程序:

 gflags /p /enable pheap-buggy.exe

并且在程序执行期间,如果您在数据边界外读/写,它将抛出异常,这可以在VS调试器中捕获。

但不幸的是gflags适用于Windows桌面,因此只有在您可以为桌面构建应用程序时它才有用 - 这实际上使开发变得更加容易。