内存被错误改变,越界写的分析

来源:互联网 发布:淘宝添加到桌面没有了 编辑:程序博客网 时间:2024/05/01 17:42

1. malloc会造成内存泄漏,但是内存越界写主要是有memcpy造成

2. log如果能够打印出来,一个连续变化的整数i++的打印,如果12345 89,跳过6,那么当i是5时,可能被其他代码越界改为8,导致无法打印出6和7

log只会全部打印出来或者全部不能打印;如果能够打印,即使是多线程,只会出现交叉打印,但是不会出现部分log完全不打印的情况,就像i连续变化,6和7不打印,那么可能是代码逻辑问题(上述情况是ii被越界写了)

log太多的时候,即使adb logcat > file也有可能部分log打印不出来,所以应该去除掉过分冗余的log

3. malloc、free、memcpy可以用宏进行重定义,以便于调试


4.  常量定义后,使用的地方改成:直接使用数字/字符串,是禁止的行为,可能导致内存越界等非常难调试的问题


5. c语言的线程栈中的局部变量最好不要超过100个字节,否则用malloc分配空间或者定义位常量,不然线程会诡异的死掉,没有backtrace,没有log,比较难调试


6. 同一常量的定义不能在两个用的文件中定义两次


7. 发现问题,立即解决,不然越积累越复杂


8. 只在开源c/c++代码已有的数据结构中增加了一个变量,并set/get一下,就发生了以下错误(这类问题看起来很头痛):

signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x8

原因:

可能代码中有相当数据结构起始位置的运算,但是讲新加的变量放在数据结构的开头了

解决办法:

1. 添加数据时,最好另外添加数据结构,而不是修改已有数据结构

2. 当只能修改数据结构时,请添加在数据结构末尾(例如ffmpeg添加新的数据结构,不能编译通过(怎么能编译通过的方法估计要花时间看文档,暂时没有找到),只能在已有数据结构中添加变量以节省开发时间)


9. log太多,logcat会出现read unexpected EOF的错误,因此尽量避免瞬时出现大量log,导致logcat系统处理不了,出现异常

0 0
原创粉丝点击