一个由有符号下标引起的bug
Posted jiu__
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个由有符号下标引起的bug相关的知识,希望对你有一定的参考价值。
先看段代码:
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]]。
以上是关于一个由有符号下标引起的bug的主要内容,如果未能解决你的问题,请参考以下文章