Chinaunix首页 | 论坛 | 博客
  • 博客访问: 315661
  • 博文数量: 81
  • 博客积分: 1810
  • 博客等级: 上尉
  • 技术积分: 725
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-25 17:38
文章分类

全部博文(81)

文章存档

2016年(4)

2015年(11)

2014年(16)

2013年(37)

2012年(11)

2011年(2)

我的朋友

分类: C/C++

2012-11-28 20:23:09

1. 指针加/减操作
下面一个血淋淋的事实:

点击(此处)折叠或打开

  1. u32 virtOffset = virtBase - physBase;
  2. struct desc *ptr = desc_pop();
  3. if (ptr == NULL)
  4. {
  5. ...
  6. }
bug发生时,ptr并不为空。
发现desc_pop()实际上是从寄存在器中取出desc的物理地址,然后加上virtOffset,将值返回给ptr。
想到ptr是虚拟地址,减去virtOffset偏移后,得到物理地址。在这里需要判断物理地址是否为0。
代码编写成下面这样。。。

点击(此处)折叠或打开

  1. if ((ptr - virtOffset) == NULL)
  2. {
  3. ...
  4. }
一直很疑惑为啥进不了。。。
还以为自己对异常点判断有误,重新思考判断测试N久后。。。无奈在判断之间再加一个判断。

点击(此处)折叠或打开

  1. WARN_ON(!(ptr >= virtBase));
  2. if ((ptr - virtOffset) == NULL)
  3. {
  4. ...
  5. }
证实ptr确实是有问题的。
更改如下后,终于抓到ptr的异常!

点击(此处)折叠或打开

  1. WARN_ON(!(ptr >= virtBase));
  2. if ((void*)((u32)ptr - virtOffset) == NULL)
  3. {
  4. ...
  5. }
C语言指针啊。。。每个疏忽都很致命!
2. 空指针/野指针
这个空指针还不可怕,野指针才可怕。空指针运行时立即报错,野指针搞得内存被踩得乱七八糟,头都大了。不初始化啊,free后使用啊,多次free啊。。。

3. void *指针

点击(此处)折叠或打开

  1. int i;
  2. void *ptr1 = &i;

  3. printf("type: void *  0x%x\n", (ptr1 + 0x4));
  4. printf("type: int *   0x%x\n, ((int*)ptr1 + 0x4));
    printf("type: char *   0x%x\n, ((char*)ptr1 + 0x4));
从结果来看(gcc4.1.2编译器),void*指针的加减运算和char*指针一致。

查资料发现:
按照ANSI(AmericanNationalStandardsInstitute)标准,不能对void指针进行算法操作。
但是大名鼎鼎的GNU(GNU’sNotUnix的缩写)则不这么认定,它指定void * 的算法操作与char * 一致。
http://blog.csdn.net/yming0221/article/details/6249151

4. 
阅读(1154) | 评论(0) | 转发(0) |
0

上一篇:mount使用备忘

下一篇:invalid module format

给主人留下些什么吧!~~