美文网首页
内存被改写而造成的崩溃

内存被改写而造成的崩溃

作者: huangjun0 | 来源:发表于2018-12-04 11:06 被阅读0次

这几天发现一个随机的崩溃,在解析数据的时候偶尔会出现,而且崩溃的地方都不太一样,具体代码如下:

NSData *data = [NSData dataWithBytes:buffer length:Length];
Byte nameLength;
Byte pathLength;
void *nameBuffer;
void *pathBuffer;
             
[data getBytes:&nameLength range:NSMakeRange(0, 1)];
NSInteger nLength = (NSInteger)nameLength;
[data getBytes:&nameBuffer range:NSMakeRange(1, nLength)];
NSString *name = [[NSString alloc] initWithData:[NSData dataWithBytes:&nameBuffer length:nLength] encoding:NSUTF8StringEncoding];
             
[data getBytes:&pathLength range:NSMakeRange(nLength+1, 1)];
NSInteger pLength = (NSInteger)pathLength;
[data getBytes:&pathBuffer range:NSMakeRange(nLength+2, pLength)];
NSString *path = [[NSString alloc] initWithData:[NSData dataWithBytes:&pathBuffer length:pLength] encoding:NSUTF8StringEncoding];

代码的主要目的就是解析buffer中的数据,buffer中的第一位代表名字的长度,后面接着是名字的具体数据,然后是路径的长度,后面接着路径的具体数据。

崩溃的原因就在于,我们声明变量nameBuffer和pathBuffer的时候,声明为void *类型,因此系统分配的空间大小就是一个指针所占据的空间4个字节。但是我们后面写入数据的时候,却远远超过了系统所分配的空间大小,导致将数据写入了相邻的其他内存空间,而如果这些空间已经被占用,就很可能在系统使用这个内存空间的时候会导致崩溃。

修改起来也很简单,在获取到nameBuffer或者pathBuffer长度之后,再根据此分配他们所需要的内存空间。

void *nameBuffer = malloc(nLength * sizeof(char));
memset(nameBuffer, 0, nLength * sizeof(char));
//Byte nameBuffer[nLength];
[data getBytes:nameBuffer range:NSMakeRange(1, nLength)];
NSString *name = [[NSString alloc] initWithData:[NSData dataWithBytes:nameBuffer length:nLength] encoding:NSUTF8StringEncoding];

相关文章

  • 内存被改写而造成的崩溃

    这几天发现一个随机的崩溃,在解析数据的时候偶尔会出现,而且崩溃的地方都不太一样,具体代码如下: 代码的主要目的就是...

  • 常见javascript 中内存泄漏的几种情况

    1、什么是内存泄漏?在程序中,由于疏忽或者错误,造成程序内存被占用而一直没有被释放从而失去控制,从而造成内存的浪费...

  • 常见内存泄漏以及个人解决方法

    内存泄漏问题检测使用 LeakCanary 多线程操作造成的内存泄漏以及崩溃问题(RxJava2为例) 首先配置B...

  • iOS -@autoreleasepool的使用

    什么时候用@autoreleasepool for循环中创建了大量的临时变量得不到释放造成内存崩溃

  • 睡眠剥夺

    睡眠剥夺造成的心理和身体的崩溃是十分严重的,历来被用在犯罪侦询、罪犯处罚等方面。而父母觉得我因为睡眠剥夺而造成的种...

  • 初识node

    1、nodeJS的特点 单线程:好处:是减少了内存开销;缺点:就是一个用户造成了线程的崩溃,整个服务都崩溃了,其他...

  • Android Binder实战

    项目需求 友盟上观察到有App有内存溢出导致的崩溃,经排查发现视频压缩时,内存暴涨100MB,容易造成OOM。 改...

  • Context正确使用姿势

    Context造成的内存泄露 一般造成Context内存泄露都原因都是因为被生命周期比Activity还长的常量持...

  • 内存泄露相关

    ·# 内存 对用户体验影响 可能oom 内存过大被LMK机制杀死。 内存抖动造成程序卡顿 原理 内存分配策略 首先...

  • iOS崩溃日志

    程序什么时候会造成崩溃? 会引发程序运行崩溃基本有两种情况 c++语言层面的错误,比如野指针,除零,内存访问异常等...

网友评论

      本文标题:内存被改写而造成的崩溃

      本文链接:https://www.haomeiwen.com/subject/rtcmcqtx.html