2012-06-29 25 views
1

我有一个C++应用程序,客户在其中报告了crash.But崩溃不容易重现。 分析完一些日志后,我发现在以下代码部分之间可能发生崩溃。请告诉我,如果我有这些代码声明,它有可能会崩溃的应用程序?使用sprintf_s而不指定字符串长度的崩溃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 
+3

szBuff是如何定义的? – Jeeva

+0

分配给'strAppName'的文字中的空字符是多余的。 –

+0

@nhahtdh:我认为你把'sprintf_s'和'sprintf'混淆了。另外,假设一个“int”是32位不是很便携。 –

回答

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 *这个参数应该在哪里。编译这个的唯一方法是让你忽略编译器警告。

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

换句话说字符,这是不是做像你想要什么东西。提供szBuff作为第二个参数的大小,我会打赌你的问题消失。

是的,考虑到你所做的一切,我会期待各地的崩溃。

+0

szBuff声明如下char szBuff [1024]; – Minnu

+0

除非'szBuff'确实是一个数组,并且他正在使用模板版本。 (另外:某人可以如何开发一个模板超载,参数以这样危险的方式转移,仍然使用'_s'作为后缀,我不知道。) –

+0

@Charles:哇,甚至没有看到。真的很糟糕的设计。对不起,敏努,也许我错了。 –

相关问题