最近のプロジェクトでは、実行時に「Buffer too small」が表示されました.
1261 ワード
int __cdecl _vsprintf_s_l (
char *string,
size_t sizeInBytes,
const char *format,
_locale_t plocinfo,
va_list ap
)
{
int retvalue = -1;
/* validation section */
_VALIDATE_RETURN(format != NULL, EINVAL, -1);
_VALIDATE_RETURN(string != NULL && sizeInBytes > 0, EINVAL, -1);
retvalue = _vsnprintf_helper(_output_s_l, string, sizeInBytes, format, plocinfo, ap);
if (retvalue < 0)
{
string[0] = 0;
_SECURECRT__FILL_STRING(string, sizeInBytes, 1);
}
if (retvalue == -2)
{
_VALIDATE_RETURN(("Buffer too small", 0), ERANGE, -1); //
}
if (retvalue >= 0)
{
_SECURECRT__FILL_STRING(string, sizeInBytes, retvalue + 1);
}
return retvalue;
}
最初は私のプログラムの中のwsprintfとsprintfが出した問題だと思って、それからインターネットで探してみて、もとはCStringを使う時Formatという関数を使って、パラメータが直接文字列の配列に与える時、このような運行時の誤りが発生する確率があって、今先にCStringで値を割り当てて、それからパラメータをして、例えば:
char sz_SysDirPath[MAXBYTE] = "";
GetSystemDirectory(sz_SysDirPath,MAXBYTE);
CString csSysDirPath = sz_SysDirPath;
CString cs_DriverPath;
cs_DriverPath.Format("%s\\memory.sys",csSysDirPath.GetBuffer(0));