使用指针修改int值为何触发栈破坏?能否通过指针修改对应内存位置?
问题产生原因
- 核心原因是栈内存越界写入:你仅定义了单个
int类型变量result,仅占4字节(常规32位int长度)的合法栈空间。但reverseDigits2处理参数123时会执行3次循环:- 第一次修改
*result时,指针指向你合法申请的result变量地址,操作正常 - 每次循环结束执行
result++后,指针会向后偏移1个int长度,指向result变量后方未被你申请的栈内存区域,第二次、第三次写入操作会篡改栈上的其他数据(包含栈保护机制的金丝雀(Canary)校验值) - 函数返回时系统检测到Canary值被非法篡改,直接触发栈破坏告警终止程序
- 第一次修改
- 额外语法笔误:代码中定义的变量名为
result,但调用reverseDigits2时传的参数是&results,多了后缀s,修复栈越界问题前需要先修正这个笔误。
指针修改内存的相关说明
不存在无法通过指针修改对应内存位置的限制,只要指针指向的是你拥有合法读写权限的内存区域,就可以正常修改。比如你把变量定义从int result;改成int result[3];,提前申请足够容纳3个int的栈空间,再通过指针操作写入就不会触发栈破坏问题。
内容的提问来源于stack exchange,提问作者karmacollide
相关产品推荐
相关产品推荐

