使用sprintf_s崩溃C ++应用程序而不指定字符串长度

时间:2012-06-29 11:13:06

标签: c++ visual-c++

我有一个c ++应用程序,其中客户报告了崩溃。但崩溃不容易重现。 在分析了一些日志之后,我发现崩溃可能发生在以下代码部分之间。如果我有这些代码声明,请告诉我有没有机会崩溃应用程序?

    //Tesrt
    std::string strAppName = "App1\0";
    int nSize = 10;
    sprintf_s(szBuff, "The appname %s have %d dependancies ", strAppName.c_str(), nSize);
    //Then use the szBuff to log to a text file
    //Test end

1 个答案:

答案 0 :(得分:2)

问题是您没有提供correct arguments to sprintf_s

int sprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   const char *format [,
      argument] ... 
);

sprintf_s获取size_t作为第二个参数(szBuff的大小),但您没有提供。相反,你给它一个const char *那个参数应该是。{1}}。编译它的唯一方法是让您忽略编译器警告。

所以sprintf_s看到的是: 缓冲区打印成 允许大量字符进入缓冲区 strAppName.c_str()作为格式字符串

换句话说,这并不像你想要的那样做。提供szBuff的大小作为第二个参数,我敢打赌你的问题就会消失。

是的,鉴于你所做的一切,我希望能在整个地方崩溃。