惊讶,微软的所谓“安全的”文字列拷贝函数strcpy_s 居然非常粗暴(只在Debug版发生)
2015-06-30 18:53
281 查看
摘要: Debug版strcpy_s简直害死人,怀疑是bug。他一上来就粗暴地把目标内存按照最大范围给全犁一遍,导致内存破坏。
要当心啊。
编译成Debug版(更明确点,是说C/C++Code生成的选项里,VC运行库 选择 Debug版, 至于DLL版或者静态都无所谓)
我使用Visual Studio 2010 Express的。
结果:
星号是表示一些不可见的字符的,例如\0,
和想象的不一样吧!
而Relase版的结果是
这就对了,不该碰得不要碰。
那这个Debug版的strcpy_s岂不是坑人?因为有的人buf准备的太小,例如4,那糟了,无关的后续内存会被破坏的一塌糊涂。堆栈都无法显示。
要当心啊。
#include <stdio.h> #include <string.h> int main() { char buf[32]; int i; printf("before strcpy_s. buf: "); for (i=0; i < sizeof(buf); i++) { buf[i] = '#'; printf("%c", buf[i]); } printf("\n"); strcpy_s(buf, sizeof(buf), "hi"); printf("after strcpy_s. buf: "); for (i=0; i < sizeof(buf); i++) { printf("%c", buf[i]); } printf("\n"); return 0; }
编译成Debug版(更明确点,是说C/C++Code生成的选项里,VC运行库 选择 Debug版, 至于DLL版或者静态都无所谓)
我使用Visual Studio 2010 Express的。
结果:
before strcpy_s. buf: ################################ after strcpy_s. buf: hi******************************
星号是表示一些不可见的字符的,例如\0,
和想象的不一样吧!
而Relase版的结果是
before strcpy_s. buf: ################################ after strcpy_s. buf: hi*#############################
这就对了,不该碰得不要碰。
那这个Debug版的strcpy_s岂不是坑人?因为有的人buf准备的太小,例如4,那糟了,无关的后续内存会被破坏的一塌糊涂。堆栈都无法显示。
相关文章推荐
- VC实现获取当前正在运行的进程
- vc中SendMessage自定义消息函数用法实例
- 深入分析C中不安全的sprintf与strcpy
- VC实现让关闭按钮成灰色不可用的方法
- VC++中的字体设置方法详解
- VC程序设计中CreateProcess用法注意事项
- VC实现批量删除指定文件的方法
- vc中使用SendMessage自定义消息函数
- vc提示unexpected end of file found的原因分析
- vc获取计算机名和ip地址的方法
- VC6.0实现读取Excel数据的方法
- VC下通过系统快照实现进程管理的方法
- VC下实现fopen支持中文的方法
- 解析VC中预编译头文件的深入分析
- VC WinExec打开指定程序或者文件的方法
- VC中CWinThread类以及和createthread API的区别分析
- VC++开发中完美解决头文件相互包含问题的方法解析
- 基于VC实现的网络监听功能程序实例
- 浅析VC++中的头文件包含问题
- VC外部符号错误_main,_WinMain@16,__beginthreadex解决方法