You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

函数结束后局部变量未销毁?LLVM-IR代码运行疑问

返回局部变量指针仍能取值的原因分析

先看你提供的LLVM-IR代码:

; ModuleID = 'example.-.input.c'
source_filename = "example.-.input.c"

define ptr @test() {
entry:
  %0 = alloca ptr, align 8
  %1 = alloca i32, align 4
  store i32 2, ptr %1, align 4
  store ptr %1, ptr %0, align 8
  br label %ret

ret:                                              ; preds = %entry
  %2 = load ptr, ptr %0, align 8
  ret ptr %2
}

define i32 @main() {
entry:
  %0 = alloca i32, align 4
  store i32 0, ptr %0, align 4
  %1 = call ptr @test()
  %2 = load i32, ptr %1, align 4
  store i32 %2, ptr %0, align 4
  br label %ret

ret:                                              ; preds = %entry
  %3 = load i32, ptr %0, align 4
  ret i32 %3
}

你遇到的现象本质是未定义行为的偶然表现,原因有这几点:

  • 栈内存未被即时覆盖:test函数返回后,其栈帧会被标记为可复用,但不会立即擦除内存内容。main函数紧接着执行load操作,此时栈上原来%1的内存还没被新的数据覆盖,所以能读到之前存储的2。但这完全是巧合,一旦后续有其他函数调用、栈分配操作,这块内存就会被覆盖,结果就会变成随机值。

  • LLVM-IR的抽象特性:LLVM-IR是中间表示,没有强制规定栈帧销毁时必须立即清除内存。在未优化的IR代码中,没有插入覆盖该内存的操作,所以内存内容暂时保留。但这不是合法逻辑,只是编译器未优化时的表现。

  • 未开启优化的影响:如果开启LLVM优化(比如-O2),编译器会识别出返回局部变量指针的未定义行为,进行激进优化——比如直接让test返回无效指针,或者让main读到随机值,甚至导致程序崩溃。当前未开启优化,所以内存暂时没被改动。

必须明确:这种返回局部变量指针的写法是严重错误的,属于C语言和LLVM规范中的未定义行为,不能依赖它正常工作。不同环境、不同优化等级下,结果完全不可预测,甚至会引发安全漏洞。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 17:16:19