在我们的一些代码中;我们得到一个分段错误,gdb stacktrace显示指针指向0x1
。我们有3个这样的分段错误实例,每个都有一个;指针最终指向0x1
。
我想从这个错误中“优雅地”恢复;而不是SEGFAULT
。我无法检查NULL
;因为那将是0
。我是否明确检查地址0x1
?
这是在Linux上使用GCC3.4.2(SLES9机器)
答案 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?