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
相关产品推荐
相关产品推荐

