如何在不硬编码的情况下检测C/C++指针是否指向0xffffffffffffffff地址
跨平台检测全1非法指针的实现方案
检测逻辑实现
你之前查到的UINTPTR_MAX就是正确的选择,它是标准库定义的、与平台指针宽度一致的无符号整数类型uintptr_t的最大值,32位平台下自动为0xffffffff,64位平台下自动为0xffffffffffffffff,不需要硬编码即可兼容x86、x64架构。
你原有写法存在两个问题:一是运算符优先级错误,>=优先级高于&,原有判断逻辑等价于pointer & (0xffffffffffffffff >= ...),完全不符合预期;二是硬编码了64位的全1值,32位平台下会报错。
正确写法如下:
#include <cstdint> // C++环境引入,C环境引入<stdint.h> unsigned char* pointer; // ... // 指针转uintptr_t类型后与UINTPTR_MAX比较即可 if (reinterpret_cast<uintptr_t>(pointer) == UINTPTR_MAX) { // 命中非法指针,执行退出/报错逻辑 }
注:该防护仅为临时方案,你需要尽快排查根因修复赋值逻辑,避免遗漏其他非法指针场景。
主动构造全1地址指针的方法
全1指针本质就是将值为-1的整数强转为指针类型,由于无符号整数的溢出规则,(uintptr_t)-1自动等于UINTPTR_MAX,跨平台通用,构造代码如下:
// 主动构造指向最大地址的unsigned char*指针 unsigned char* invalid_ptr = reinterpret_cast<unsigned char*>(static_cast<uintptr_t>(-1));
常见触发该问题的根因排查方向
大部分场景下该非法指针都是错误处理逻辑导致的:
- 调用返回指针的接口时,没有判断错误码,直接把接口返回的
(void*)-1错误值当做合法指针使用 - 把有符号整数类型的错误返回值(例如-1)直接强转为指针类型
内容的提问来源于stack exchange,提问作者Evandro Coan
相关产品推荐
相关产品推荐

