free(): invalid pointer arm环境O2优化下string free异常分析
文章目录
- 1. 背景:
- 2. 代码示例:
- 3. 分析过程
- 3.1 现象一
- 3.2 现象二
- 3.3 现象三
- 4.结论
1. 背景:
近期,ARM开发环境中出现过一次free(): invalid pointer的coredump问题,其根本原因是函数中的string对象内存被踩。在此处做下记录。
下面的程序是自己写的模拟程序。
2. 代码示例:
void string_memory_overlay()
{char userName[16] = {0};string sUser;strncpy(userName, "012345678901234", sizeof(userName)-1);sUser = userName;strcpy(userName, "01234567890123456");//踩内存return;
}
3. 分析过程
对于这个程序来说,分析很简单,userName在strncpy的时候超出了字符数组长度,会发生访问非法的现象,如果string对象的内存恰好被踩了,那string对象在free时就是会崩溃的。但是这个问题出现一些奇怪的现象:
- 现象一:不管是arm环境还是x86环境下,如果不带优化,程序会不会崩溃取决于这两个变量定义的先后顺序
- 现象二:arm下面如果是没有带优化编译的程序,程序不会崩溃,但是用O2优化编译的程序会崩溃;
- 现象三:同样的程序放在x86环境下面即使用O2编译,也不会崩溃
- 我通过gdb分别分析了这三种场景,来解释其出现的原因:
3.1 现象一
不管是arm环境还是x86环境下,如果不带优化,程序会不会崩溃取决于这两个变量定义的先后顺序
- 下面两张图分别是ARM环境无优化userName定义在前和ARM环境无优化string定义在前的GDB调试图
- 这两种情况下,userName定义在前不会导致程序崩溃,userName定义在后会导致崩溃。其原因在于无优化的情况下,编译器不会对变量的入栈顺序做任何调整。
- userName定义在前的情况下,userName先入栈,而栈的地址增加方向是从高地址往低地址增长,即先入栈的具有更高的地址,因此userName的地址比string的地址更高。当userName出现越界时,非法访问的内存地址不可能小于0xfffffffff1f0,因此,string对象的内存是安全的。而userName定义在后的情况恰好相反,string对象具有更高的地址,userName越界后,非法访问到的地址是string对象的地址,string对象的内存被踩,free异常。
3.2 现象二
arm下面如果是没有带优化编译的程序,程序不会崩溃,但是用O2优化编译的程序会崩溃
- 下面两张图分别是arm环境下未优化编译的程序和O2优化编译的程序的GDB分析图
- 从这两种情况,可以发现,-O2优化编译后,修改了变量的入栈顺序。相比无优化的程序,O2编译后的程序,string对象定义在后,但却是先入栈的。这种情况下,userNameu出现越界,就会非法访问string对象的内存,string对象的成员变量被修改,free就会异常了。
3.3 现象三
同样的程序放在x86环境下面即使用O2编译,也不会崩溃
- 下面两张图分别是arm和x86环境下同样O2优化编译的程序的GDB分析图
- 从两张分析图的对比得出,arm和x86环境O2优化都会调整入栈顺序,但是对于string这种非基本数据类型的顺序调整是不一样的。
- arm的O2优化总是将非基本数据类型先入栈,因此,其地址是最高的。
- x86的O2优化总是将非基本数据类型放在基本数据类型之后入栈,因此,其地址是最低的。
- 因为以上两点原因,x86下面O2不会崩溃的原因就清楚了,string对象的地址比userName的地址更低,userName非法访问的地址不会扩展到string对象的内存地址。
- 注:对于arm和x86优化非基础类型入栈顺序在定义的基础类型较多的情况可以更清楚的看出,建议读者可以自己写程序测试下
4.结论
- O2编译会调整函数中变量的入栈顺序;
- ARM和X86的O2选项对于非基础类型变量的入栈顺序的调整是不一样的,ARM非基础类型先入栈,X86非基础类型后入栈
free(): invalid pointer arm环境O2优化下string free异常分析相关推荐
- 编译器O2优化下,分块矩阵乘法的TLB分析猜想
直接将写在实验报告里的那段放进去就算了,好累. 3.3(2分)对最优分块大小的分析 实验表明,分块大小为 32 时性能最好.这个结果和你的预期一致吗? 不一致 .如果不一致,其原因在于 使用perf工 ...
- 单片机小精灵t2_搭建S5P4418 ARM环境下 GPU OPENGL ES开发环境(适用 NANOPI2,3,M2,M3,T2,T3)...
本帖最后由 3guoyangyang7 于 2017-8-20 22:38 编辑 先说一下背景,这几天做一个摄像头处理的qt项目,摄像头的像素是1280*720的,25fps,用qt的painter重 ...
- ARM 环境下使用azure powershell 从远程blob中拉去vhd 并创建虚拟机
最近需要从指定公共访问的blob中复制vhd到自己的订阅存储账户,并使用vhd创建AZURE ARM虚拟机(非经典版),而且在portal.azure.cn中无法实现虚拟机映像创建等功能,于是自己使用 ...
- linux下将QT移植至arm环境
前言 讲下整个项目流程,我们的目标是把qt编出来程序放在arm开发板上面跑,首先下载QT源码和tslib源码(QT源码编译和QT程序运行需要tslib库的支持),在虚拟机里使用交叉编译将QT源码编译安 ...
- TVM在ARM GPU上优化移动深度学习
TVM在ARM GPU上优化移动深度学习 随着深度学习的巨大成功,将深度神经网络部署到移动设备的需求正在迅速增长.与在台式机平台上所做的类似,在移动设备中使用GPU可以提高推理速度和能源效率.但是,大 ...
- C/C++编译器并行优化技术:并行优化针对多核处理器和多线程环境进行优化,以提高程序的并行度
目录标题 引言 数据并行:将数据集分割成多个子集,分配给多个线程或处理器并行处理. 延迟执行与乱序执行:对指令的执行顺序进行调整,提高指令流水线的利用率和性能. 延迟执行 乱序执行 任务并行:将程序分 ...
- ARM NEON指令集优化理论与实践
ARM NEON指令集优化理论与实践 一.简介 NEON就是一种基于SIMD思想的ARM技术,相比于ARMv6或之前的架构,NEON结合了64-bit和128-bit的SIMD指令集,提供128-bi ...
- Java 调用 Caffe_解决 free(): invalid pointer: 0x00000000019ff700 运行时报错(caffe)(libtool使用)...
编译成功,运行时报错: 在使用 pytorch or tensorflow or caffe 时,都可能存在这个问题: *** Error in `xxx': free(): invalid poin ...
- VS2015配置内核WDK7600环境,32位下.
VS2015配置内核WDK7600环境,32位下. 学习内核驱动的编写,就要会配置环境.不然总是用记事本编写.比较不方便. 环境配置如下. 1.首先下载WDK7600, 课堂资料代码中已经上传.链接: ...
最新文章
- C语言经典例100-将学生成绩写入文件
- vue-router 源码:路由的安装与初始化
- nyoj-68--三点顺序
- zeal刷新不出来_推进重涂市场标准化,立邦率先推出刷新服务“八大验收标准”...
- 工作30:加入git版本库
- 2015第25周三iframe小结
- 手机软件项目管理—项目组内部的沟通
- 2.移植uboot-添加2440单板,并实现NOR、NAND启动
- html的canvas显示数字,HTML5效果:Canvas 实现圆形进度条并显示数字百分比
- catkin_make 只编译一个包
- (每日一题 day 003 - 二维前缀和+动态规划) 1314. 矩阵区域和
- FRR BGP 协议分析 3 --- FSM 状态机
- 多周期MIPS CPU硬布线控制器设计
- 俄罗斯方块,消消乐源码下载
- 【前端工具】实用的代码生成器
- 计算机语言元素周期表,多国语言的化学元素周期表
- PS——字体斜阴影效果
- 网络安全诉讼风险:首席信息安全官最关心的4个问题
- 影视后期算不算计算机类专业,影视后期是什么意思(后期剪辑属于什么专业)...
- 只会写代码的程序员不是好程序员