概率撞指针死机补丁
📎 原始文档:https://www.kdocs.cn/l/cjkH6JZ5YiwH 概率撞指针死机补丁
补丁文件链接: 彩屏仓SDK_V200_撞指针补丁(2024_06_25).7z
适用版本: 彩屏仓sdk v200
问题说明: 调用lv_obj_is_valid后无法判断控件句柄是否存在而导致其他操作越界。lv_obj_is_valid接口并不可靠,后续sdk均不使用该接口,也不建议用户使用该接口。若想要判断当前控件是否被加载,在不动态增删控件的情况下,可以将父控件是否为空,作为控件未被加载与否的依据,动态增删的情况下,可以将当前控件是否为空来判断控件未被加载与否,前提是调用lv_obj_del后对指针置NULL。打上该补丁后会将sdk中的lv_obj_is_valid接口去掉,同时用户需要注意自己是否有用到该接口,如有请去掉。
补丁包说明:
解压后能看到文件如下,包括补丁文件和一个.patch文件,若有使用git对项目进行管理,且git仓库建立在\ac701n_watch_release_v2.2.0\code\sdk路径下,可以将soc.patch拷贝到.git同级目录,进入git bash输入git apply pointer.patch自动打补丁,如下:
若并未使用git进行项目管理,本补丁包提供具体差分修改,此时可以根据补丁包里面的补丁文件,通过对比工具将修改同步过去。主要修改内容: 注意:
该章节只是把关键修改列出,以及对部分修改进行说明,以方便用户打补丁后进行review,不代表在这里会放出全部修改!!!故请勿把此章节内容当成完整补丁去进行修改,若要按照完整补丁进行修改,还请参考第四章的指示去完成。
原因分析:
lvgl的控件创建基本都存在malloc申请内存的操作,并且释放控件时会存在free操作,那么有可能存在A控件创建时申请到0xaabb(举个例子),再将A控件释放,创建控件B,而B同样申请到0xaabb的情况,该情况下我们称为“撞指针”。那么在这种情况下,我们用lv_obj_is_valid(Obj_A)来判断是否被创建则不靠谱,因为此时该接口判断的0xaabb地址实际上是说明B控件被创建,而不是A控件被创建,故直接直接换另一种相对可靠的方式去操作,即使用父控件的句柄进行判断,但这种做法的成立的前提是,在删除控件时需要手动置NULL,以及不动态创建子控件。
将lv_obj_is_valid接口去掉
这里只是以壁纸为例,举个例子,用户需要把自己用到的lv_obj_is_valid接口全部去掉。lv_obj_del后主动置NULL
同理,这里也只是举个例子,用户需要将自己所有lv_obj_del后添加主动置NULL的操作。添加电源检测接口
避免直接寻址时异常。去掉电源检测接口的static

