免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: maozone
打印 上一主题 下一主题

[C] strcpy重叠拷贝问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2015-07-12 23:30 |只看该作者
回复 10# safedead
看过redhat6.3编译环境对应的glibc2.12的strcpy.c文件,这个是逐个字符拷贝的方式。memmove会判断重叠这个是了解的,memmove.c的实现之前也看过。
在网上也找了一些相关的帖子,确实有人指出不同环境strcpy实现方式不一样,可能以多字节拷贝。我在其他linux版本以及windows上作过测试都没有问题。
能否请教strcpy如何判断在某个环境中实现方式,或者能否以指定的方式实现?

感谢wangyb,think1008的解答,如果是p1〉p2重叠我肯定不会用strcpy,但是在p1<p2的情况下,我觉得如果是逐个字节拷贝的方式,这种重叠不会有问题。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
12 [报告]
发表于 2015-07-13 08:07 |只看该作者
maozone 发表于 2015-07-12 23:30
回复 10# safedead
看过redhat6.3编译环境对应的glibc2.12的strcpy.c文件,这个是逐个字符拷贝的方式。me ...


按照标准strcpy就是不考虑重叠的,不管谁大谁小都是重叠,老老实实用memmove,何必这么执着于strcpy?

论坛徽章:
0
13 [报告]
发表于 2015-07-13 11:34 |只看该作者
回复 12# hellioncu

避免问题的方法我知道,之所以发这个帖是为了搞清楚问题真正原因。
既然现在找到了可能出问题的方向,为什么不继续探寻下去,希望大家不吝赐教。
另外strcpy可能有会存在问题的实现方式,我觉得memmove不见得就不会出同样的问题。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
14 [报告]
发表于 2015-07-13 11:39 |只看该作者
maozone 发表于 2015-07-13 11:34
回复 12# hellioncu

避免问题的方法我知道,之所以发这个帖是为了搞清楚问题真正原因。


标准要求memmove必须支持内存重叠的情况,实现肯定会考虑,不会有问题。而strcpy没有这个要求,内存重叠时结果如何就说不好了。
深入研究是好事,但不是像你这样的。仔细读读函数的文档吧。

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
15 [报告]
发表于 2015-07-13 13:08 |只看该作者
优化过的strcpy,64位环境下一次循环可以复制8个字节,所以,出这个问题就不难理解了

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
16 [报告]
发表于 2015-07-13 13:28 |只看该作者
-O2时被strcpy被优化这个样子了:
        movq        %rax, 128(%rsp)
        movabsq        $3186626826817907765, %rax
        leaq        128(%rsp), %rdx
        movq        %rax, 136(%rsp)
        movabsq        $3616720565545218097, %rax
        movq        %rsp, %rsi
        movq        %rax, 144(%rsp)
        movabsq        $3543264392633332012, %rax
        movb        $0, 176(%rsp)
        movq        %rax, 152(%rsp)
        movabsq        $3186069327345429557, %rax
        movb        $0, 2(%rsp)
        movq        %rax, 160(%rsp)
        movabsq        $3472886886805813297, %rax

论坛徽章:
0
17 [报告]
发表于 2015-07-13 21:33 |只看该作者
本帖最后由 maozone 于 2015-07-14 08:45 编辑

回复 15# selfrun
多谢解答, 原谅我还有一堆问题:strcpy实现代码如何查看(是否下面列出来的代码,另外strcpy.c什么时候会用到),是根据什么参数来的确定的(编译器自己判断cpu吗),还是有参数能人为指定?
glibc
sysdeps/i386/i586/strcpy.S
sysdeps/ia64/strcpy.S
sysdeps/powerpc/powerpc32/strcpy.S
sysdeps/powerpc/powerpc64/strcpy.S
sysdeps/sparc/sparc32/strcpy.S
sysdeps/sparc/sparc64/strcpy.S
sysdeps/s390/s390-32/strcpy.S
sysdeps/s390/s390-64/strcpy.S
sysdeps/x86_64/strcpy.S
sysdeps/powerpc/powerpc64/strcpy.S
sysdeps/sparc/sparc32/strcpy.S
sysdeps/sparc/sparc64/strcpy.S

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
18 [报告]
发表于 2015-07-14 16:42 |只看该作者
回复 17# maozone


1,反汇编libc.so,比如用irda
2,下载binutils源码包

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
19 [报告]
发表于 2015-07-15 12:46 |只看该作者
本帖最后由 safedead 于 2015-07-15 12:48 编辑

回复 17# maozone


   

你列的这些就是“真正的”(应该叫平台相关的)strcpy的代码,都是汇编语言编写
编译的时候CPU类型将作为参数传递给编译工具,从而选择对应的汇编代码

编译工具会检测CPU类型(如果你不指定的话),也可以指定CPU类型(常见于交叉编译环境,比如你在x86上想编译arm手机上的可执行程序)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP