地址范围的边界值判断

最近在项目中遇到如下问题:
起始地址addr和大小size的内存块是已知的合法地址范围。
如果[sub_addr, sub_addr + sub_size]是一个有效的地址范围,并且在[addr, addr + size]范围内返回1,否则返回0。

分析:
此类问题主要考查的是计算机中数值的溢出与反转。
在数学领域,已知 a >= 0, b >= 0的情况下,由a + b <= c可以推导出 a <= c 且 b <=c,
所以从数学角度来看,只需要判断两点:
① add <= sub_addr
② sub_addr + sub_size <= size

但是由于计算机中能表示的最大数是有限的,超过了最大数就会出现反转现象,会溢出从0开始。
因此需要采用白名单的写,再加上一个检查溢出的判断条件:
sub_addr <= sub_addr + sub_size
如果真的存在反转,应该有这样的关系 sub_addr + sub_size < sub_addr

代码如下

int check_boundary (uint32 addr, uint32 size, uint32 sub_addr, uint32 sub_size)
{
	if (add <= sub_addr &&
		sub_addr + sub_size <= addr + size &&
		sub_addr <= sub_addr + sub_size) {
		return 1;
	} else {
		return 0;
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值