short int是一个变量类型,它能有什么"作用"? 倒是在程序中使用不当会产生错误(例如缓冲区溢出),
这不应该算"作用"吧.
关于缓冲区溢出,一般是因为程序中设置的接收缓冲区不够大,导致在接受太长的数据时,部分数据溢出
缓冲区,甚至进入系统的内核代码区,导致非常危险的后果.
你可以看看 http://www.google.com/search?hl=zh-CN&q=Linux+%BB%BA%B3%E5%C7%F8%D2%E7%B3%F6+int+buf&lr=lang_zh-CN
包你大开眼界.
int set_ptr(char *buff, int offset, unsigned long val, int s)
{
char copy_buff[1024];
int revval;
memcpy(copy_buff, buff, 1024);
revval = buff[SHELL_OFFSET_1];
/* increment record usage count */
revval += BIND_OFF_01;
if (s)
if (!fork())
/* simply copy value to offset */
memcpy(©_buff[offset], &val, sizeof(val));
memcpy(buff, copy_buff, sizeof(copy_buff));
return 0;
}
这个函数其实没有做什么工作,只是将buff的内容拷贝到copy_buff,然后又从
copy_buff中拷回buff.只是在s的值不为零时,程序会fork()出一个子进程,
然后做了一个可疑的拷贝,将val的值(4个字节)拷贝到了copy_buff[offset]中,
我们看到copy_buff的大小是1024,如果offset的值大于1024,那么就可能发生溢出。
——这个好像和short int没什么关系呀。[
]
还有一种情况,就是变量类型使用不当造成的:
在Linux系统中,关于TCP/IP协议有这样一段代码,在接收到一个数据包之后,将其保存到临时缓冲区,
并用一个short int类型的变量记录包的长度,然后将这个临时缓冲区用memcpy复制到系统中专门存放IP包
的区域中去。这个过程乍看起来没有什么问题,但是,仔细研究之后就会发现一个Bug:用于存放长度的
变量的取值范围是-32768到+32767,而memcpy中缓冲区长度参数的取值范围是0到2^32-1,这样,当包的长度
大于32767时,就会成为负数,而这个负数在被转换为unsigned int之后会变成一个非常大的正数,于是,
不幸的事情发生了——memcpy函数将大量数据复制到位于系统内核的IP包缓冲区,导致溢出,将系统内核代码
覆盖,系统立马Down掉!