崩溃C++;使用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

崩溃C++;使用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,c++,visual-c++,C++,Visual C++,问题在于,您没有提供: sprintf\u s将size\u t作为第二个参数(szBuff的大小),但您没有提供该参数。相反,您给它一个constchar*,参数应该在哪里。编译此文件的唯一方法是忽略编译器警告 因此,sprintf_s看到的是: 要打印到的缓冲区 允许进入缓冲区的大量字符 StrapName.c_str()作为格式字符串 换句话说,这并不是在做你想做的事情。提供szBuff的大小作为第二个参数,我打赌您的问题会消失 是的,考虑到你所做的,我预计会到处崩溃。分配给StrapNa

问题在于,您没有提供:

sprintf\u s
size\u t
作为第二个参数(szBuff的大小),但您没有提供该参数。相反,您给它一个
constchar*
,参数应该在哪里。编译此文件的唯一方法是忽略编译器警告

因此,
sprintf_s
看到的是: 要打印到的缓冲区 允许进入缓冲区的大量字符
StrapName.c_str()
作为格式字符串

换句话说,这并不是在做你想做的事情。提供
szBuff
的大小作为第二个参数,我打赌您的问题会消失


是的,考虑到你所做的,我预计会到处崩溃。

分配给
StrapName
的文本中的空字符是多余的。@nhahtdh:我想你把
sprintf\u s
sprintf
混淆了。另外,假设
int
为32位也不是很容易移植的。@NiklasB.:好的。我明白了,因为这是Windows的安全版本。关于
int
,我不确定是否有64位的实现(根据维基百科)。
sprintf\u s
通过引用获取
char
数组或指向
char
的指针和大小参数。@Charles:是的,我的错误。我看得不够近。szBuff声明如下:char szBuff[1024];除非
szBuff
确实是一个数组,并且他使用的是模板版本。(旁白:我不知道为什么有人会开发一个模板重载,其中参数以如此危险的方式移动,并且仍然使用
\u s
作为后缀。)@Charles:Wow,我甚至没有看到这一点。真糟糕的设计。对不起,米努,也许我错了。好吧,但我有另一个代码部分,如下“sprintf_s(szBuff,“句柄%d有%d个项目”,nSize,nItemSize),即,带有固定整数参数。这会成为问题吗?
int sprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   const char *format [,
      argument] ... 
);