内核源码里的指针,都不做判空处理?这是为什么呢
本帖最后由 lzalinux 于 2011-05-18 15:55 编辑
好多内核源码里的指针 在分配空间后 空间是否分配成功都不处理
函数的入参中的指针也都不做判断
难道 就是因为是内核代码 可以完全保证指针没有问题 或是为了提供效率
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
一般申請了內存都會判斷吧,我都沒看到過不判斷的。。
谢谢你的回复 ,刚看了新分配的内存是都判空了
函数的入参为什么就不需要判断呢? 难道是要求调用者自己保障么?
static inline void __list_add(struct list_head *new,
struct list_head *prev,
struct list_head *next)
{
next->prev = new;
new->next = next;
new->prev = prev;
prev->next = new;
}
另, 代码里有些变量在声明的同时又的初始化, 有的没初始化。 是什么原因呢?
回复 3# lzalinux
指针一般都会初始化的,参数如果来自用户空间也会检验的。
本帖最后由 Godbach 于 2011-05-18 18:51 编辑
调用者判断,或者接口判断,这是不同的策略。
个人觉得,最好不要把太多参数合法性的检查工作都交给接口。
人家接口都提供给你了,你要提供非法的参数进去。出了错,就不要怪接口了。
回复 5# Godbach
不同的程序不同的策略,如果是UI的程序,必须得检验用户的输入,这样才不容易造成程序的崩溃。
如果是模块内部函数,少一些检验是可以的。
回复 3# lzalinux
这个插入链表也判断那就太。。。 这个操作这么频繁,消耗不起阿。 如果数据是从用户空间传来的,就一定会判断
本帖最后由 lzalinux 于 2011-05-19 10:06 编辑
谢谢各位,根据大家的意思,我总结下。
1,内存分配后,一定要判断是否分配成功。
2,函数入参的有效性检查呢,有的函数会去检查其有效性, 有的就需要函数的调用者来保障。
这是策略不同,使用哪种方式要看具体需求和使用场景。
(1) UI相关的模块或你的接口是供不同水平的开发人员调用的,就要在接口函数里去检查参数的有效性。
(2) 如果你的接口是供自己模块或已与别的模块开发人员达成共识的,可以由调用者保掌参数的有效性。
(3) 考虑到性能问题。如果接口使用比较频繁,则为了精简代码,参数需调用者来保证。
内核是相信自己的,除了从用户空间传来的参数,基本都不会检查参数有效性。
除了armrant说的信任外,应该还有效率的考虑