免费注册 查看新帖 |

Chinaunix

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

如何有效的避免指针在释放之后被引用? [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
111 [报告]
发表于 2008-11-14 22:25 |只看该作者
哥们,好好补习一下 C 语言吧。

[ 本帖最后由 flw 于 2008-11-14 22:27 编辑 ]

论坛徽章:
0
112 [报告]
发表于 2008-11-15 13:27 |只看该作者
检查出ptr == NULL, 又能怎样? 对应用来说,处理逻辑上已经出问题了,这样作的好处就是本模块出问题了,减少对系统或其他模块的不良影响,防止踩了别人。
我们常用的方法是调试版本assert,测试时有问题早发现。(嵌入式系统)

如果指针是在函数内部申请/使用/释放的,用PC-LINT 工具进行代码静态检查就能发现;
如果是通过函数参数传递,或跨模块引用的,就要约定好谁来检查,caller or callee?省的层层判断,浪费时间;

说白了,关键还是设计,设计的要逻辑清晰,合理。

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
113 [报告]
发表于 2008-11-15 13:42 |只看该作者
原帖由 flyeleph 于 2008-11-7 23:32 发表
39楼 发表于 2008-11-7 23:32   
最近刚完成一个项目。项目是在老外原有的代码上增加新的功能。以前写代码时习惯了在用指针前先检查一下指针是否为空。所以在这个项目也是这样做的。
但老外直接跟我们说不要那样干,那样会隐藏你的BUG。
想想也是有道理的。从逻辑上来讲,有时候根本不允许所用的指针为空,如果用判断来知道这个指针是空的,这时又要怎么办呢?输出一句话让调试的人
知道有错误了? 他们的做法是只在新申请的内存时检查是否为空,如果为空就做些内存清理的工作,腾出些空间。在其他用指针的环境下都不检查
指针是否为空。该调用方法的就调用方法,该往内存中写的就写。如果指针是空就让程序 crash 掉。这些能及时发现问题。如果不能及时发现问题,那只
能证明所做的测试还不够。


说的好;不过从跟贴看来,还是有不少人根本就没看懂这段话的意思。


首先一点必须搞明白的就是: 为什么说检查空指针会隐藏bug?不是已经检查到指针为空并且采取措施了吗?

那些脑子一下子转不过来弯的,可说都是绊倒在这点上了。


————————————
作为死修电视的,俺(以及俺的同行们)常常会有这样的经历: 有些电视出了故障,保险管时不时被烧;检查之,发现熔了老长一段(甚至玻璃壳都有了裂纹);换个新的又没了问题——查一时又查不到原因,怎么办?

对新手来说,一般就放弃了: 换上个新的先凑合着用。反正保险管便宜,烧了就换一个呗。
甚至于,某些野蛮人敢拿根铜丝给人家连上——看起来能用了,不是吗。

后果必然是: 某天,显像管或者其他什么重要东东烧了——甚至引起火灾,把户主多年的血汗统统付之一炬都不罕见。


——————————————————————————————————
烧保险管是一个信号,这个信号明明白白告诉我们: 其他地方有致命缺陷了——击穿,打火,短路,功率管热稳定性差……
如果不把这个致命缺陷找到并修复,早晚要闹出大乱子。


——————————————————————
同样,未知的空指针也是一个信号,说明代码的其他部分有致命缺陷: 缓冲溢出,野指针,栈被破坏,逻辑异常,多线程出现了数据竞争等等等等……

换句话说,菜鸟仅仅看到空指针,有点经验的中、老鸟看到的则是致命缺陷。

不把致命缺陷排除,房子总有一天要被烧掉,程序也总有一天要崩溃。


同样的道理,对于操作系统核心或神六神七之类“高级”玩意儿,该无视这个致命缺陷勉强运行呢,还是该马上报错修正缺陷?

当一个进程试图退出、操作系统核心却发现对应的进程列表指针为空时,是死皮赖脸运行下去,把一切的一切都搅得乌七八糟然后死的很难看好呢,还是清清楚楚记录下当前内存映像提交然后蓝屏重启好?

指针用过马上置空,目的绝不是为了方便之后可以检查到并防止程序crash(或者,如楼主题目所说“避免指针在释放之后被引用”)——恰恰相反,这个做法的目的正是为了在程序引用了已释放的指针时能够立即crash掉。

高质量的系统,不是糊弄出来的。


http://bbs.chinaunix.net/viewthr ... ;page=13#pid9526534
东西做的底层、高端,不是隐瞒错误的理由——相反,对神六神七之类政治敏感的“高端”任务来说,糊弄出问题倒是请君体验新式步枪威力的好理由。

论坛徽章:
0
114 [报告]
发表于 2008-11-17 15:21 |只看该作者
EN..不错..

论坛徽章:
0
115 [报告]
发表于 2008-11-19 00:33 |只看该作者
>> 如何有效的避免指针在释放之后被引用?

对于指针变量的情况,释放之后立即对指针置 NULL 是一个非常有效的手段。

这里是一种针对 free() 库函数的可行的实现方案:
http://bbs.chinaunix.net/viewthr ... p;page=5#pid9214767

论坛徽章:
0
116 [报告]
发表于 2008-11-28 12:12 |只看该作者
感觉大家的发言感觉是两个角度看问题:
  1. 程序员角度: 程序员要足够清醒,有水平和经验,因此没必要用p=null.
  2. 管理者角度: 任何事情都有风险,不可能指望人不犯错误,需要p=null.

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
117 [报告]
发表于 2008-11-28 13:32 |只看该作者
原帖由 system888net 于 2008-11-28 12:12 发表
感觉大家的发言感觉是两个角度看问题:
  1. 程序员角度: 程序员要足够清醒,有水平和经验,因此没必要用p=null.
  2. 管理者角度: 任何事情都有风险,不可能指望人不犯错误,需要p=null.


总结的很好。

论坛徽章:
0
118 [报告]
发表于 2010-05-26 00:18 |只看该作者
学习了.

论坛徽章:
0
119 [报告]
发表于 2010-11-12 22:14 |只看该作者
封装一下malloc 和free,如
#define PLT_Free(addr)\
{\
      free(addr)\
     addr == NULL\
}

论坛徽章:
0
120 [报告]
发表于 2011-11-04 17:24 |只看该作者
回复 18# flw


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP