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编译器中使用其实并不安全,需要谨慎对待。
|
作者:逆向人 公众号:逆向人 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |

浙公网安备 33010602011771号