指针指向0x1 - 正在检查空值是否有效
Pointer is pointing to 0x1 - is checking for null valid?
在我们的一些代码中;我们得到了一个分段错误,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
?
可能不是最好的主意。
恢复的方法(从技术上讲,恢复是不合理的,你真的需要阻止它(是假设0x1
和NULL
一样糟糕,而不是在这种情况下尝试使用它,例如:
if ((p == 0) || (p == 0x1))
return;
// Otherwise use p.
然而,我非常犹豫是否称其为优雅。正确的做法是跟踪导致指针设置为该无效值的原因并修复它。这是特别合适的,因为一段足够狡猾的代码足以生成指针值 1
也可能足够狡猾以生成2
或任何其他无效指针。
检查1
类似于当有人不断打你的头时用止痛药停止头痛。你可以服用那片药片来缓解头痛,但肯定最好解决问题的根本原因(即,阻止那个人打你的头(。
空指针传递给一段未为 null 参数分配特定含义的代码而违反了接口的约定时,就没有"优雅地"恢复这样的事情。对可能无效的程序状态的数量没有限制,并且很可能您已经在某处调用了未定义的行为。
由于我过去已经写了很多关于SO的主题,所以我只给你留下一个我的论文的链接:
在 C 或 C++ 中,我应该根据 NULL/nullptr 检查指针参数吗?
- 运行时错误:矢量下标超出范围:正在检查空集
- 如何强制检查指针值
- 使用 const char* 键映射 C++ 检索空值
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 返回空值的字符串值
- boost::any 如何检查空值/未定义的值
- 如何检查映射值中是否存在元素
- C++ - 无法从基类继承 |提供空值
- C++空值和此指针
- 使用 cin 或 getline() 输入空值
- 可变参数列表是否以空值终止?
- 如何将整数重新初始化/设置为空值
- MSVC C6029 警告:缓冲区可能溢出,使用未经检查的值.检查缓冲区大小时,警告不会消失
- 检查构造函数的空值
- (C++) 检查指针数组中的空值
- 检查 std::shared_ptr 中的空值
- C++ 检查具有零和空值的数组的长度
- 检查初始值设定项列表中的空向量
- 仔细检查锁定值变为空
- 指针指向0x1 - 正在检查空值是否有效