买专利,只认龙图腾
首页 专利交易 科技果 科技人才 科技服务 商标交易 会员权益 IP管家助手 需求市场 关于龙图腾
 /  免费注册
到顶部 到底部
清空 搜索

【发明授权】一种基于数据流传播分析的Java空指针引用检测方法及系统_北京大学_202210202341.1 

申请/专利权人:北京大学

申请日:2022-03-02

公开(公告)日:2024-04-16

公开(公告)号:CN114595148B

主分类号:G06F11/36

分类号:G06F11/36;G06F8/74

优先权:

专利状态码:有效-授权

法律状态:2024.04.16#授权;2022.06.24#实质审查的生效;2022.06.07#公开

摘要:本发明公开了一种基于数据流传播分析的Java空指针引用检测方法及系统,通过将Java应用程序的Jar包转化为Jimple类型的中间表示,抽取代码中的调用信息、指向信息等构建调用流图,通过调用流图结合传递规则分析得到引用安全性。本发明通过数据流的传播分析相比静态自然语义分析有着更好的检出率,尤其对于同一函数内产生的空指针引用,提高了检出率同时显著地降低了误报率。同时本发明的方法及系统相比其他工具包含了对系统调用函数以及私有函数两种的引用方式的检出支持,大幅度增加了空指针检出的覆盖率。

主权项:1.一种Java空指针引用检测方法,通过将Java应用程序的Jar包转化成为Jimple的中间语言表示形式,利用中间表达形式去搜索变量引用点,并借用控制流图对引用点进行反向的数据流追溯,直到控制流图的头节点停止追溯,并结合符号执行状态图通过约束求解器判断是否发生空指针引用,给出产生该结果的可能范围;包括以下步骤:1引入Java应用程序的Jar包,并通过Soot框架对应用程序进行分析,将Jar包转化为Jimple代码的形式;然后对应用程序进行遍历扫描,分析得出整个程序的控制流图,即获取了整个应用程序的元信息;2扫描Jar包,获取待分析Jimple代码的指针,然后获取每一个指针的赋值及其指向信息,对指针的指向进行约束求解,并保存中间结果;3扫描Jar包,在Jimple代码层面构建符号执行状态图,从前往后针对每一个节点完成一次符号执行,并在符号执行结束后保留符号执行状态图;同时获取函数之间的关系,包括调用关系、继承关系和参数关系,构建一个全局的调用流图,保存为中间结果;4按照包、类、函数的层级顺序去遍历整个程序,如果是关注的函数并且该函数存在于调用流图当中,那判断该函数中的每一条语句是否发生了指针解引用,若是则针对该语句进行引用分析,执行步骤5;5对于每一个引用初始化一个引用分析任务,并且假定发生引用的变量为空,即建立variable==null的逻辑表达式,并且以该逻辑表达式作为最初始的数据流约束关系,将其作为该引用的出口逻辑表达式,从此处开始以单个执行语句为单位,开始数据流传递分析;6获取该引用的控制流图,通过搜索控制流图获取该引用的所有前驱节点,以当前节点的出口逻辑表达式作为前驱节点的入口逻辑表达式,为所有前驱节点设置好入口逻辑表达式并将其加入到待分析队列中,遍历待分析队列取出下一待分析节点,然后执行步骤7;7对当前节点的语句类型进行判断,结合入口逻辑表达式,针对每一种语句类型分别进行逻辑表达式的转换,分析得到新的出口逻辑表达式,这个过程叫做数据流传播;8一条语句完成了数据流传播以后,对出口逻辑表达式完成约束化简,化简结果如果是可求解的,则直接执行步骤14将检测结果提交,否则执行步骤9;9完成一次数据流传播之后,让传播步数递增,并判断传播步数是否超过设定的阈值,如果超过阈值则提前结束传播,并返回不确定引用,否则执行步骤10;10先判断待分析队列是否为空,若待分析队列为空,判断当前语句是否到达当前函数的初始点,如果到达了当前函数初始节点执行步骤11,未到达初始节点则执行步骤14报告不确定引用;若待分析队列不为空,则从中取出一条引用语句,获取当前语句所在的控制流图,得到该语句的所有前驱节点,将前驱节点的后继节点的出口逻辑表达式作为前驱节点的入口逻辑表达式,并将这些前驱节点加入到待分析队列,重复步骤6至10,循环执行操作直到待分析队列为空;11如果分析到函数的初始节点仍然没法得到确定结果,需要继续判断当前语句是否到了程序初始点,若到了程序初始点,则认为该引用语句的逻辑表达式在包含外部参数的前提下没法得到确定的分析结果,因此执行步骤12;若未到程序初始点,则寻找当前函数的调用者语句,并且将初始节点的出口逻辑表达式添加为当前函数的所有调用者语句的入口逻辑表达式,然后从所有的这些调用当前函数的语句开始继续向前回溯分析,回到步骤6;12将符号执行状态图中的约束表达式与当前引用语句的逻辑表达式相结合,使用约束求解器对该逻辑表达式进行求解,如果求解成功,得到求解结果,则执行步骤13,否则执行步骤14提交分析结果;13从约束求解得到的变量取值范围中取实际值代入逻辑表达式,然后对逻辑表达式化简,并记录外部参数的范围,将引用分析的安全性结果和导致该结果的外部参数范围结合起来,执行步骤14提交安全性结果和对应的参数范围;14收集指针流分析返回的逻辑表达式结果,包括三种结果,分别是危险引用、不确定引用和安全引用,并将当前引用的结果添加到各种情况的列表中。

全文数据:

权利要求:

百度查询: 北京大学 一种基于数据流传播分析的Java空指针引用检测方法及系统

免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。