You need to enable JavaScript to run this app. C++中除nullptr外可稳定触发访问违例的安全指针实现方案(适配VS2019)
优惠活动
大模型
产品
解决方案
定价
更多

C++中除nullptr外可稳定触发访问违例的安全指针实现方案(适配VS2019)

C++ 适配VS2019的稳定触发访问违例指针实现方案

存在合规的实现方式,针对VS2019对应的Windows开发环境,有两种不会产生未定义行为、可稳定触发访问违例的方案:

方案1:使用Windows系统预留的低地址常量

Windows用户态进程的前64KB(地址范围0x00000000~0x0000FFFF)是系统永久预留、不会映射到任何物理内存的区域,任何对该区域的访问都会直接触发访问违例。
你可以直接将指针初始化为该区域的非0值即可,示例代码:

// 编译期常量,访问一定会触发异常
constexpr void* g_invalid_ptr = reinterpret_cast<void*>(0x0000FFFF);

该方案的优势:

  • 无需调用任何运行时API,编译期即可确定值
  • 行为完全稳定,Windows从XP到最新版本都保留了该低地址预留设计
  • 规避了空指针算术运算的未定义行为,VS2019下编译不会出现报错

方案2:调用VirtualAlloc申请无访问权限的预留内存

如果不希望硬编码常量地址,可以调用Windows系统API申请一块仅预留、未提交且无访问权限的内存页,返回的指针访问时一定会触发违例,示例代码:

#include <Windows.h>

void* get_invalid_ptr() {
    // 申请1页4KB内存,仅预留不提交,设置无访问权限
    return VirtualAlloc(NULL, 4096, MEM_RESERVE, PAGE_NOACCESS);
}

该方案的优势:

  • 完全符合C++标准的指针使用规范,无硬编码的平台相关常量
  • 可按需调整拦截的内存范围,适合需要多个独立无效指针的场景
  • 跨Windows版本兼容性更强,不受系统地址空间布局调整影响

注意事项

之前尝试给nullptr加1失败是正常的,C++标准明确规定对空指针执行算术运算属于未定义行为,不同编译器、不同编译选项下的行为完全不可控,不建议使用该方式生成无效指针。

内容的提问来源于stack exchange,提问作者Tobias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 06:54:03