免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6131 | 回复: 11
打印 上一主题 下一主题

[其他] 大家会对每个子程序做输入参数的检查吗? [复制链接]

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-19 14:08 |只看该作者 |倒序浏览
编写程序经常遇到如下情况:
void B(int a, int b);
void A(int a, int b)
{
      B(a,b);
}

大家会对A和B分别检查参数a,b吗?
会采用什么用的形式:
1. if (a >0 && b > 0)的形式
2. 断言

我的困惑在于如果都用if的形式,则代码过于冗长了,在发布版本似乎没有必要,是不是用断言合适?

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2013-10-19 14:13 |只看该作者
事务型的函数: 一定要。
处理(计算)型的函数: 不要, 要的话很生硬和多余,比如 在如果我要写一个strcpy函数,我可能就不做任何参数检查。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
3 [报告]
发表于 2013-10-19 14:14 |只看该作者
不过在处理型的函数中, 加入Assert是可以的,

论坛徽章:
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
4 [报告]
发表于 2013-10-19 14:47 |只看该作者
这个要根据具体情况来的,没有定论。一般来说,用户输入、配置读取的参数要检查,只要有一边检查就行了

论坛徽章:
89
水瓶座
日期:2014-04-01 08:53:31天蝎座
日期:2014-04-01 08:53:53天秤座
日期:2014-04-01 08:54:02射手座
日期:2014-04-01 08:54:15子鼠
日期:2014-04-01 08:55:35辰龙
日期:2014-04-01 08:56:36未羊
日期:2014-04-01 08:56:27戌狗
日期:2014-04-01 08:56:13亥猪
日期:2014-04-01 08:56:02亥猪
日期:2014-04-08 08:38:58程序设计版块每日发帖之星
日期:2016-01-05 06:20:00程序设计版块每日发帖之星
日期:2016-01-07 06:20:00
5 [报告]
发表于 2013-10-19 15:03 |只看该作者
那就看caller的靠谱程度了。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
6 [报告]
发表于 2013-10-20 20:01 |只看该作者
如果是调用者可能犯的错误, 直接assert崩溃就行了, 别弄太多判断, 没意思.

论坛徽章:
1
综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00
7 [报告]
发表于 2013-10-20 20:41 |只看该作者
本帖最后由 fly3ds 于 2013-10-20 20:43 编辑

int不用检查.  指针类型比如char *p有时需要检查一下p是否为NULL,  用if检查, 以防止对NULL读写导致Segmantation Fault.   但这也不是必须的,   如果你能保证传入有效的指针.

别用Assert, 只会把程序搞乱!  

论坛徽章:
1
申猴
日期:2013-09-09 10:22:56
8 [报告]
发表于 2013-10-21 21:14 |只看该作者
为什么int不用检查? 如果int表示的是数组下标呢?

assert里面只要不是复杂的表达式,比如函数调用什么(release版本时可能漏掉调用),觉得比一大堆if看起来更简洁。。。

论坛徽章:
1
综合交流区版块每日发帖之星
日期:2015-10-14 06:20:00
9 [报告]
发表于 2013-10-22 06:11 |只看该作者
本帖最后由 fly3ds 于 2013-10-22 06:13 编辑

回复 8# Carl01Zhang


       数组下标另外说,可以检查一下,也不是必须的,前提是你要保证传入的值绝对正确。

       if是语言核心,所谓的语言核心意思就是说任何系统上任何C编译器都能用的,只要是稍微学过C语言的人甚至没学过C语言的人都懂。

       至于Assert? 我记得《C程序教程里》的Assert就是个简单的‘宏’定义,后面跟了个if语句,如果只是这样,我倒不反对用用。Linux系统下,你看看/usr/include/assert.h, 115行, 鬼知道那一大堆东西干嘛用的,用if语句最多两行。

论坛徽章:
0
10 [报告]
发表于 2013-10-22 11:30 |只看该作者
如果是你程序内部处理函数,就不用检查了,因为在你调试上线过程中,应该进行了充分的测试。如果是涉及外部接口,或输出信息的函数需要对外部输出接口进行检查,因为这个是变化的,拥有不确定因素,需要保证他们在一定的合理性的范围内。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP