免费注册 查看新帖 |

Chinaunix

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

出现频率最高的笔试题strcpy写法 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2008-09-27 13:55 |只看该作者
原帖由 思一克 于 2008-9-27 13:49 发表
可是大部分应用不是这种.

飞机上的系统还有备份的手工操作系统.
以免错误的程序将飞机自己CRASH掉.



其实我也一直在反思这个问题。  发现参数错误了 到底是应该善意的返回一个错误码 还是应该不检查 crash 掉。

好像根本没有一个可循的案例。也没什么标准。因为在不同的层面上似乎有不同的处理方式。 内核, 外部,以及对项目要求上。

但是从软件的强壮性 上看,无疑应该是第一个。 随着cpu 更快,大家对稳定 规范要求更高, 我相信 所有的代码都会向第一种看齐。第一种最大的问题是 长尾情况, 就是调用者可能看到长长各种错误原因,也许调用者无法理解这些原因。

论坛徽章:
0
32 [报告]
发表于 2008-09-27 14:00 |只看该作者
大家讨论的不错!
我的做法是把"benjiam"和"思一克"两位大拿的思想都拿过来放在一起互补, 根据实际情况决定在什么情况下用"benjiam"方法和什么情况下用"思一克"方法. 使两中方法相容起来(实际上目的是一样的,都是为了更好的解决问题).

论坛徽章:
0
33 [报告]
发表于 2008-09-27 14:04 |只看该作者
实际上,直接CRASH是一个追求的最高目标. 可惜由于硬件软件,体系结构等限制, 远达不到.

比如,strcpy(d, s), 如果d是一个被free(d)的地址, 系统往往也能工作. 但这里实际是一个巨大的恶劣的BUG. 无法CRASH的原因是硬件对内存的保护是按页的, 无法按字节.

有BUG就直接CRASH应用是一个目标. 不能完全达到.

我原来是修理电视的. 最好的故障是什么? 是子系统全坏掉. 最恶劣的故障是系统神经病似地故障---时断时续,时大时小,变化莫测.---- 对于软件说也一样.

[ 本帖最后由 思一克 于 2008-9-27 14:15 编辑 ]

论坛徽章:
0
34 [报告]
发表于 2008-09-27 14:17 |只看该作者
strcpy是C标准库函数,怎么可以throw?

[ 本帖最后由 yuanchengjun 于 2008-9-27 14:19 编辑 ]

论坛徽章:
0
35 [报告]
发表于 2008-09-27 14:34 |只看该作者
原帖由 思一克 于 2008-9-27 14:04 发表
实际上,直接CRASH是一个追求的最高目标. 可惜由于硬件软件,体系结构等限制, 远达不到.

比如,strcpy(d, s), 如果d是一个被free(d)的地址, 系统往往也能工作. 但这里实际是一个巨大的恶劣的BUG. 无法CRASH的原 ...


理解,容易复现的故障好找,不容易复现的鼓掌难找一些.
实际上就是如何找出问题,计算机的应用到了各种领域,其中出现了各种方式的解决问题的思想和方式,都是基于实际情况中的一些特性提出的,并经过反复的应用改进,直道相对满足实际的应用.
这写不同的思想的产生,都有他一定的道理在里面,甚至有些思想看上去会互相矛盾,但一落实到实际的场合中往往又是有效的.

论坛徽章:
0
36 [报告]
发表于 2008-09-27 14:39 |只看该作者
原帖由 benjiam 于 2008-9-27 13:55 发表


其实我也一直在反思这个问题。  发现参数错误了 到底是应该善意的返回一个错误码 还是应该不检查 crash 掉。

好像根本没有一个可循的案例。也没什么标准。因为在不同的层面上似乎有不同的处理方式。 内核 ...


debug阶段可以没有顾虑的crash, 但在一些crash会产生灾难性后果的场合(当然另外很多场合允许crash),就不能随意crash了.

论坛徽章:
0
37 [报告]
发表于 2008-09-27 15:00 |只看该作者
对与楼主具体的strcpy(d, s),

检查s, d意义的确不大. 否则标准库也会做检查的.

因为有BUG的s, d数值千万个(比如free后的s, d等). d == NULL是特殊的一个, 而且还是可以CRASH程序的一个(非常容易DEBUG的).

论坛徽章:
0
38 [报告]
发表于 2008-09-27 15:17 |只看该作者
原帖由 思一克 于 2008-9-27 15:00 发表
对与楼主具体的strcpy(d, s),

检查s, d意义的确不大. 否则标准库也会做检查的.

因为有BUG的s, d数值千万个(比如free后的s, d等). d == NULL是特殊的一个, 而且还是可以CRASH程序的一个(非常容易DEBUG的).



关键是无法对参数是否正确作出判断。比如 d s 是否合法,显然 NULL 是非法的,而其他的 1, 2 算不算非法。 要做到完全合法检查代价非常大。

这里就有一个 因为无法对参数作出判断,我们是应该完全放弃呢? 还是能判断出多少算多少?

论坛徽章:
0
39 [报告]
发表于 2008-09-27 15:48 |只看该作者
实际上, 编译系统和OS配合, 故意将地址NULL(0)留出来并设置为内存保护段. 当程序使用NULL中内容时候, 让程序CRASH掉. 目的就是为了DEBUG, 而且是非常容易地DEBUG.

所以可以说, strcpy和许多库FUNCTION看似没有检查参数指针是否是NULL, 其实是系统替你检查了. 好处是, 不影响速度. 同时有可以给用户报了错误. 你想呀, strcpy是多么底层的被大量调用的, 检查那东西浪费了效率. 程序中的废话在高层地方出现对效率影响很小, 在底层出现影响很大.

BTW, strcpy的库绝大多数不是LZ那样用C编的, 而是用汇编指令(许多CPU都用专门移动,COPY串的指令). C编的效率要低许多许多.

论坛徽章:
0
40 [报告]
发表于 2008-09-27 16:11 |只看该作者
还有,
不要将应用程序的CRASH(Segmentation fault后推出运行)理解成汽车撞树,飞机CRASH地面.

实际上, 这里发生的一切都在OS 的掌控之下,检查出问题了,让你的程序停止下来, 温柔地停下来.
有点相当与你靠驾驶执照时候, 交通警察是考官, 你犯了错误后的情况.

而撞树相当与OS没有检查,错误的程序还在继续,直到系统不动了,或错误数据产生了.DOS原来许多地方就如此.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP