整数运算
无符号乘法:C语言中的无符号乘法被定义为产生w位的值
补码乘法:,C语言中的有符号乘法是通过将2w位的乘积截断为w位的方式实现的。
我们认为对于无符号和补码乘法来说,乘法运算的位级表示都是一样的,机器可以用一种乘法指令来进行有符号和无符号整数的乘法。
XDR库中的安全漏洞
包含安全漏洞的代码与下面所示类似:
/*
* Illustration of code vulnerability similar to that found in
* Sun's XDR library.
*/
void* copy.elements(void *ele_src □ , int element, size_t ele_size) {
/*
* Allocate buffer for element objects, each of ele_size bytes
* and copy from locations designated by ele_src
*/ •
void *result = malloc (ele_cnt * ele_size);
if (result == NULL)
/* malloc failed */
return NULL;
void *next = result;
int i;
for (i = 0; i < element; i++) {
/* Copy object i to destination */
memcpy(next, ele_src[i], ele_size);
/* Move pointer to next memory region */
next += ele_size;
}
return result;
}
程序员用参ele_cnt等于1 048 577 (220+ 1)、 ele_size等 于4 096 (212)来调用这个函数。然后第10行上的乘法会溢出,导致只会分配4096个字节,而不 是装下这些数据所需要的4294 971 392个字节。从第16行开始的循环会试图复制所有的字节,超 越已分配的缓冲区的界限,因而破坏了其他的数据结构。这会导致程序崩清或者行为异常。
乘以常数:在大多数机器上,整数乘法指令相当慢,需要10个或者更多的时钟周期,我们会考虑乘以2的幂的情况,然后再概括成乘以