指针指向0x1 - 检查null是否有效?

时间:2012-03-06 03:22:19

标签: c++ c null gdb

在我们的一些代码中;我们得到一个分段错误,gdb stacktrace显示指针指向0x1。我们有3个这样的分段错误实例,每个都有一个;指针最终指向0x1

我想从这个错误中“优雅地”恢复;而不是SEGFAULT。我无法检查NULL;因为那将是0。我是否明确检查地址0x1

这是在Linux上使用GCC3.4.2(SLES9机器)

3 个答案:

答案 0 :(得分:9)

可能不是。 NULL值在源中由0指示,因此检查0x1是否为NULL将返回false。

恢复的方式(从技术上讲,恢复是不合理的,你真的需要防止)是假设0x1和NULL一样糟糕而不是试图在那种情况,如:

if ((p == 0) || (p == 0x1))
    return;
// Otherwise use p.

然而,我在称这优雅的时候犹豫不决。 要做的是跟踪导致指针被设置为该无效值的原因并修复它。

当有人用锤子砸你的头部时,这类似于停止头痛。你可以拿一个平板电脑来缓解头痛,但肯定最好解决问题的根本原因(停止锤击)。

答案 1 :(得分:9)

是的,你得到一个指向0x1的指针的原因很可能是因为你要取消引用一个指向null的结构:

struct some_struct* ptr = NULL;
char blah = ptr->foo;

恰好foo距离结构的起点偏移1。所以数学最终成为*(0+1)

答案 2 :(得分:3)

当你通过将一个空指针传递给一个没有为null参数赋予特定含义的代码片段来违反你的接口的契约时,就没有“优雅地恢复”这样的东西。程序状态的数量可能无效,并且可能已经在某处调用了未定义的行为。

由于我过去已经在SO上就此主题撰写了大量文章,我只会给你一个链接到我的论文:

In either C or C++, should I check pointer parameters against NULL/nullptr?