最近在项目中遇到如下问题:
起始地址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;
}
}