C 突破编译器限制

const 局部常量(栈上)突破限制

核心原理

  1. 内存位置:const修饰的局部常量存放在栈区,栈内存属性:可读、可写
  2. const 的本质:仅编译器层面的语法检查,不是硬件 / 内存读写保护
  3. 差异:修改局部常量编译器拦截;指针解引用修改内存可以绕过编译器检查
    ⚠️注意:全局const常量放在只读段 (.rdata),这种方法修改会直接程序崩溃,和栈上局部 const 不是一回事!

代码示例

c 复制代码
#include <stdio.h>
int main(void)
{
    int a = 0;
    const int b = 0; // 栈上局部const常量

    a = 1;   // ✅正常修改普通局部变量
    // b = 2; // ❌编译报错:表达式必须是可修改的左值

    int* p = &b;   // 取const常量地址,转成普通int指针
    *p = 2;        // 通过指针修改栈内存,绕过编译器const检查
    printf("a = %d\n", a);
    printf("b = %d\n", b);  //b=2
    printf("*p = %d\n", *p);
    return 0;
}

汇编对照(x86)

c 复制代码
; int a = 0
    mov dword ptr [ebp-0Ch],0
; const int b = 0
    mov dword ptr [ebp-18h],0
; *p = 2  指针修改
    mov eax,dword ptr [ebp-10h]
    mov dword ptr [eax],2

● 普通变量、栈 const 常量初始化汇编指令完全一样,只是栈偏移不同

● 编译器不会生成任何保护内存的硬件指令,仅在编译阶段拦截直接赋值

重点结论

  1. 局部const常量:栈内存可写,仅编译器语法限制,指针可修改
  2. 全局const常量:放在只读段,内存硬件保护,指针修改触发访问异常崩溃
  3. 工程规范:不推荐这种写法,破坏const语义,可读性差,属于逆向底层研究技巧,正式项目禁止使用

区分

类型 存放位置 能否用指针修改
普通局部变量 栈区 ✅ 可以
const 局部常量 栈区 ✅ 可以(仅编译器拦截直接赋值)
const 全局常量 .rdata 只读段 ❌ 修改直接崩溃
相关推荐
wuminyu6 小时前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
小徐不徐说7 小时前
序列化与反序列化:把 C++ 对象可靠地保存下来
开发语言·数据库·c++·php
ragnwang7 小时前
Notes: Python pybind11 import C++ module
开发语言·c++·python
Wang's Blog7 小时前
Java 项目实战: 交友项目 - 搜索附近的功能概述和分析
java·开发语言·交友
骑着蜗牛撵大象3277 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
Dxy12393102168 小时前
JS DES 加密详解
开发语言·javascript·arcgis
充值内卷8 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
云和数据.ChenGuang8 小时前
深入解析 Python 的 dir():从用法到 CPython 源码实现
开发语言·人工智能·python·langchain
重生之我在番茄自学网安拯救世界9 小时前
AI 开发者日报 第1期(本周精选)| 插件市场投毒、智能体搞出“官僚饥荒村”,十年前的 CNN 打赢大模型
人工智能·网络安全·大模型·ai编程·智能体
nice_lcj5209 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试