strcpy和memcpy内存覆盖还敢用吗?

kevinyu723 2015-02-07 12:23:46
既然存在内存覆盖的可能性,并且具有随机性,在真正的项目中,这两个函数还能用吗?或者什么情况下用,就不担心内存覆盖吗?虽然memcpy有memmove可以替换,但是strcpy并没有可以替换的,即使是采用临时变量来转存,但是也是无法确认是否有内存重叠。
...全文
522 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-02-10
  • 打赏
  • 举报
回复
在你要看Release版对应汇编指令的那句C函数前临时加DebugBreak();,重新编译链接,成功后按F5开始调试,当程序停在DebugBreak();这句时,按Alt+8打开汇编窗口,查看其后的汇编指令。 一般人我不告诉他! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行!
赵4老师 2015-02-09
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
因为 copy的语义是操作后新目标和旧源内容相同且旧源的内容保持不变。 move的语义是操作后新目标和旧源内容相同且旧源的内容不一定保持不变。 所以 在源和目标内存覆盖的情况下,根本不可能实现copy!只能实现move
如果连这两者的语义都分不清的码农非要在不可能实现copy的情况下使用copy,那只能后果自负了!
luciferisnotsatan 2015-02-09
  • 打赏
  • 举报
回复
引用 9 楼 layershow 的回复:
我想楼主的问题不是越界应该是 char * p = malloc(1024); memcpy(p + 2, p, 500); strcpy(p + 2, p); 对于重叠,开发人员应该非常清楚,所谓的“随机性"就是你无法确定 dst 的值 比如 "abcdefg" 按字节处理 memcpy(p + 2, p, 8) 可能会变成 "abababab" 但是某些优化的 memcpy 可能按 4 字节拷贝,你就很难想象最终结果是什么 库函数的实现不是唯一的,所以结果是一个不可定义的 开发人员理解库函数能更好的使用,但是不要惧怕使用
不然还要考虑敢不敢用指针了。
赵4老师 2015-02-09
  • 打赏
  • 举报
回复
因为 copy的语义是操作后新目标和旧源内容相同且旧源的内容保持不变。 move的语义是操作后新目标和旧源内容相同且旧源的内容不一定保持不变。 所以 在源和目标内存覆盖的情况下,根本不可能实现copy!只能实现move
layershow 2015-02-09
  • 打赏
  • 举报
回复
我想楼主的问题不是越界应该是 char * p = malloc(1024); memcpy(p + 2, p, 500); strcpy(p + 2, p); 对于重叠,开发人员应该非常清楚,所谓的“随机性"就是你无法确定 dst 的值 比如 "abcdefg" 按字节处理 memcpy(p + 2, p, 8) 可能会变成 "abababab" 但是某些优化的 memcpy 可能按 4 字节拷贝,你就很难想象最终结果是什么 库函数的实现不是唯一的,所以结果是一个不可定义的 开发人员理解库函数能更好的使用,但是不要惧怕使用
kevinyu723 2015-02-09
  • 打赏
  • 举报
回复
引用 7 楼 zjq9931 的回复:
[quote=引用 6 楼 kaiandshan 的回复:] 不好意思,都是“随机性”这个词惹的祸,如果des和src指向不同的空间,这些函数都可以使用;如果指向同一段内存,就会存在空间覆盖的问题,这种情况在函数使用者看来也是可以预见的。
动态分配的内存在堆中,比较难预见。 如果是编写的时候定义好的,在栈区的内存,一般会影响这个数组后面的变量的值。如果覆盖的更多。那就是黑客攻击的范畴了。[/quote] 是的,这些问题如果在定义或者申请的时候保证空间足够大,就不会产生覆盖的问题。
kevinyu723 2015-02-09
  • 打赏
  • 举报
回复
引用 9 楼 layershow 的回复:
我想楼主的问题不是越界应该是 char * p = malloc(1024); memcpy(p + 2, p, 500); strcpy(p + 2, p); 对于重叠,开发人员应该非常清楚,所谓的“随机性"就是你无法确定 dst 的值 比如 "abcdefg" 按字节处理 memcpy(p + 2, p, 8) 可能会变成 "abababab" 但是某些优化的 memcpy 可能按 4 字节拷贝,你就很难想象最终结果是什么 库函数的实现不是唯一的,所以结果是一个不可定义的 开发人员理解库函数能更好的使用,但是不要惧怕使用
是的,说的正是我所讲的。原来memcpy也会存在优化的问题,我说呢在测试memcpy重叠覆盖的问题时,怎么一直不按照一个一个字节来覆盖,比如输入abcdefg,结果是abababab,可时间结果是ababcdefefg....正在郁闷呢。再请教下,怎么看编译器的优化方式呢?
kevinyu723 2015-02-09
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
[quote=引用 10 楼 zhao4zhong1 的回复:] 因为 copy的语义是操作后新目标和旧源内容相同且旧源的内容保持不变。 move的语义是操作后新目标和旧源内容相同且旧源的内容不一定保持不变。 所以 在源和目标内存覆盖的情况下,根本不可能实现copy!只能实现move
如果连这两者的语义都分不清的码农非要在不可能实现copy的情况下使用copy,那只能后果自负了![/quote] 是的,这种情况直接使用move就可以避免了,不用考虑覆盖的可能性了。
  • 打赏
  • 举报
回复
引用 6 楼 kaiandshan 的回复:
不好意思,都是“随机性”这个词惹的祸,如果des和src指向不同的空间,这些函数都可以使用;如果指向同一段内存,就会存在空间覆盖的问题,这种情况在函数使用者看来也是可以预见的。
动态分配的内存在堆中,比较难预见。 如果是编写的时候定义好的,在栈区的内存,一般会影响这个数组后面的变量的值。如果覆盖的更多。那就是黑客攻击的范畴了。
kevinyu723 2015-02-08
  • 打赏
  • 举报
回复
不好意思,都是“随机性”这个词惹的祸,如果des和src指向不同的空间,这些函数都可以使用;如果指向同一段内存,就会存在空间覆盖的问题,这种情况在函数使用者看来也是可以预见的。
  • 打赏
  • 举报
回复
楼主的意思是,会越界吧?越界确实会改变其他内容的值,甚至改变程序的代码。那啥,黑客经常用这种方式进行攻击。 VC有提供安全的函数。 可以查到。前面几楼也已经说过了。
relaxisland 2015-02-07
  • 打赏
  • 举报
回复
不都在用吗 strcpy,写的时候应该知道你操作的对象是否可能重叠啊。 也可以用 strncpy版本,可以指定要拷贝的字符串的最大长度, 确保你准备的 目标内存足够大
lin5161678 2015-02-07
  • 打赏
  • 举报
回复
存在覆盖 但谁告诉你覆盖有什么随机性? a = 99; a原来的数据被覆盖了 ? 但 哪里来的毛线随机性?
你怎么了熊吉 2015-02-07
  • 打赏
  • 举报
回复
晕,随机性不是说不知道会不会覆盖 随机性是说覆盖以后不知道会发生什么 而覆不覆盖,是你可以通过仔细来避免的
帅得不敢出门 2015-02-07
  • 打赏
  • 举报
回复
这种情况可由写代码的人杜绝。

70,021

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