一种基于搜索的编译器优化序列故障定位方法技术

技术编号:29132903 阅读:44 留言:0更新日期:2021-07-02 22:28
本发明专利技术提供了一种基于搜索的编译器优化序列故障定位方法,可用于C/C++语言的编译器优化序列故障定位,如开源编译器LLVM等;亦可根据特定编程语言的编译器特性,对本发明专利技术的相关步骤进行适配,从而定位该特定编程语言的编译器优化序列故障。本发明专利技术能够有效地对编译器优化序列故障进行分析定位,从而帮助编译器开发者更好、更快地理解与修复编译器优化序列相关的故障,提高编译器的质量。

【技术实现步骤摘要】
一种基于搜索的编译器优化序列故障定位方法
本专利技术属于软件编译领域,涉及一种用于定位编译器优化序列故障的技术,具体为一种基于搜索的编译器优化序列故障定位方法。
技术介绍
编译器是整个软件开发过程中不可或缺的重要基础软件,其不仅将开发者用高级编程语言编写的程序转换为计算机可识别的机器码,而且要负责在编译过程中对目标程序进行优化,以最大限度地发挥目标程序的性能。随着编译技术的发展,现代编译器拥有了大量的代码优化技术。用户在使用编译器编译程序时,一般会使用多个优化组合成一条优化序列对目标程序进行优化。然而,编译器作为一种软件,也不可避免地会出现故障。特别是编译器优化更容易产生故障,各种优化之间可能存在相互影响,一种优化技术优化后的程序,可能使其他优化发挥更好的效果,也可能使其他优化失效,甚至出现故障。但是,当编译器开发者对编译器故障进行修复时,由于编译器自身规模较大,使得修复编译器故障较为耗时,尤其是编译优化序列相关的故障。因此,为帮助编译器开发者快速分析与修复编译器优化序列故障,确保编译器质量,编译器优化序列故障的自动定位就显得至关重要。编译器优化序列故障自动定位是提升编译器开发者分析编译器优化序列故障效率的重要途径,其不仅能自动化地完成对编译器优化序列故障的分析,而且也能准确地报告优化序列故障出现的位置。然而,由于现代编译器中优化技术众多,使得分析与定位编译器优化序列故障复杂且耗时。虽然已有一些编译器故障定位技术的专利技术专利,但这些已有的专利技术专利面对编译器优化序列故障定位问题,仍存在适配困难、效率低等困难。例如,基于强化学习的编译器缺陷定位方法(专利号:CN202010880640.1)利用结构变异与强化学习生成编译成功的变异程序,从而通过对比变异程序和故障触发程序使编译器执行路径的差异来定位编译器故障;但该方法生成变异程序消耗时间长,难以高效地定位编译器优化序列故障。一种对编译器中的错误进行自动定位的方法(专利号:CN200510090093.2)和一种实现编译器错误的自动定位方法和装置(专利号:CN201010508986.5)则通过对比正确编译器和故障编译器输出的可执行程序来定位编译器中的故障,但该方法针对优化较多的编译器效率不高,以至于难以定位编译器优化序列故障。因此,为了高效、准确地定位编译器优化序列故障,本专利技术通过对编译器优化序列进行搜索,寻找包含故障优化序列中的所有优化,但不会触发故障的优化序列,从而利用在不同优化序列下,编译器执行路径之间的差异对优化序列故障进行定位。
技术实现思路
为解决上述问题,本专利技术提供了一种基于搜索的编译器优化序列故障定位方法。本专利技术可用于C/C++语言的编译器优化序列故障定位,如开源编译器LLVM等;亦可根据特定编程语言的编译器特性,对本专利技术的相关步骤进行适配,从而定位该特定编程语言的编译器优化序列故障。本专利技术的技术方案:一种基于搜索的编译器优化序列故障定位方法,主要步骤如下:步骤1:编译故障编译器,获取优化集合。使用插桩的方式编译故障编译器C,并获取编译优化信息,构成优化集合O。步骤2:获取触发编译器优化序列故障的程序p和优化序列s。步骤3:获取故障时编译器的代码覆盖信息。使用编译器C在优化序列s的作用下编译程序p,并获取编译器C执行过程中的代码覆盖信息ts;其中代码覆盖信息包括编译器执行时所涉及的文件以及文件中被执行的代码语句。步骤4:搜索无故障优化序列。将编译器C,优化集合O,程序p和故障优化序列s,以及代码覆盖信息ts作为搜索算法的输入,利用搜索算法自动地寻找包含故障优化序列s中的所有优化,但不会触发故障的优化序列。若搜索算法得到的无故障的优化序列集合为S={s1,s2,…,sn},则其对应的编译器C执行过程中的代码覆盖信息集合为T={t1,t2,…,tn}。步骤5:计算文件可疑度。首先,根据ts和T,计算故障发生时,编译器所执行的各条代码语句的可疑度;然后将文件中所有被执行代码语句的平均可疑度作为该文件的可疑度。其中,代码语句的可疑度计算公式如下:efl和nfl分别表示执行与不执行代码语句l的故障优化序列数,而epl则表示执行代码语句l的无故障优化序列数。在本专利技术中,由于仅考虑故障发生时,编译器所执行的代码语句,所以efl和nfl分别1和0。因此代码语句的可疑度计算公式简化为:对于ts中各个文件的被执行代码语句,其epl通过遍历T计算得到。文件可疑度的具体计算公式如下:其中,nf为文件f中被执行代码语句的数量,li为第i条被执行的代码语句l。步骤6:报告可疑文件。根据步骤5计算得到的文件可疑度,对故障发生时,编译器涉及到的源码文件进行排序,可疑度越大越靠前;然后将排序后的文件列表报告给编译器开发者,作为优化序列故障可能出现的位置。在步骤4中,搜索算法是本专利技术的关键所在。本专利技术中采用遗传算法作为搜索算法,用户亦可根据需要自行设计复合目标要求的搜索算法。遗传算法的步骤主要有初始化种群、适应度评价、交叉、变异、选择,各步骤的操作如下:步骤a:初始化种群。采用随机的方式生成个体,即从优化集合O中随机选择k个优化构成一条优化序列。初始化过程中,k值可为大于故障优化序列s中优化数量的任意正整数。用户在实际使用过程中,可根据需要调整k的取值。但在此过程中,需保证故障优化序列s中的所有优化均被包含在随机生成的优化序列中。步骤b:适应度评价。适应度评价即衡量种群中每个个体,即每条优化序列满足目标的程度。在本专利技术中,搜索算法的目标是寻找包含故障优化序列s中的所有优化,且与故障优化序列s具有相似的编译器执行路径,但不会触发编译器故障的优化序列。因此,优化序列i的适应度即为其使编译器C执行的代码覆盖信息ti与ts的相似性。本专利技术采用杰卡德相似性系数作为衡量ti与ts相似性的方法,具体定义如下:其中,stmt(·)表示覆盖信息中的所有语句,|·|表示集合中元素的数量。sim(ti,ts)越大则表示优化序列i的适应度越好。然而,优化序列i仍然有可能会触发编译器故障,在此种情况下,优化序列i的适应度为0。用户在实际使用中,亦可根据需要设计适应度函数。若种群中各优化序列的适应度评价结束时,算法的终止条件(算法运行时间或算法迭代次数)未达到,则继续执行以下步骤,否则终止算法。步骤c:选择。选择是指在种群中选择适应度较好的优化序列,以构成新的种群。在本专利技术中,首先将种群中的优化序列以适应度大小按降序排列,然后选择前m个优化序列作为新的种群。步骤d:交叉。交叉是指对选择步骤产生的新种群中的两条优化序列以一定的概率进行拆分与重新拼接,以构成新的优化序列。本专利技术中使用单点交叉的方式对两条优化序列进行交叉,即在优化序列i和j中选择一个点,将每条优化序列一分为二,然后优化序列i的前半部分与优化序列j的后半部分拼接,优化序列j的前半部分与优化序列i的后半部本文档来自技高网
...

