分享
 
 
 

整数大小比较的潜在危险

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

在程序里头经常会用到整数之间的大小比较,但是其中潜在的危险却往往被忽略了。例如一个内存拷贝函数:

void memcpy(void *pTo,void *pFrom,size_t size)

{

assert(pTo != NULL && pFrom != NULL);

while( --size >= 0)

{

*pTo++ = *pFrom++;

}

}

这个函数正确吗?如果你认为它永远都不可能跳出那个该死的循环就对了。size_t是一个无符号整数类型(VC6.0: typedef unsigned int size_t,VC7.1: typedef unsigned __int64 size_t),所以--size得到的结果也是同样类型,而这样一个类型的值永远也不可能小于0!那我们尝试着改进它:

void memcpy(void *pTo,void *pFrom,size_t size)

{

assert(pTo != NULL && pFrom != NULL);

while( size-- > 0)

{

*pTo++ = *pFrom++;

}

}

这个版本中更改了循环条件,使得当size等于0的时候循环结束。危险消除了吗?嗯,消除了大部分,但是还存在着一个令人不愉快的地方。如果有一个int类型的变量len,用它做size的实参来调用memcpy,又假设碰巧len的值小于0,那么会出现什么结果呢?size接收到了一个负值,但因为它本身是无符号型的,所以它会把这个负值解释成为无符号型整数,那必然是个正值,如此一来混乱可想而知。这就是一个典型的有符号/无符号不匹配错误。再看一段代码:

unsigned long a = 0;

long b = 0;

long c = 1;

if( (a - c) < b )

{

// do something

}

if( (a - 1) < b )

{

// do something

}

这段代码的两个if语句的if分支有可能执行吗?答案是绝无可能。因为表达式(a - c)的类型不是long,而是unsigned long,它的值绝不会小于b(即0)。同样地,表达式(a - 1)的值也永远大于等于0。

上面两个例子代表了我们在写程序时经常会犯的错误:无意识地滥用类型不匹配的变量、表达式(尤其是有符号型与无符号型)之间的赋值与比较。

有什么办法能预防这种错误吗?事实上如果你足够警觉,将编译器的编译警告开关设为最高级(比如VC7.1的4级: /W4),那么任何一个负责任的编译器都会在上述情况下明白无误地警告你。顺便说一下,VC工程中默认的编译警告为3级,此时编译器的责任心就大大降低了,对上述的危险情况根本视若无睹。

所以为了让自己能够睡个安稳觉,首先应当尽量避免使用相异类型之间的赋值、比较。然后设定开发工具的检查为最严格等级,让它们能帮我们尽早地嗅出这类潜在的危险。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有