内存填充越界 + malloc空间不够导致越界
2014-11-01 12:23
267 查看
【创建时间:2014-11-1 11:50】[2014-10-31]:环境:系统:Linux版本:3.08 平台:Hisi3516c。内存填充越界:问题:申请了一个2048字节局部静态的变量存储一个固定RGB值,方便后续画框、线时快速copy。但是在第一次赋固定值时,越界了,导致内核自动向应用程序 发送信号
SIGBUS(7)给应用程序,导致应用程序异常退出。
static char s_DefColor[2048] = {};
static char s_fillflag = 1;
//错误代码:
if(1 == s_fillflag)
{
int cycle =0;
unsigned short color = 0xfc00;
s_fillflag = 0;
for(;cycle < 2048;cycle++)
{
memcpy(s_DefColor + (cycle <<1), &color,2);//由于每次移动两个字节,而循环了2048次,导致数据填充越界,
//当cycle >= 1024时,填充的位置为位置区域,所以系统发送
//SIGBUS(7)给应用程序,导致应用程序异常退出。
}
}
//更正后的代码
if(1 == s_fillflag)
{
int cycle =0;
unsigned short color = 0xfc00;
s_fillflag = 0;
for(;cycle < 1024;cycle++)
{
memcpy(s_DefColor + (cycle <<1), &color,2);//由于每次移动两个字节,而循环了2048次,导致数据填充越界,
//当cycle >= 1024时,填充的位置为位置区域,所以系统发送
//SIGBUS(7)给应用程序,导致应用程序异常退出。
}
}
收获:
1、在写程序时一定要打印出每次收到的系统信号值,方便快速定位到是什么问题导致程序崩溃。2、在使用指针时,一定要注意内存是否越界。Malloc空间不够导致越界:问题:由于像素格式为ARG1555,所以每个像素点的颜色实际有两个字节的ARGB值确定。而我在填充的时候注意到了,但是在申请填充内存空间实际时却没有考虑到两字节,导致填充时越界,出现程序自动崩溃。收获:在处理一个问题时,一定要先了解清楚其原理,例如像素格式会影响决定每个像素点的颜色的字节数。
相关文章推荐
- 内存越界导致的malloc失效问题
- 内存写越界导致破环堆结构引起的崩溃问题定位经验[如报错malloc(): memory corruption或free(): invalid next size]
- 内存写越界导致破环堆结构引起的崩溃问题定位经验[如报错malloc(): memory corruption或free(): invalid next size]
- 使用malloc分别分配2KB的空间,然后用realloc调整为6KB、1MB、3MB、10MB空间,并且将这五块内存分别用“A”、“B”、“C”、“D”、“E”填充
- 内存写越界导致破环堆结构引起的崩溃问题定位经验[如报错malloc(): memory corruption或free(): invalid next size]
- C语言学习7 :二级指针定义,强制转换,多级指针初步,6级指针构造,错误应用*p=&a,错误应用 二级p2,void型指针的兼容性,malloc函数基本用法,malloc分配空间和堆栈空间的区别,验证malloc函数内存的分配,验证malloc函数的越界,内存泄漏,指针不能返回局部变量地址,内存分配
- 与内存有关的那些事儿(数组分配空间不够,导致缓冲区溢出,从而strcpy会出现异常)
- Malloc内存泄露和内存越界问题的研究
- 【总结】malloc最多能分配多大的内存空间?
- Malloc内存泄露和内存越界问题的研究
- 磁盘空间不够导致mysql崩溃重启
- malloc一次性最大能申请多大内存空间
- 数组越界造成的其相邻的数组的内存空间被破坏的严重问题。
- 使用malloc分别分配2KB的空间,然后用realloc调整为6KB的内存空间,打印指针地址
- 又一种内存越界的情况, 野指针导致sprintf函数内存越界
- 由于磁盘空间不够导致redis,zookeeper,kafka,storm死掉的解决方法
- malloc一次性最大能申请多大内存空间
- innodb 乐观插入因空间不够导致失败,进入悲观插入阶段,这个空间的大小限制
- 线程创建未回收导致的内存泄漏问题(进程中的堆栈内存,并不是malloc出来的内存)
- C动态字符串,动态开辟内存空间相关 malloc realloc 用法