最近在项目中看到不知名的某位人士调用snprintf_s 这个函数,然后尝试调用这个接口时出现了崩溃,可能接口不常用,竟然没人发现,尝试找出其中原因。
问题描述:
这段代码运行到delete 时会导致崩溃。
函数描述:
int _snprintf_s(
char *buffer,
size_t sizeOfBuffer, // 打算用于存储的缓冲区的宽度,也就指定了当前有效的缓冲区的大小
size_t count, //当后面参数得到的内容宽度超出了sizeofBuffer之后,避免缓冲区溢出,程序会自动截取count宽度的内容,并且追加一个结束符,也就是说count最多指定为sizeofBuffer-1
const char *format [,
argument] ...
);
对pbuf的内存调试发现:
第一次进for循环时时正常的
从第二次开始便会越界访问其他内存地址
所以就导致了后面在delete时会发生崩溃的情况。
分析原因: 在for循环内,运行多次之后,对未申请的内存空间进行的修改,而导致的原因是每次指针偏移,但是传入缓冲区长度的第二个参数没有变,而_s的函数自带机制中,会对每次写入后多余的空间进行一个赋值操作,sprintf_s赋-3,snprintf_s赋-2,所以当最初申请的空间用完之后就会越界,导致释放出错。
修改方案:
对每次传入参数和偏移做一个同步,防止越界。
最后总结:希望大家不管是在调用系统自带的api还是自己封装的接口时,都要考虑动态情况,做好边界值的把控和对内存的合理使用。