本文主要包括部分:
一、概念
二、分类
2.1 根据踩坏的内存和你的内存的关系分类
2.1.1 越界踩内存
2.1.2 use after free
2.1.3 use after return
2.1.4 随机踩内存
2.1.5 error free
2.2 根据踩坏的内存的位置分类
2.2.1 堆踩坏
2.2.2 栈踩坏
2.2.3 全局变量踩坏
2.2.4 mmap踩坏
2.3 应用下载及使用效果
2.3.1 字符串
2.3.2 图像或音频数据
2.3.3 指针
2.3.4 随机值
2.4 根据测试的手法分类
2.5 根据多次复现观察的结果分类
2.6 根据谁踩坏分类
一、概念
读写 不属于 本进程的内存就是内存踩踏,也叫踩内存。
解决踩内存的方法也就是:找出踩内存的具体代码位置并修复问题代码。
上面这句正确的废话说起来很简单,可做起来难呀!“纸上得来终觉浅,绝知此事要躬行!”
找出踩内存代码的具体位置很难,一般踩内存和程序崩溃没有任何关系,这就指数级增加了调试难度,所以解决问题前有必要深入了解踩内存的原理。
从时间轴看内存踩踏:
内存踩踏发生时,程序不一定立即Crash崩溃,如果是立即Crash崩溃,那就可以直接分析Crash调用栈,修复代码解决问题了。麻烦点在于Crash崩溃的点是之后的某个时间里,P和C没有关系。
那么,如何从C推导出P是解决踩内存的关键,我们先要研究C当下内存踩坏的情况来判断可能的原因。
二、分类
了解内存踩坏的情况对推导问题非常重要,知己知彼百战不殆。我们从不同的角度查看踩内存。
2.1 根据踩坏的内存和你的内存的关系分类
2.1.1 越界踩内存
1)申请的内存小了,例1如下:
char *p;
p = malloc(10);
strcpy(p, "helloworld");
strcpy()复制了11个字节(包括'\0'),但p只有10个字节的空间,把p后面的1个字节踩坏了。
2)定义的内存小了,例2如下:
void func()
{
int array[5];
for (i = 0; i <= 5; i++) {
array[i] = i;
}
}
array[5]已经不属于array的了(正确的是0~4),因此也把array后面的4个字节踩坏了。
3)栈溢出
全文内容见
系列文章转如下链接:
系列文章转如下链接:
Android Display Graphics系列文章-汇总
Android实战经验篇-系列文章汇总
https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzI5NDk3NzYxNw==&action=getalbum&album_id=3772136109094944770#wechat_redirect
Android实战经验篇-玩转Selinux(详解版)
https://mp.weixin.qq.com/s/Diqiq6SLUZLS5QZAamcj2A?token=1849347256&lang=zh_CN
系列文章关注公众号,持续更新中......