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

C++实现栈寄存器值逆序的swap内存函数无修改效果问题排查

问题根因

代码的核心错误是循环终止条件设置错误,导致所有寄存器被交换了两次,最终内存回到初始状态,所以测试时会输出Same mem:

  • 当前循环逻辑是遍历整个待逆序的缓冲区:当i处于前半段区间时,会将第i个寄存器和倒数第i个寄存器完成交换;当i继续遍历到后半段区间时,会再次把已经交换过的寄存器对反向交换回来,相当于所有修改都被复原。

修复代码

将循环终止条件调整为仅遍历缓冲区的前半段即可,同时优化硬编码常量、增加参数合法性校验:

void reverse_local_regs(int size, int offset)
{
  const int BYTES_PER_REGISTER = 4;
  // 非法参数直接返回,避免越界访问
  if (size <= 0 || size % BYTES_PER_REGISTER != 0) {
    return;
  }
  uint8_t temp_reg[BYTES_PER_REGISTER];
  // 仅遍历前半段,避免重复交换
  for (int i = 0; i < size / 2; i += BYTES_PER_REGISTER)
  {
    memcpy(temp_reg, &target_types::buf[offset + i], BYTES_PER_REGISTER);
    memcpy(&target_types::buf[offset + i], &target_types::buf[offset + size - i - BYTES_PER_REGISTER], BYTES_PER_REGISTER);
    memcpy(&target_types::buf[offset + size - i - BYTES_PER_REGISTER], temp_reg, BYTES_PER_REGISTER);
  }
}

补充校验

调用时请确认传入的size参数是待逆序的所有寄存器的总字节数:比如你要逆序L0到L10共11个寄存器,size就应该为11 * 4 = 44,如果你的FL宏是寄存器总数,那么BYTES_PER_REGISTER * FL的传参是正确的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:39:02