演讲嘉宾 |蔡源稻
回顾整理 | 廖 涛
排版校对 | 宋夕明
嘉宾介绍
研究分论坛
蔡源稻,华为2012实验室技术专家。
正文内容
静态分析(Static Analysis)是软件开发中不可或缺的一部分,它可以帮助开发人员提高代码质量、减少缺陷和安全风险。OpenHarmony的编译环境复杂,代码量巨大,且由多种编程语言混合编程,在静态分析上存在不小挑战。如何提升OpenHarmony静态分析的准确性和效率?华为2012实验室技术专家蔡源稻在第三届OpenHarmony技术大会上进行了精彩分享。
在软件开发的生命周期中,代码的质量和安全性至关重要。随着软件系统的复杂性不断增加,如何在有限的时间和资源内,确保软件的功能正确性、性能优化以及安全性?这就涉及两种重要的分析技术:静态分析和动态分析。
动态分析指在程序运行时对其行为进行监控和分析,能够捕捉到实际运行中的性能瓶颈、内存泄漏和竞态条件等问题。相对而言,静态分析则在不执行程序的情况下利用软件结构穷举软件所有可能的运行时行为并将这些行为以数据结构形式记录,从而帮助开发者在早期阶段发现潜在的错误、安全漏洞和代码质量问题。
对于OpenHarmony而言,由于其编译环境复杂,代码量巨大,且由多种编程语言混合编程,静态分析存在以下挑战:
覆盖率不高:静态分析理论上可以完整覆盖程序运行行为,但工程代价太高/分析效率太低,导致实际上覆盖率不高;同时,动态分析也无法完整覆盖程序。
无法适配复杂编译:静态分析工具需要干预编译过程来获得待分析代码(IR),OpenHarmony的编译环境复杂 (涉及多个编译器,一个编译器不同版本),很难满足此要求。
分析代价高:精确的静态分析,如控制流敏感、函数上下文敏感、路径敏感分析需要较高的分析代价(时间、内存)。对于OpenHarmony海量的代码而言,现有静态分析方法无法在物理资源和时间限制下完成代码分析。
库函数建模困难:由于库函数(e.g., STL C++)需要手动建模才能适配静态分析,但已有静态分析遇到未知库函数只能做保守假设或直接丢弃结果。
针对上述问题,作者本人提出了以下解决方案,并介绍了当前在研产品“费马分析器(Fermat Analyzer)”的部分创新技术点:
非侵入编译的IR构建:非侵入编译的IR构建(Non-intrusive Compilation for IR Construction)是一种在编译过程中构建中间表示(Intermediate Representation, IR)的技术,其核心特点是在不修改或侵入源代码的情况下生成IR。在正向编译时,无需修改编译环境,套用工具在编译脚本即可完成IR构建;而反编译时,翻译可以处理第三方库,二进制形式等产品模块。
基于PDG的稀疏值流分析:Program Dependence Graph(PDG)是一种用于表示程序中语句或指令之间依赖关系的图形化数据结构。通过简洁编码数据依赖和控制依赖,能够清晰地表示程序的执行逻辑,并优化分析过程。具体做法有:(1)抛弃全局穷尽式的指针分析,通过高精度局部指针分析,发现并记录因为指针操作产生的函数内的内存读写数据依赖;(2)跨函数在按需分析时在调用函数中将跨函数数据依赖对齐;(3)指针同化为普通数据流,赋能按需计算,可理解为 IFDS 加入路径条件和指针信息。
持久化设计,分析复用:通过复用第三方库分析结果,能够加速分析,减少内存占用;通过程序拆分,可在单机上完成大规模代码分析。
大模型使能与辅助:当前,AI技术的快速发展,使大模型与代码分析相结合是一个重要趋势。例如,将大模型使能规约推断:函数行为推断(内存创建/释放,中断函数等),API别名信息推断;或通过大模型辅助误报诊断:基于缺陷程序切片以及缺陷信息进行误报诊断。
接下来,对于复杂代码的静态分析的实际问题,看看费马分析器是如何解决的:
一、并发内存安全错误检查。现有的关于并发程序分析的精确方法往往效率较低。Canary方法首次将并发错误检测转化为Source-Sink值流 (Value Flow)的检查,通过监视内存对象在数据依赖关系中沿指针之间的流动,观察到Source最终沿Sink流路径到达汇。因此,考虑到只有对线程共享内存位置的内存访问才重要,许多线程执行交错对于检测的并发错误来说是无关紧要的,费马分析器采取了减少指数级爆炸的线程交错分析的方法。
二、准确高效的死锁检查。在执行上下文敏感的死锁检测时,容易出现函数上下文爆炸的问题 (Calling Context Explosion)。考虑到许多函数上下文对死锁检测来说是无关紧要的,因此,费马分析器采取了Peahen方法(第一种用于缓解低效问题的函数上下文缩减技术 (Context Reduction)),通过对两个协同阶段进行昂贵的函数上下文敏感计算的分解,进行上下文无关的锁图构建以发现死锁相关的函数。
三、准确高效的函数调用图:鸡尾酒疗法。对于解析函数指针的值,以及构建C代码的函数调用图,传统单一模式 (e.g., SVF, LLVM)——即用一种精度来分析所有的间接调用,往往要么不精确要么不高效。费马分析器采用多种精度来分析所有的间接调用,以自动准确的方式决定一个间接调用需要哪种准确的分析,并采用合适的精度来回避计算资源浪费。
未来,随着AI大模型的迅速发展,代码规模和分布式架构的复杂性都不断提高,静态分析作为系统可信和软件质量的重要保障,也正从传统的模式匹配向智能化、场景化方向演进。随着技术的不断进步,静态分析将在软件开发的各个环节发挥更加关键的作用,为构建高质量、高性能、高安全性的软件系统提供坚实的支持。
-
编程
+关注
关注
88文章
3694浏览量
95547 -
代码
+关注
关注
30文章
4908浏览量
71256 -
混合编程
+关注
关注
0文章
27浏览量
8366 -
静态分析
+关注
关注
1文章
43浏览量
4053 -
OpenHarmony
+关注
关注
30文章
3866浏览量
18982
发布评论请先 登录
第三届大会回顾第6期 | HarmonyOS NEXT原生智能,助力应用低成本生而智能

中科创达旗下OSWare奥思维亮相第三届OpenHarmony技术大会
线上逛展 | 沉浸探索第三届OpenHarmony技术大会五大展区
市场活动 | 润和软件星闪业务亮相第三届OpenHarmony技术大会

高燃回顾|第三届OpenHarmony技术大会精彩瞬间
第三届OpenHarmony技术大会主论坛嘉宾演讲大咖金句聚焦

深开鸿亮相第三届OpenHarmony技术大会,以技术驱动OpenHarmony生态发展

迅龙软件受邀参加第三届OpenHarmony技术大会,共建共享鸿蒙生态

评论