一种基于增强特征的安全冗余排错检查去除方法

文档序号:37544569发布日期:2024-04-08 13:47阅读:9来源:国知局
一种基于增强特征的安全冗余排错检查去除方法

本发明涉及软件缺陷检测领域,特别是基于编译插桩的排错检查,是一种基于增强特征的安全冗余排错检查去除方法。


背景技术:

1、排错检查器(sanitizer)是现代编译器中的关键组件,用于在开发和测试过程中检测程序中的错误。排错检查器可以识别和诊断许多与内存相关的误用缺陷以及潜在的未定义行为。然而,启用排错检查会带来昂贵的额外性能开销,不仅会增加测试所需的计算资源,还可能会影响被测程序的执行行为,从而影响测试的准确性和有效性。为此,最近的研究提出了基于数据依赖和分支覆盖的方法来去除冗余排错检查。具体而言,该方法通过分析数据依赖和分支覆盖信息,获取每个分支条件的静态和动态特征。基于这些特征,该方法识别出具有相同特征的分支条件,并将针对这些分支条件的排错检查视为冗余,并将其移除。然而,现有方法存在一些限制。首先,仅依靠分支条件中变量的数据依赖无法准确判断针对特定分支条件的排错检查是否冗余。存在数据依赖相同但分支条件不冗余,或者数据依赖不同但分支条件冗余的情况。其次,分支覆盖也无法确定分支条件的冗余性。分支覆盖是在有限的程序输入上收集的,而无法穷尽所有可能的输入。即使两个分支条件在已有的输入下覆盖相同,也无法保证它们在其他输入上的覆盖总是一致。现有方法可能错误地删除实际不冗余的排错检查,从而导致排错检查器存在漏报。为了解决现有方法的局限性,本发明提出了一种基于增强特征的安全冗余排错检查去除方法。该方法使用混合特征进行冗余检查的判断,除了考虑数据依赖之外,还考虑了多种其他特征,因此能更加准确地判断排错检查的冗余性,减少误删排错检查的情况,增强冗余排错检查去除方法的安全性。


技术实现思路

1、本发明提供了一种安全的冗余排错检查去除方法。在判断排错检查是否冗余时,不仅考虑了变量间的数据依赖情况,还同时考虑了操作符的信息,从而解决了现有冗余去除方法存在的误删非冗余检查的问题。具体包括如下步骤:

2、步骤1,将被编译程序转换为llvm中间表示。

3、步骤2,识别被编译程序中的排错检查。

4、步骤3,对于每个排错检查,生成其分支变量的数据依赖树,记录所有叶子节点。

5、步骤4,在生成数据依赖树的过程中,记录所涉及到的所有操作符,与叶子节点一并记录。

6、步骤5,对每个检测到的排错检查,插入统计代码,统计运行时该检查及其两个分支的执行次数,作为动态特征;

7、步骤6,运行程序的测试用例,使插桩代码记录运行过程中每个检查的动态特征;

8、步骤7,维护一个初始化为空的不冗余排错检查集合。对于检测到的任意排错检查,只要它与该集合中的所有排错检查不存在冗余关系,则将该检查加入集合。

9、步骤1中,转换过程由clang编译器完成,并将转换后结果经由llvm优化器流水线送到本发明对应的优化pass上。

10、步骤2中,通过对转换后的llvm程序中的所有分支语句进行特征匹配,来识别排错检查。

11、步骤3中,通过递归地寻找每个变量的声明表达式中涉及的变量,最终找到常量或输入变量作为叶子节点。

12、步骤4中,将操作符与叶子节点分别存储在两个集合中,并用排错检查的编号作为索引。

13、步骤5中,插入统计代码时,对每一个编译单元,生成对应的统计函数,并在该编译单元中的每一个排错检查处插入对该函数的调用。

14、步骤6中,通过插入统计代码,编译出专用于程序分析的可执行程序。该可执行程序仅为一次性中间结果,不用于其他用途。优化完成后,需要重新编译得到优化后的最终程序。

15、步骤7中,判断排错检查是否冗余时,同时考虑动态特征和静态特征,若所有特征都相同则认为该检查冗余。

16、本发明使用更加丰富的编译时程序特征来判断排错检查的冗余性,提高了冗余去除工具的安全性。

17、有益效果:通过本方法改进的冗余去除工具,具有更低的误删率,能够在提高排错检查效率的同时更充分地保留排错能力。



技术特征:

1.一种基于增强特征的安全的冗余排错检查去除方法。其特征在于,将程序转换为llvm中间表示后,对其中的分支变量进行数据依赖分析,得到数据依赖树。记录数据依赖树中各节点对应的操作数及操作符,作为该分支的静态特征。通过插桩统计,记录每个分支在测试用例上的运行数据,作为动态特征。最后,综合静态与动态特征作为分支特征,利用分支特征判断分支的冗余性。本方法主要包括以下步骤:

2.根据权利要求1中所述的安全的冗余除错检查去除方法,其特征在于,在步骤1)中,本方法运行于llvm中间表示层级上。源代码可以是c或c++语言,也可以是可转化为llvm中间表示的任何其他语言。

3.根据权利要求1中所述的安全的冗余除错检查去除方法,其特征在于,在步骤2)中,本方法作用的对象是分支语句。这里可以选取代码中所有的分支语句,也可以采取策略过滤掉明显不冗余的分支语句。

4.根据权利要求1中所述的安全的冗余除错检查去除方法,其特征在于,在步骤3)中,对分支变量进行数据依赖分析。也可以额外采用函数内联技术,改变数据依赖分析的深度。

5.根据权利要求1中所述的安全的冗余除错检查去除方法,其特征在于,在步骤4)中,记录的特征既包括依赖的变量,也包括产生这些变量所用的运算符。具体记录方式可以只记录叶子节点,也可以记录所有节点,或采取其他过滤条件。

6.根据权利要求1中所述的安全的冗余除错检查去除方法,其特征在于,在步骤5)中,统计的分支数据包括分支总执行次数、真分支执行次数与假分支执行次数。

7.根据权利要求1中所述的安全的冗余除错检查去除方法,其特征在于,在步骤7)中,只有当动态特征和静态特征都相同时才判断为分支冗余。


技术总结
本发明提出了一种增强特征的安全冗余排错检查去除方法。该方法主要包含以下步骤:1)将用户代码转换为LLVM中间表示;2)识别出代码中的排错检查;3)计算出每个检查分支的静态特征,在计算静态特征时包括额外的操作符的特征;4)执行测试用例得到每个分支的动态特征;5)根据分支间的动态特征与静态特征判定分支是否冗余,去除冗余的排错检查。本发明利用了增强的特征来识别冗余的排错检查,提高了冗余排错检查去除方法的安全性。

技术研发人员:杨已彪,许沂聪,孙茂林,李清扬,卢红敏,周毓明
受保护的技术使用者:南京大学
技术研发日:
技术公布日:2024/4/7
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1