最近时间比较闲,无事拿着深入理解计算机原理读了起来;突然发现,平时只知道写代码,很多细节方面的知识都被我们忽略了,而这些东西随时都可能给我们的程序造成一个灾难性但却又难以发现的漏洞,比如在我们平时用C或C++编程的时候,我们经常会用到类似数据类型强制转换等操作,而我们却没有用心去考虑,这样的转换是否存在漏洞现在简单说说数据的扩展和截断。
1、数据的扩展
在数据扩展的时候,需要将数据扩展成字符数更长的数据的时候,一般低位都保持不变,继续保留原有的数据,多出的高字节数据,需要根据当前被扩展数据进行不同的填充。
如果被转换的数据是是无符号型数据,则直接简单的填充0;相反,如果被转换的数据是有符号数据,则要根据它的最高位进行区分,如果最高位是0,则填充0,反之,则填充1;
2、数据截断
数据截断,顾名思义,根据要求,将数据的高字节数据截去,只保留低字节部分。很容易理解。
虽然这样看,数据的扩展和截断都是很容易理解的,但是,在我们平时编程的时候,如果不加以留意,随时都可能造成隐患;下面举个例子
0x0000fffeU,这是一个正数,我们首先将他进行截断成一个short int 的数据 short x = (short)0x0000fffe; 得到的数字是0xfffe, 如果再将他转换成unsigned int ,得到的数字是
0xfffffffeU,一个数字,截断之后,再转回来,完全不一样;
感觉这种数据转换里面存在这各种雷区,如果稍不留意,可能就会踩中地雷。再举个简单的例子
int x = -1;
if (x < 0) ..... 这里得到的是真
if(x < 0u) ...... 这里就是假了,因为 C语言里面会进行隐示的转换,默认将int 转换成unsigned int ;所以就是假了