先给出一个有漏洞的二分查找,c语言实现
-
static int binary_search(int target, int array[], int size)
-
{
-
int l = 1;
-
int r = size - 1;
-
int h = 0;
-
if (size <= 0)
-
return -1;
-
while(l <= r){
-
h = (1+r)/2;
-
if(target > array[h])
-
l = h+1;
-
else if(target < array[h])
-
l = h-1;
-
else
-
return h;
-
}
-
return -1;
-
}
分析:
该代码最大的漏洞在于:
因为h是int类型,在32位或64位机器上它所能表示的最大的数是2147483647,如果l与r的和大于这个数就会导到加法溢出,会得到一个负数,结果可能:
1. 如果数组array是在堆中分配,系统则会崩溃;
2. 如果
数组array是在栈中分配,则会导到数据漏洞,黑客可以依次尝试获取有用的信息。
那么正确的表示方式应该是怎么样的叫?
引用:《码农增刊Linux与Linux》
阅读(425) | 评论(0) | 转发(0) |