一个由有符号下标引起的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]]。

时间: 2024-10-24 13:09:58

一个由有符号下标引起的bug的相关文章

一个有趣的现象(苹果的bug Or 坑?),关于区分真机和模拟器的预编译宏

TARGET_IPHONE_SIMULATOR和TARGET_OS_IPHONE 是苹果的两个宏定义, 在真机sdk中位于ios->usr/include/targetconditionals.h中, 在模拟器sdk中位于simulator->usr/include/targetconditionals.h中 (笔者此时使用的xcode版本为5.1,sdk版本是7.1) 仔细看其模拟器sdk中的定义: #define TARGET_OS_IPHONE            1 #define

C++多重继承下一个子类和父类指针转换的bug

这两天有个C++新手问了我一个问题,他的工程当中有一段代码执行不正确,不知道是什么原因.我调了一下,代码如果精简下来,大概是下面这个样子: class IBaseA { public: virtual void fnA() = 0; int m_nTestA; }; class IBaseB { public: virtual void fnB() = 0; int m_nTestB; }; class CTest : public IBaseA,public IBaseB { public:

求数组和为某一个固定值的下标

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例: 给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1] public class shuzu { public int[] twoSum(int[] nums, int targ

做的简单的一个静态web服务器,遇到个bug, 提示osError,费了一番功夫找到了bug出处,这点一不小心就错了,socket须先绑定,再listen,如果是先listen再绑定,系统会自动分配一个端口,而程序绑定不了

代码改正之前,先执行了listen,到了bind就报错:此程序只需将listen和改到bind后面即可 from socket import *from multiprocessing import Process import re HTML_FILE = './html' class Server(object):     def __init__(self):          self.server_socket = socket(AF_INET,SOCK_STREAM)       

python 得到一个元素的所有下标(网友提供:http://www.oschina.net/code/snippet_212212_38917)

def all_index(l,o): def find_index(l,o,start=0): try: index=l.index(o,start) except: index=-1 return index indexs=[] i=0 while True: idx=find_index(l,o,i) if idx==-1: return indexs indexs.append(idx) i=idx+1 return indexs a='sdffesafd' print all_inde

简简单单用符号 画一个正三角形 用符号

num = 4sun1 = 1kong = [" "]hao = ["@"]a = [] # 小列表while num >= 0: a = kong * num + hao * sun1 + kong * num num -= 1 sun1 += 2 print(a) 原文地址:https://www.cnblogs.com/liyaobin/p/9968605.html

(6) 如何用Apache POI操作Excel文件-----POI-3.10的一个和注解(comment)相关的另外一个bug

如果POI-3.10往一个工作表(sheet)里面插入数据的话,需要注意了,其有一个不太被容易发现的bug. 被插入的工作表(sheet)里面的单元格没有包含任何的注解(comment)的时候,插入一行数据,不会有任何问题.但是如果被插入的工作表(sheet)里面的单元格只要包含任何的注解(comment)的时候,这个时候插入一行数据的时候,就会破坏这个文件.当程序执行完后,如果打开被插入数据的Excel文件,我们将会发现,其会弹出下面的对话框. 程序代码如下, package com.tibc

Loader Lock引起的一个Bug

在Windows中,让程序模块化实现的一种方式,就是让事实上现为动态链接库. 然后在主程序启动的时候隐式或者显示的去载入动态链接库.可是假设不恰当的编写动态链接库的DllMain函数,将会引起意想不到的Bug哦.比方典型的Loader Lock死锁问题. 这不,我们产品中就碰到了一个因为Loader Lock而引起的Bug.... 1. 背景介绍 当主程序在启动的时候,隐式或者显示的载入动态链接库的时候.调用动态链接库的DllMain.或者当创建线程的时候,线程启动过程中隐式的调用动态链接库的D

一个小小的程序Bug竟值400亿?

事件背景 日本公司J-Com在首次公开上市的日子就爆炸式地损失了超过400亿日元的天价损失,虽然日元那面额画得跟冥币似的,400亿日元也还是相当值些银子滴(按照当时的汇率,约为人民币27亿元). 事件的大致经过是由于一位操作员在离开盘还有几分钟的时候接到了一位客户"以61万日元的价格,卖出1股J-Com的股票"的委托,而田中君在接到委托后在交易终端上错误地输入了"以每股1日元的价格,卖出61万股". 至此,大家可想而知,事件继续发展下去会是怎样的灾难.但是,幸运的是