没有缓冲区大小的 vswprintf() 在小缓冲区而不是 EOF 上崩溃。如何传递缓冲区大小
Posted
技术标签:
【中文标题】没有缓冲区大小的 vswprintf() 在小缓冲区而不是 EOF 上崩溃。如何传递缓冲区大小【英文标题】:vswprintf() without buffer size crashes on small buffer instead of EOF. How to pass buffer size 【发布时间】:2016-01-28 00:22:03 【问题描述】:使用 Borland C++ Builder 2009
我根据 RAD Studio 的帮助 (F1) 使用 vswprintf :
int vswprintf(wchar_t *buffer, const wchar_t *format, va_list arglist);
到目前为止,我一直提供大缓冲区wchar_t OutputStr[1000]
并且从未遇到任何问题。作为一个测试并且想要做一个改进操作,我尝试了一个小缓冲区wchar_t OutputStr[12]
并注意到程序完全崩溃了。甚至trycatch(...)
也没有抓住它。 Codeguard 报告 memcpy()
失败,这似乎是内部实现。我原本期望 EOF
作为返回值。
在线搜索vswprintf
时,我发现 c++ 变体将缓冲区大小作为输入,但我似乎无法说服我的编译器使用该变体?
知道如何使用 BCB2009 强制它吗?
练习的全部目的是实现一个回退方案,当缓冲区在可能的一两个异常情况下太小时,这样我就可以为函数分配更多内存并重试。但这种机制似乎根本不起作用。
不确定如何最好地测试所需的字节/字符的确切数量?
【问题讨论】:
所有非缓冲区大小指定的sprintf...函数都有这个问题。该函数无法知道实际的缓冲区大小,因此当它们超过它时,它们无法raise()
一个错误。
或许可以试试_vsnwprintf
@M.M _vsnwprintf
有效。谢谢 !知道如何检查缓冲区太小需要多少字节/字符吗? vsnwprintf_s
本来会很好,但它不包含在 c++Builder 2009 中
@Peter 用0
调用它的大小应该返回所需的大小,而不需要写任何东西
@M.M 我试过了,但它不起作用。 MS 在线文档也没有提到它。 (msdn.microsoft.com/en-us/library/1kt27hek.aspx)
【参考方案1】:
您可以使用vswprintf_s。失败时返回负值
【讨论】:
听起来和我需要的完全一样,但BCB2009似乎不知道这个功能?这是在以后的版本中添加的吗? (包括stdio.h
)
对。 The Secure C Library 在 C++Builder 2010 中添加
_vsnwprintf
似乎可以解决问题。现在找出我需要多少字节/字符以防缓冲区不够大...
@Peter _vsnwprintf 如果 nsize 为 0,则返回所需的字节数,不包括终止 '\0' 字符。
恐怕不行。不是根据我的测试(返回 -1),也不是根据 MS 文档(msdn.microsoft.com/en-us/library/1kt27hek.aspx)以上是关于没有缓冲区大小的 vswprintf() 在小缓冲区而不是 EOF 上崩溃。如何传递缓冲区大小的主要内容,如果未能解决你的问题,请参考以下文章