snprintf_s使用时注意问题

       最近在项目中看到不知名的某位人士调用snprintf_s 这个函数,然后尝试调用这个接口时出现了崩溃,可能接口不常用,竟然没人发现,尝试找出其中原因。

问题描述

这段代码运行到delete 时会导致崩溃。snprintf_s使用时注意问题_第1张图片

函数描述

int _snprintf_s(
     char *buffer,
     size_t sizeOfBuffer, // 打算用于存储的缓冲区的宽度,也就指定了当前有效的缓冲区的大小
     size_t count,        //当后面参数得到的内容宽度超出了sizeofBuffer之后,避免缓冲区溢出,程序会自动截取count宽度的内容,并且追加一个结束符,也就是说count最多指定为sizeofBuffer-1
     const char *format [,
     argument] ... 
  );

 对pbuf的内存调试发现:

       第一次进for循环时时正常的snprintf_s使用时注意问题_第2张图片

从第二次开始便会越界访问其他内存地址 

snprintf_s使用时注意问题_第3张图片

所以就导致了后面在delete时会发生崩溃的情况。

分析原因: 在for循环内,运行多次之后,对未申请的内存空间进行的修改,而导致的原因是每次指针偏移,但是传入缓冲区长度的第二个参数没有变,而_s的函数自带机制中,会对每次写入后多余的空间进行一个赋值操作,sprintf_s赋-3,snprintf_s赋-2,所以当最初申请的空间用完之后就会越界,导致释放出错。

修改方案

snprintf_s使用时注意问题_第4张图片

对每次传入参数和偏移做一个同步,防止越界。

最后总结:希望大家不管是在调用系统自带的api还是自己封装的接口时,都要考虑动态情况,做好边界值的把控和对内存的合理使用。

 

你可能感兴趣的:(windows,c++)