免费注册 查看新帖 |

Chinaunix

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

一道关于段错误笔试题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-06-10 22:50 |只看该作者
慢一步啊 有人已经试了

论坛徽章:
0
12 [报告]
发表于 2010-06-10 22:55 |只看该作者
又想到了一个办法,微软的VC++ 2005之后,有strcpy_s函数,编译时/D给几个宏就能让编译器把strcpy替换为strcpy_s函数,不用改代码。

找到方法了,试过有效!
Z:\>cl /D_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1 ^
/D_CRT_NONSTDC_NO_DEPRECATE ^
/D_CRT_SECURE_NO_DEPRECATE ^
/GZ /RTC1 lek.c

Z:\>lek.exe
1

然后程序崩了debuger跳出来

论坛徽章:
0
13 [报告]
发表于 2010-06-10 23:08 |只看该作者
回复 9# starwing83


    我先前用的用-fstack-protector-all是不行的,i在-20,buf在-16,是连续的
23         xorl    %eax, %eax
24         movl    $1, -20(%rbp)
25         movl    $.LC0, %ecx
26         leaq    -16(%rbp), %rax
27         movl    $5, %edx
28         movq    %rcx, %rsi
29         movq    %rax, %rdi
30         call    memcpy
 后来用了你的-fstack-check,i在-4,buf在-16,没有相邻了,i值不会被破坏了,但是错还是查不出来。
24         movl    $1, -4(%rbp)
25         movl    $.LC0, %ecx
26         leaq    -16(%rbp), %rax
27         movl    $5, %edx
28         movq    %rcx, %rsi
29         movq    %rax, %rdi
30         call    memcpy
看来还是M$的strcpy_s和/GZ更重视这些问题哈。

论坛徽章:
0
14 [报告]
发表于 2010-06-10 23:19 |只看该作者
呃~~期待高手给讲解一下啊~

论坛徽章:
0
15 [报告]
发表于 2010-06-10 23:25 |只看该作者
回复 13# 没本


    我测试的结果是-fstack-protector-all 没有编译错误提示, 结果正确为1, 而加-fstack-check 编译器同样没有提示 但是结果是0,
    好像跟你说恰好相反
    你说的M$的strcpy_s和/GZ方法我还得去研究下

论坛徽章:
0
16 [报告]
发表于 2010-06-10 23:27 |只看该作者
回复 15# tianxiaogang12


    我用的是64位GCC,版本是4.5.0,结果相反也不奇怪。

论坛徽章:
0
17 [报告]
发表于 2010-06-10 23:46 |只看该作者
我的是32位 gcc4.3.2
带-fstack-check选项时汇编是 i 是-8 , buf是-12 (i在buf上面) strcpy拷贝是会覆盖i 结果就不正确
20     movl    $1, -8(%ebp)
21     movl    $5, 8(%esp)
22     movl    $.LC0, 4(%esp)
23     leal    -12(%ebp), %eax
24     movl    %eax, (%esp)
25     call    memcpy


带-fstack-protector-all选项  i是-16, buf 是-12(i是在buf下面)所以是不会把i覆盖的结果就正确
21     movl    $1, -16(%ebp)
22     movl    $5, 8(%esp)
23     movl    $.LC0, 4(%esp)
24     leal    -12(%ebp), %eax
25     movl    %eax, (%esp)
26     call    memcpy

论坛徽章:
0
18 [报告]
发表于 2010-06-11 00:06 |只看该作者
回复  starwing83


    我先前用的用-fstack-protector-all是不行的,i在-20,buf在-16,是连续的
23  ...
没本 发表于 2010-06-10 23:08



    学习了

论坛徽章:
0
19 [报告]
发表于 2010-06-11 00:11 |只看该作者
现在去试试M$的strcpy_s和/GZ方法

论坛徽章:
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
20 [报告]
发表于 2010-06-11 09:13 |只看该作者
优化级别提高,i直接被优化掉,printf中用常量了,就能输出1
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP