先看段代码:
if(s[d[i]]) { ... }
这里的d是一个char*的内存buffer,s是一个256长度的bool数组。上段代码逻辑是,s已进行过初始化,其作用是过滤字节,有些字节对应true,有些字节对应false。明显,d[i]有256种可能。上面的逻辑正确么?
上面的代码其实就是我项目里的一段代码,看似没有问题,实际上有个潜伏的bug。d[i]是有符号的,换句话说,d[i]可能为负。
项目里d[i]有一次等于0xc4,这个时候s访问越界了。因为d[i]为负,s[d[i]]往内存上游(也就是比s首地址更小的方向)访问内存,结果随机。
正确的代码应该是这样:s[(uint8_t)d[i]]。
时间: 2024-10-24 13:09:58