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

