一个由有符号下标引起的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的主要内容,如果未能解决你的问题,请参考以下文章

一个由于php代码结束符引起的技术bug

一个由于php代码结束符引起的技术bug

Flask项目中向Mysql存入Emoji表情引起的Bug

vscode代码片段建议bug

华为OD机试 - 单词反转(Python)| 真题含思路

华为OD机试 - 单词反转(JavaScript) | 机试题算法思路 2023