请教 short int 的用法 (100分)

  • 主题发起人 主题发起人 well_2002
  • 开始时间 开始时间
W

well_2002

Unregistered / Unconfirmed
GUEST, unregistred user!
学过 short int 型变量,可是没怎么用过,哪位朋友能解释一下 short int 的作用(一般书上将得很笼统)及其用法(听说与溢出编程有关),最好顺便解释一下溢出编程:)
谢谢
 
Shortint -128到127 8位带符号整数。
它也没有什么特殊的用途,只是差别在于占用内存的大小和表示整数的范围不同,在32位
程序设计时常用Integer类型,可以满足大部分应用的需要,只在需要处理超出Integer
类型的整数或为了节省内存时,才使用其它整数类型。
比如:
Integer为32位带符号整数,范围从-2147483648到2147483647。当你的程序不用这么大的
数的时候,而且用Shorint已足够的时候,用Shorint就可以节约一点内存空间。
 
[:D]是我搞错了吗?Short int or Shorint??
 
对, 但是听说 short int 的这个特性可以用来利用溢出编写程序,具体如何还请指教。
另外 short int 的范围在不同的编译器中不同,但总是满足长度不大于 int 型。
 
我在编读文件的程序中常用,可按字节读整型量,如定义成Integer,一次读4个字节,
定义成SmallInt,一次读2个字节。
 
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没什么关系呀。[:D]
还有一种情况,就是变量类型使用不当造成的:
在Linux系统中,关于TCP/IP协议有这样一段代码,在接收到一个数据包之后,将其保存到临时缓冲区,
并用一个short int类型的变量记录包的长度,然后将这个临时缓冲区用memcpy复制到系统中专门存放IP包
的区域中去。这个过程乍看起来没有什么问题,但是,仔细研究之后就会发现一个Bug:用于存放长度的
变量的取值范围是-32768到+32767,而memcpy中缓冲区长度参数的取值范围是0到2^32-1,这样,当包的长度
大于32767时,就会成为负数,而这个负数在被转换为unsigned int之后会变成一个非常大的正数,于是,
不幸的事情发生了——memcpy函数将大量数据复制到位于系统内核的IP包缓冲区,导致溢出,将系统内核代码
覆盖,系统立马Down掉!
 
接受答案了.
 
后退
顶部