【技术保护点】
1.一种基于搜索的编译器优化序列故障定位方法,其特征在于,步骤如下:/n步骤1:编译故障编译器,获取优化集合;/n使用插桩的方式编译故障编译器C,并获取编译优化信息,构成优化集合O;/n步骤2:获取触发编译器优化序列故障的程序p和优化序列s;/n步骤3:获取故障时编译器的代码覆盖信息;/n使用编译器C在优化序列s的作用下编译程序p,并获取编译器C执行过程中的代码覆盖信息t

【技术特征摘要】
1.一种基于搜索的编译器优化序列故障定位方法,其特征在于,步骤如下:
步骤1:编译故障编译器,获取优化集合;
使用插桩的方式编译故障编译器C,并获取编译优化信息,构成优化集合O;
步骤2:获取触发编译器优化序列故障的程序p和优化序列s;
步骤3:获取故障时编译器的代码覆盖信息;
使用编译器C在优化序列s的作用下编译程序p,并获取编译器C执行过程中的代码覆盖信息ts;其中代码覆盖信息包括编译器执行时所涉及的文件以及文件中被执行的代码语句;
步骤4:搜索无故障优化序列;
将编译器C,优化集合O,程序p和故障优化序列s,以及代码覆盖信息ts作为搜索算法的输入,利用搜索算法自动地寻找包含故障优化序列s中的所有优化,但不会触发故障的优化序列;若搜索算法得到的无故障的优化序列集合为S={s1,s2,…,sn},则其对应的编译器C执行过程中的代码覆盖信息集合为T={t1,t2,…,tn};
步骤5:计算文件可疑度;
首先,根据ts和T,计算故障发生时,编译器所执行的各条代码语句的可疑度;然后将文件中所有被执行代码语句的平均可疑度作为该文件的可疑度;
其中,代码语句的可疑度计算公式如下:



efl和nfl分别表示执行与不执行代码语句l的故障优化序列数,而epl则表示执行代码语句l的无故障优化序列数;由于仅考虑故障发生时,编译器所执行的代码语句,所以efl和nfl分别1和0;因此代码语句的可疑度计算公式简化为:



对于ts中各个文件的被执行代码语句,其epl通过遍历T计算得到;
文件可疑度的具体计算公式如下:



其中,nf为文件f中被执行代码语句的数量,li为第i条被执行的代码语句l;
步骤6:报告可疑文件;
根据步骤5计算得到的文件可疑度,对故障发生时,编译器涉及到的源码文件进行排序,可疑度越大越靠前;然后将排序后的文件列表报告给编译器开发者,作为优化序列故障可能出现的位置。


2.根据权利要求1所述的一种基于搜索的编译器优化序列故障定位方法,其特征在于,在步骤4中,所述的搜索算法的步骤如下:
步骤a:初始化种群;
采用随机的方式生成个体,即从优化集合O中随机选择k个优化构成一条优化序列;初始化过程中,k值可为大于故障优化序...

【专利技术属性】
技术研发人员:周志德江贺任志磊高国军
申请(专利权)人:大连理工大学
类型:发明
国别省市:辽宁;21

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1