这次遇到的奔溃问题,和从一次奔溃谈谈strncpy_s中有异曲同工之处:程序在执行到某个点后,瞬间干干净净的退出,也没有dmp文件生成。根据环境确定了怀疑点后,在TerminateProcess函数上加断点,然后运行程序,程序在TerminateProcess上中断下来,堆栈如下(简化模型):
问题出在_snprintf_s上,奔溃原因是_invalid_parameter_noinfo函数中调用了TerminateProcess函数,看意思是参数有问题。
_snprintf_s的有两种重载方式(stdio.h中),第一种如下:
__DEFINE_CPP_OVERLOAD_SECURE_FUNC_0_2_ARGLIST(
_Success_(return >= 0)
int, _snprintf_s, _vsnprintf_s,
_Post_z_ char, _Buffer,
_In_ size_t, _BufferCount,
_In_z_ _Printf_format_string_ char const*, _Format
)
第二种是:
_Success_(return >= 0)
_Check_return_opt_
_CRT_STDIO_INLINE int __CRTDECL _snprintf_s(
_Out_writes_z_(_BufferCount) char* const _Buffer,
_In_ size_t const _BufferCount,
_In_ size_t const _MaxCount,
_In_z_ _Printf_format_string_ char const* const _Format,
...)
第一种是只有一个长度参数_BufferCount,第二种有两个长度参数:_BufferCount和_MaxCount。
乍一看之下,第一种和第二种之间没啥区别,只在于差一个长度参数。
等等,第一种好像有点怪。这里先卖个关子(如果眼力尖,可能已经看出来了),后续揭晓。
MSDN对_snprintf_s参数的解释如下:
1. _BufferCount:_Buffer的大小
2. _MaxCount:可存储的最大字符数
MSDN对返回值的说明如下:
1. _snprintf_s returns the number of characters stored in buffer, not counting the terminating null