2013-02-08 49 views
0

问题很简单:给出start_indexcount,我想看看这些组合是否可以用来安全地访问一个包含length元素的数组。我有暂时如下:绑定检查和整数溢出

uint32_t start_index = (value from somewhere); 
uint32_t count = (value from somewhere); 
uint32_t length = (value set earlier); 
char *array = (memory allocated earlier); 

if(start_index + count < length) { 
    // access array starting at start_index 
} else { 
    // bailout 
} 

的检查,当然,不足之处,因为start_index + count可以超过一个uint32_t的最大可能值,并绕到小值。为了解决这个问题,我想知道将变量提升到64位还是置于第二个条件start_index + count > start_index更有效。或者也许还有其他一些聪明的方法来处理这个问题?

+0

有一长串的方法来检测事实之前或之后的整数溢出[这里](http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-cc )。 – Richard

回答

2

您可以通过不同的方式做事有点避免溢出:首先检查countlength小(保释出来以其他方式),那么你可以放心地比较start_index

+0

2人在这里看不到一个错误。来吧,'计数'小于或等于'长度'。 –

+0

如果'length == count',原始代码(假设没有溢出问题)将被解救出来。我的建议也会纾解。所以我不相信这里有一个OBOE。 – Mat

+0

拍摄,你是对的,我把原来的