晓风彩票网站建设软件,找方案的网站,临淄网站建设公司,重庆铜梁网站建设公司线上系统发生了crash#xff0c;后发现是整型溢出。
1、初始化函数的伪代码#xff1a;
init_mem(int count, int size){for(int i0; icount; i)mem_list[i] i*size; # 溢出发生的地方}
2、问题分析#xff1a;
原有的变量 i、size 为有符号的int类型#xff0c;i…线上系统发生了crash后发现是整型溢出。
1、初始化函数的伪代码
init_mem(int count, int size){for(int i0; icount; i)mem_list[i] i*size; # 溢出发生的地方}
2、问题分析
原有的变量 i、size 为有符号的int类型int大小为4字节int表示的最大正数为 0x7FFFFFFF。当 i * size 的乘积超过int表示的最大正数时发生溢出。 char* 本质是一个无符号数长度为8字节char* 与 int相加时int会自动转换为无符号的8字节数值。当 int 溢出时转换出的无符号数与实际的数值不符导致 men_list[i] 中保存的是一个无效地址当访问这个无效地址时发生crash。 例如i47674881 时 i*size 得值为 十六进制0x88662030十进制 -2006573008已经溢出。其最高位为 1 表示负数。当与char* 相加时由4位扩展到8位时高位补符号位1得到的值为 0xFFFFFFFF0x88662030再与char* 相加结果是一个非法地址。
当从mem_list[i]中取出非法地址进行访问时crash。
3、解决
将 int 变量改为 无符号长整型size_t 或 unsigned long防止溢出。