首页
社区
课程
招聘
[求助]请教一个关于编码习惯的问题
发表于: 2007-8-20 13:00 4700

[求助]请教一个关于编码习惯的问题

2007-8-20 13:00
4700
为了编写安全的,稳定的代码一般要做到以下几点:

1 在编写函数的时候,对传入参数进行合法性检查
2 在调用函数之前,对要传入的参数进行合法性检查

感觉这么做之后,在调用自己的函数之前进行一次检查,在进入自己函数之后又检查一次,操作重复了。

另外我在调用ADVAPI32的输出函数进行注册表操作时,在某些输出参数传入一个非法指针的时候可以引起程序崩溃。显然MS在某些情况下也没有对传入参数进行检查。

我的问题是,什么情况下应该对传入参数进行检查呢?

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 347
活跃值: (25)
能力值: ( LV9,RANK:420 )
在线值:
发帖
回帖
粉丝
2
个人认为,应该在调用的时候检查
2007-8-20 13:52
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
3
不过我觉得比较空指针,错误参数比如 超出范围的Enum还是应该的。如果写得是一个库 给其他人分发的,当然自己的代码倒是不存在,不存在参数的问题 只要处理好用户输入。个人觉得。
2007-8-23 00:59
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
4
被调用的函数里面作检测,不管用户给什么参数,首要的目标是不能出现异常之类的问题
如果写的好的话,就应该像API那样,返回一个int/UINT/HRESULT之类的值,
跟自己所定义的错误代码相应
如果参数不合法,就返回相应的错误代码
2007-8-23 08:12
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
通常如果写底层库时,在强调性能的情况下,是不对输入参数做合法性检查的,比如STL中的很多要做循环操作的,就没有做边界检查之类的操作。但是如果要求稳定性,建议还在在函数内部查看指针是否为空,数组是否越界等检查
2007-8-23 23:09
0
雪    币: 238
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
依赖编译器,在编译过程中检查.再就是良好的编程习惯.
2007-8-23 23:18
0
雪    币: 217
活跃值: (30)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我认为在函数里面对指针,和数据下表越界作检查就可以了。但是如果能从程序的调用,和设计上保证参数的合理性。可以偷懒不作检查。这种限作小程序。对大程序中的代码还是老实一点做全面检查参数。因为可能牵扯多人合作的问题。不能要求调用者,对你的限制很明确。
2007-8-25 22:34
0
雪    币: 297
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
8
只对传入参数的约束做个检查,比如GDI+中的那些错误状态可以学习下.

对于其他的参数的具体成员或者其他细节,可以用assert()来表明前置信任!

比如一个公共函数,需要对其参数做类型检查, 但是具体的实现的私有的实现方法时可以用assert就可以了.

另外,有的时候,你必须写好提供给用户的文档. 明确表示哪些能做,哪些不能做的情况. 有些情况则可定义为未定义的.(前提是你的实现也是严格按照这个文档来做的)

因为一些情况下,为了性能考虑,可以把选择权利交个用户.比如c运行库的一些字符函数.溢出是属于未定义行为.他不保证运行结果.
2007-8-27 19:53
0
游客
登录 | 注册 方可回帖
返回
//