LLVM IR程序打印变量1次崩溃2次正常,疑与_aligned_free有关
LLVM IR程序崩溃问题分析与解决:错误使用
_aligned_free释放栈内存 问题根源
你代码里的核心错误是用_aligned_free释放alloca分配的栈内存。alloca是在栈上分配空间,函数执行完毕返回时,栈帧会自动被系统回收,完全不需要手动调用释放函数。而_aligned_free是专门用来释放_aligned_malloc这类堆上分配的对齐内存的,用它操作栈内存会直接破坏栈结构,必然导致程序崩溃。
至于“打印两次时看似正常”,这属于未定义行为——栈被破坏后,程序行为完全不可预测,只是碰巧没触发崩溃而已,本质上代码依然是错误的,绝对不能依赖这种情况。
正确的内存管理方案
- 若使用
alloca分配栈内存:无需手动释放,函数返回时栈帧自动销毁,内存会被系统回收。 - 若需要在堆上分配对齐内存:
- Windows平台:用
_aligned_malloc分配,对应_aligned_free释放; - Linux/macOS平台:用
posix_memalign分配,对应free释放即可; - 注意在LLVM IR里要声明准确的函数签名,不能用可变参数
(...),否则会引发调用约定错误。
- Windows平台:用
修正后的代码
直接移除所有_aligned_free调用即可,同时优化printf的函数签名声明:
declare i32 @"printf"(i8*, ...) define i32 @"main"() { entry: %".2" = alloca i32 store i32 534, i32* %".2" %".4" = alloca [4 x i8] store [4 x i8] c"%d\0a\00", [4 x i8]* %".4" %".6" = load i32, i32* %".2" %".7" = call i32 (i8*, ...) @"printf"([4 x i8]* %".4", i32 %".6") %".9" = alloca [4 x i8] store [4 x i8] c"%s\0a\00", [4 x i8]* %".9" %".11" = alloca [9 x i8] store [9 x i8] c"sdgfsdfg\00", [9 x i8]* %".11" %".13" = call i32 (i8*, ...) @"printf"([4 x i8]* %".9", [9 x i8]* %".11") %".14" = alloca i32 store i32 534, i32* %".14" %".16" = alloca [4 x i8] store [4 x i8] c"%d\0a\00", [4 x i8]* %".16" %".18" = load i32, i32* %".14" %".19" = call i32 (i8*, ...) @"printf"([4 x i8]* %".16", i32 %".18") %".21" = alloca [4 x i8] store [4 x i8] c"%s\0a\00", [4 x i8]* %".21" %".23" = alloca [9 x i8] store [9 x i8] c"sdgfsdfg\00", [9 x i8]* %".23" %".25" = call i32 (i8*, ...) @"printf"([4 x i8]* %".21", [9 x i8]* %".23") ret i32 0 }
内容的提问来源于stack exchange,提问作者Aus.
相关产品推荐
相关产品推荐

