bug拾遗(一):低版本vs下不那么安全的_snprint_s

最近接手了公司一个老项目,使用vs2005+MFC开发,有些代码写的比较晦涩难懂,不太容易跟踪完整的流程,就想着打印堆栈信息看调用流程,其中一些字符串的复制用到了

_snprint_s。但发现一运行程序就弹窗报错:Stack around the variable 'buffer' was corrupted.错误发生在离开作用域销毁缓冲区时时。但根据官方对_snprint_s的使用说明,

并没有特别的疑问之处。于是写了段测试代码来验证_snprint_s到底安不安全。

测试代码:

#include <stdio.h>
int main()
{

    char buffer[4];
    _snprintf_s(buffer,_TRUNCATE,"%s","12345"); //error
    printf("%s",buffer);
    return 0;
}; 

vs2005下弹窗报错,这是典型的栈被破坏的错误提示。注意窗口输出12345,这表明,_snprint_s函数并未按照缓冲区的大小去截断字符串,而是全部填充了。

直接破坏了缓冲区...

 

 

 

 

 vs2013下,则进行了正确的截断,输出正常,且缓冲区周围没有被填充字符。

 

 

 这表明,_snprint_s在低版本vs编译器中使用其实并不安全,需要谨慎对待。

 

 

posted @ 2019-11-11 16:11  逆向人  阅读(345)  评论(0)    收藏  举报