整数运算:乘除详解

本文探讨了C语言中无符号和补码乘法的位级表示,以及它们在处理溢出时的差异。文章通过一个XDR库的安全漏洞实例展示了未正确处理乘法可能导致的缓冲区溢出问题。此外,还讨论了优化乘法和除法运算的方法,如利用移位和加法替代乘法,并提出了修复潜在溢出的策略。
摘要由CSDN通过智能技术生成

 整数运算

无符号乘法: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的幂的情况,然后再概括成乘以

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值