指针指向0x1 - 正在检查空值是否有效

Pointer is pointing to 0x1 - is checking for null valid?

本文关键字:检查 空值 是否 有效 0x1 指针      更新时间:2023-10-16

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

我想从此错误中"优雅地"恢复; 而不是SEGFAULT.我无法检查NULL;因为那会0.我是否明确检查地址0x1

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

是的,您获得指向0x1的指针的原因很可能是因为您正在取消引用指向 null 的结构:

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

碰巧foo与结构开始的偏移量为 1。所以数学最终是*(0+1).

我想从此错误中"优雅地"恢复,而不是SEGFAULT。我无法检查NULL因为那将是 0。我是否明确检查地址0x1

可能不是最好的主意。

恢复

的方法(从技术上讲,恢复是不合理的,你真的需要阻止它(是假设0x1NULL一样糟糕,而不是在这种情况下尝试使用它,例如:

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

然而,我非常犹豫是否称其为优雅。正确的做法是跟踪导致指针设置为该无效值的原因并修复它。这是特别合适的,因为一段足够狡猾的代码足以生成指针值 1 也可能足够狡猾以生成2 或任何其他无效指针

检查1类似于当有人不断打你的头时用止痛药停止头痛。你可以服用那片药片来缓解头痛,但肯定最好解决问题的根本原因(即,阻止那个人打你的头(。

当您通过将

空指针传递给一段未为 null 参数分配特定含义的代码而违反了接口的约定时,就没有"优雅地"恢复这样的事情。对可能无效的程序状态的数量没有限制,并且很可能您已经在某处调用了未定义的行为。

由于我过去已经写了很多关于SO的主题,所以我只给你留下一个我的论文的链接:

在 C 或 C++ 中,我应该根据 NULL/nullptr 检查指针参数吗?