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

调用memmove前如何正确校验参数以避免EXC_BAD_ACCESS错误?

memmove 非法访问校验方案

你可以直接在调用memmove前补充如下边界校验逻辑,覆盖所有可能触发EXC_BAD_ACCESS的异常场景:

完整修改后代码

int
fe_shift_frame(fe_t * fe, int16 const *in, int32 len)
{
    int offset, i;

    if (len > fe->frame_shift)
        len = fe->frame_shift;
    offset = fe->frame_size - fe->frame_shift;

    // 异常场景校验,满足任一条件直接返回错误,不执行memmove
    if (fe->spch == NULL
        || fe->frame_size <= 0
        || fe->frame_shift <= 0
        || offset <= 0
        || offset > fe->frame_size) {
        return -1;
    }

    /* Shift data into the raw speech buffer. */
    memmove(fe->spch, fe->spch + fe->frame_shift,
            offset * sizeof(*fe->spch));

    return 0;
}

校验项说明

  • fe->spch == NULL:校验语音缓冲区指针非空,避免空指针访问
  • fe->frame_size <= 0 / fe->frame_shift <= 0:校验音频帧长、帧移配置为合法正整数,避免配置异常导致后续长度计算错误
  • offset <= 0:避免负长度传入memmove,C语言中memmove的长度参数是无符号类型size_t,负数会被转换为超大正整数,直接触发越界访问
  • offset > fe->frame_size:校验偏移量不超过帧长范围,避免读取超出缓冲区边界的内存

如果后续代码需要用到输入参数in拷贝数据,还需要补充in != NULL && len > 0的校验。

内容的提问来源于stack exchange,提问作者Toine db

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:57:04