aarch64架构下Valgrind报栈指针下非法写入是否为代码bug?
结论
你的代码没有问题,这是Valgrind在AArch64平台上的已知指令模拟缺陷导致的误报,无需担心代码逻辑bug。
具体原因分析
- 报错指令
str q0, [sp, #-16]!是AArch64架构标准的预减寻址栈操作,执行逻辑是先将SP寄存器的值减16,再将q0寄存器的16字节数据写入更新后的SP指向的地址,全程不存在写入栈指针下方区域的非法操作,指令本身完全合规。 - 该误报的核心原因是旧版本Valgrind对AArch64 NEON/SIMD寄存器的预减寻址操作模拟时序错误:它会先判定写入地址是当前SP减16的位置(此时SP还未更新,被判定为栈指针下方的非法地址),再执行SP减16的操作,完全颠倒了预减寻址的执行顺序。而你提到的
stp x29, x30, [sp, #-48]!指令使用通用x寄存器,Valgrind对这类通用寄存器的预减操作模拟是正常的,所以不会误报。 - 地址
0x388650处的大栈空间分配操作和本次误报没有直接关联,只是刚好位于报错指令之前,不影响判定结果。
验证与规避方案
- 你可以将代码用
-fsanitize=address参数编译后运行,AddressSanitizer不会报同类栈越界错误,可进一步确认是Valgrind的问题。 - 该bug在Valgrind 3.17及以上版本已经被修复,升级到最新版Valgrind即可消除该误报。
内容的提问来源于stack exchange,提问作者swineone
相关产品推荐
相关产品推荐

