免费注册 查看新帖 |

Chinaunix

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

[函数] [讨论]判断参数正确性是调用函数的责任还是被调用函数的责任? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2007-01-07 01:45 |只看该作者
参数的正确性应该由调用者保证。
测试阶段被调用者发现不正确应立即抛出致命错误

因为实际过程中被调用者不知道自己将会被用在什么地方,也不知道实际项目中出现错误应该怎么处理。被调用者只要保证接受正确的参数后不会出现运行时错误就行。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
22 [报告]
发表于 2007-01-07 02:37 |只看该作者
印象中你的这个问题十分不好回答,它不是一个单纯的A或B的问题,因为库是作为一种服务而存在,它的设计需要考虑很多可能,在这些可能中trade-off,甚至还需要在众多决策中挑选一个最佳的,这点和应用层面的设计有一些不同。

http://www.cnforyou.com/query/bookdetail1.asp?viBookCode=7214
小C,这本书看过没有?讲库的设计与决策。虽然是讲C++的,但是很多设计观点也可以用在C上。其中有一章专门讲库的错误处理决策。

scott meyers对它的评价是:有意撰写程序库的人,若没有读过此书,那只能是匹夫之勇。Francis Glassborow的评价是:大多数程序库设计者应该搬过小板凳来,像小学生那样学习这本书

很不错的一本小册子,可惜我借给同学了,俺脑容量有限帮不了你,只能把书推荐给你。

[ 本帖最后由 gvim 于 2007-1-7 02:56 编辑 ]

评分

参与人数 1可用积分 +3 收起 理由
langue + 3

查看全部评分

论坛徽章:
0
23 [报告]
发表于 2007-01-07 08:24 |只看该作者
我可以告诉你标准答案!就是A和B都有可能。B处理的多,A少!

论坛徽章:
0
24 [报告]
发表于 2007-01-07 08:26 |只看该作者
作者:孟岩。。。。。他也配翻译书。哎

论坛徽章:
0
25 [报告]
发表于 2007-01-07 09:45 |只看该作者
原帖由 gvim 于 2007-1-7 02:37 发表
印象中你的这个问题十分不好回答,它不是一个单纯的A或B的问题,因为库是作为一种服务而存在,它的设计需要考虑很多可能,在这些可能中trade-off,甚至还需要在众多决策中挑选一个最佳的,这点和应用层面的设计有 ...


没有看过,改天找来看看,我家里C++的书实在是太多了,但是看到后来我感觉只要有最经典的那几本,然后多去看别人的代码和项目就足够了。

论坛徽章:
0
26 [报告]
发表于 2007-01-07 09:58 |只看该作者
原帖由 flw2 于 2007-1-6 19:33 发表


也不一定,strcpy就是很好的例子。


这个我知道,但是正是因为这个函数存在缓冲区溢出的漏洞,很多讨论安全的资料都已经不推荐使用这个函数了

可以看看ms一个人写的《编写安全的代码》一书,虽然是针对windows下编程的,但其中很多思想也是可以移植到其他平台下的

论坛徽章:
0
27 [报告]
发表于 2007-01-07 10:12 |只看该作者
我的看法是被调用的函数保护住缓冲区边界、以及避免不正常的指针(如空指针)传入,就可以了。这方面实在需要着手的话可以参考一下安全相关的源代码。OpenSSL/OpenSSH 等等

论坛徽章:
1
射手座
日期:2013-09-30 15:24:05
28 [报告]
发表于 2007-01-07 10:28 |只看该作者
我都自己判断!

论坛徽章:
0
29 [报告]
发表于 2007-01-07 10:32 |只看该作者
原帖由 emacsnw 于 2007-1-6 18:18 发表
我觉得应该在A(调用者)中负责对参数的合法性作出判断,而B(被调用者)实现的时候应该直接假设给定的参数是合法的。比如stl中的sort,实现的时候可以假设begin_iterator <= end_iterator,而不应该再额外的判 ...



如果这参数合法性判断逻辑相当的复杂,并且需要依赖函数的计算结果呢?

论坛徽章:
0
30 [报告]
发表于 2007-01-07 10:32 |只看该作者
原帖由 assiss 于 2007-1-6 21:07 发表
我以前的意见是,调用者负责检查。
但最近看到越来越多的函数,都是在内部检查。弄得我现在成了两面派。

不过,进行内部检查的,往往只是进行指针有效性检查(是否NULL)。这可能是因为对NULL指针的误操作影响 ...


经过编译后指针的类型已无从考证,也只能进行null检查了
像 fprintf("abc%d", a), 这个函数已无法检查传进去的是不是FILE *

从内部检查固然可以增加库的键壮性,但在一些关键的,调用密集形的函数,还是从外部检查为好。
从哪里检查取决于检查的复杂性,如果要验证传进去的是不是一个素数,就必需在外部检查,而一些简单的,如null这些简单的检查,应该放在被调用函数里。
这东西也无法统一,只能从文档说明了。

评分

参与人数 1可用积分 +3 收起 理由
langue + 3

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP