1. 指针加/减操作
下面一个血淋淋的事实:
-
u32 virtOffset = virtBase - physBase;
-
struct desc *ptr = desc_pop();
-
if (ptr == NULL)
-
{
-
...
-
}
bug发生时,ptr并不为空。
发现desc_pop
()实际上是从寄存在器中取出desc的物理地址,然后加上virtOffset,将值返回给ptr。
想到ptr是虚拟地址,减去virtOffset偏移后,得到物理地址。在这里需要判断物理地址是否为0。
代码编写成下面这样。。。
-
if ((ptr - virtOffset) == NULL)
-
{
-
...
-
}
一直很疑惑为啥进不了。。。
还以为自己对异常点判断有误,重新思考判断测试N久后。。。无奈在判断之间再加一个判断。
-
WARN_ON(!(ptr >= virtBase));
-
if ((ptr - virtOffset) == NULL)
-
{
-
...
-
}
证实ptr确实是有问题的。
更改如下后,终于抓到ptr的异常!
-
WARN_ON(!(ptr >= virtBase));
-
if ((void*)((u32)ptr - virtOffset) == NULL)
-
{
-
...
-
}
C语言指针啊。。。每个疏忽都很致命!
2. 空指针/野指针
这个空指针还不可怕,野指针才可怕。空指针运行时立即报错,野指针搞得内存被踩得乱七八糟,头都大了。不初始化啊,free后使用啊,多次free啊。。。
3. void *指针
-
int i;
-
void *ptr1 = &i;
-
-
printf("type: void * 0x%x\n", (ptr1 + 0x4));
-
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.
阅读(1198) | 评论(0) | 转发(0) |