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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:27:02