【技术实现步骤摘要】
一种程序热点路径确定的方法和装置
[0001]本专利技术涉及软件工程中的程序代码路径分析。
技术介绍
[0002]程序热点路径分析在软件工程中是一项非常重要内容。若能够提前知道程序代码的热点路径,软件测试工程师可以针对这些程序热点路径进行专项测试,从而能够提高并保证软件核心模块的鲁棒性。而对于那些非程序热点路径可以减少测试量,从而大大提高整体测试效率,进而加速软件产品整体开发的进度。现有技术中,程序热点路径通常采用如下方法确定:首先遍历出所有路径,为每条路径建立索引,然后大量执行测试用例,根据路径索引统计每条路径执行频次,再排序后得到频次最高的路径作为程序热点路径。该方法需要足量的测试用例支持,并且需要重复多次执行,由此需要消耗大量的时间成本。
技术实现思路
[0003]本专利技术所要解决的问题:提高确定程序热点路径的效率。
[0004]为解决上述问题,本专利技术采用的方案如下:根据本专利技术的一种程序热点路径确定的方法,该方法包括如下步骤:步骤S1,用于:获取程序源码和测试用例集;所述测试用例集是所 ...
【技术保护点】
【技术特征摘要】
1.一种程序热点路径确定的方法,其特征在于,该方法包括如下步骤:步骤S1,用于:获取程序源码和测试用例集;所述测试用例集是所述程序源码的测试用例的集合;所述测试用例包含所述程序源码测试所需的参数数据;步骤S2,用于:根据所述程序源码构建程序控制流图;所述程序控制流图由表示程序基本块的节点和表示程序基本块跳转关系的边所组成的有向图;步骤S3,用于:根据所述程序控制流图构建初始封闭子图集,剔除初始封闭子图集中包含其他封闭子图的封闭子图后得到原子封闭子图集;所述初始封闭子图集和原子封闭子图集是封闭子图的集合;所述封闭子图标记为G(v(i),v(j));封闭子图G(v(i),v(j))表示所述程序控制流图中唯一入口为节点v(i),唯一出口为节点v(j),且边的数量不少于3的子图;其中,v(i)和v(j)为所述程序控制流图中的两个节点;步骤S4,用于:根据所述程序控制流图在程序源码中插入针对边的执行频次记录指令得到插桩后的程序代码,然后以所述测试用例集中的各个测试用例作为测试输入,分别执行插桩后的程序代码,从而通过所述针对边的执行频次记录指令的执行获得所述程序控制流图每条边的执行频次,然后根据所述程序控制流图每条边的执行频次计算原子封闭子图集中各个封闭子图的离散程度值,选取其中离散程度值最小的若干封闭子图组成优选封闭子图集;其中,封闭子图的离散程度值采用如下公式计算:DG(G(m)=(DL(p(G(m,a(1)), G(m,b(1))),1)+ DL(p(G(m,a(2)), G(m,b(2))),2)+...+ DL(p(G(m,a(K)), G(m,b(K))),K))/K;其中,DG(G(m)表示为封闭子图G(m)的离散程度值, G(m)表示原子封闭子图集中第m个封闭子图;DL(p(G(m,a(k)), G(m,b(k))),k),k∈[1..K]表示为第k个节点对p(G(m,a(k)), G(m,b(k)))之间的边的执行频次分布方差;p(G(m,a(k)), G(m,b(k)))表示为节点G(m,a(k))和节点G(m,b(k))所组成的节点对;节点G(m,a(k))和节点G(m,b(k))分别为封闭子图G(m)中第a(k)个节点和第b(k)个节点;[1..K]表示为1至K的整数集合;K是封闭子图G(m)中节点对的数量;步骤S5,用于:对所述优选封闭子图集中封闭子图去循环处理后得到封闭子图的去循环图,然后遍历所述去循环图的路径,再以这些路径作为所述封闭子图的入口节点和出口节点之间的边简化所述程序控制流图得到控制流简化图,同时根据这些路径,在所述程序源码中插入针对路径的执行频次记录指令,结合根据所述程序控制流图中不在所述优选封闭子图集中的边所对应的程序源码位置插入针对边的执行频次记录指令得到第二插桩代码;所述封闭子图去循环处理是将循环体回边替换成两条循环辅助有向边后得到去循环图;循环体回边所替换的两条循环辅助有向边分别为回边起始节点至循环体后序节点的循环辅助有向边以及循环体前序节点至回边末端节点之间的循环辅助有向边;所述去循环图的路径以封闭子图的入口节点和循环回边的末端节点作为路径的起始节点,封闭子图的出口节点和循环回边的起始节点作为路径的结束节点,并不考虑循环辅助有向边;步骤S6,用于:以所述测试用例集中的各个测试用例作为测试输入,分别执行所述第二插桩代码,得到所述控制流简化图每条边的执行频次;
步骤S7,用于:根据所述控制流简化图和所述控制流简化图每条边的执行频次,构建每个节点的确定流集Fv(v)和每条边的确定流集Fe(e(v,u(v,t))),然后选取入口节点的确定流集中确定频次最大的若干后序路径作为程序热点路径;其中,Fv(v)表示为节点v的确定流集合;节点确定流包括后序路径Rv(v,c)和确定频次fv(Rv(v,c));Rv(v,c)表示为节点v的确定流集合Fv(v)中的第c条后序路径,为节点v至出口节点路径上节点的按顺序排列而的节点序列;fv(Rv(v,c))表示后序路径Rv(v,c)所对应的确定频次;节点v的确定流集合Fv(v)由节点v的所有出度边的确定流集合Fe(e(v,u(v,t)))合并而成;Fe(e(v,u(v,t)))表示为节点v的出度边e(v,u(v,t))的确定流集合;e(v,u(v,t))表示为节点v至节点u(v,t)的出度边;节点u(v,t)表示为节点v的第t条出度边的末端节点;所述边确定流包括后序路径Re(e(v,u(v,t)),h)和确定频次fe(Re(e(v,u(v,t)),h));Re(e(v,u(v,t)),h)表示为边e(v,u(v,t))的第h条后序路径,为节点v至出口节点路径上节点的按顺序排列而的节点序列,由节点v和节点u(v,t)确定流集合中的后序路径所组成;fe(Re(e(v,u(v,t)),h))表示后序路径Re(e(v,u(v,t)),h)所对应的确定频次;其中,fe(Re(e(v,u(v,t)),h))= f(e(v,u(v,t)))-(ft(u(v,t))-fv(Rv(u(v,t),c))),且fe(Re(e(v,u(v,t)),h))满足大于0;其中,f(e(v,u(v,t)))表示为边e(v,u(v,t))的执行频次;ft(u(v,t))表示节点u(v,t)执行的总次数;fv(Rv(u(v,t),c))表示为后序路径Rv(u(v,t),c)所对应的确定频次;Rv(u(v,t),c)为节点u(v,t)的确定流集合Fv(u(v,t))中第c条后序路径。2.如权利要求1所述的程序热点路径确定的方法,其特征在于,步骤S4中所述“在程序源码中插入针对边的执行频次记录指令”包括如下步骤:步骤S411,用于:在所述程序控制流图中找出循环体回边,将循环体回边替换成两条循环辅助虚边,并添加出入辅助虚边得到第一辅助图;循环体回边所替换的两条循环辅助虚边分别为回边起始节点与循环体后序节点之间的循环辅助虚边以及回边末端节点与循环体前序节点之间的循环辅助虚边;所述出入辅助虚边是程序控制流图入口节点和出口节点之间的边;步骤S412,用于:根据所述第一辅助图构建包括有所述出入辅助虚边的第一最小生成树;步骤S413,用于:所述程序控制流图中所有不在所述第一最小生成树上的边对应在所述程序源码的位置上插入针对边的执行频次记录指令;步骤S4中所述“获得所述程序控制流图每条边的执行频次”包括为所述程序控制流图中所有在所述第一最小生成树上的边的计算执行频次。3.如权利要求1所述的程序热点路径确定的方法,其特征在于,所述步骤S5中“在程序源码中插入针对路径的执行频次记录指令”包括如下步骤:步骤S51,用于:对去循环图节点进行倒序排序,根据倒序排序的去循环图节点遍历节点,对每个所遍历的节点按照以下步骤处理以计算所述去循环图的每条边的边值:步骤S511,用于:若该节点的出度为0,则初始化该节点的numpath值为1,否则初始化该节点的numpath值为0;
步骤S512,用于:遍历该节点的出度边,对于所每条所遍历的出度边按以下步骤处理:步骤S5121,用于:设定该出度边的边值等于该节点的numpath值;步骤S5122,用于:该节点的numpath值增加该出度边的末端节点的numpath值;步骤S52,用于:在所述去循环图中添加出入辅助回边得到第二辅助图;然后根据所述第二辅助图构建出包括出入辅助回边的第二最小生成树;所述出入辅助回边是所述封闭子图出口节点至入口节点的有向边;步骤S53,用于:将所有循环辅助有向边的插桩值初始化为0后,为所述第二辅助图中所有不在所述第二最小生成树上的边计算边的插桩值;插桩值采用如下公式计算:Inc(eo)=Val(eo)+sigma(Val(et)*Dir(eo, et, C(eo, et)) |et∈C(eo, et));其中,Inc(eo)表示为边eo的插桩值;Val(eo)表示为边eo的边值;sigma表示累加函数;Val(et)表示边et的边值;Dir(eo,et, C(eo,et))表示为边eo和et的方向值,若边eo和et在环C(eo,et)的环中同向,则取值为1,否则取值为-1;C(eo,et)表示边eo和et所构成的环;et∈C(eo,et)表示为边eo添加至所述第二最小生成树时能够和et所构筑成环;边eo表示为不在所述第二最小生成树上的边,边et表示为在所述第二最小生成树上的边;步骤S54,用于:在所述程序源码插入针对封闭子图路径的执行频次记录指令,包括:步骤S541,用于:在封闭子图入口节点所在程序源码的位置上插入路径索引初始化指令;步骤S542,用于:为封闭子图中所有不在第二最小生成树上的边插入路径索引处理指令:若该边不是循环体回边,则在该边对应在程序源码的位置上插入路径索引增量指令;若该边为循环体回边,则在该边对应在程序源码的位置上路径索引重置指令;步骤S543,用于:在所述封闭子图的出口节点所在程序源码的位置上插入路径索引对应路径的执行频次记录指令;所述路径索引初始化指令为将路径索引值初始化为0的指令;所述路径索引增量指令为将路径索引值加上该边插桩值的指令,若该边为循环体回边,则该边的插桩值为循环体回边的起始节点至循环体后序节点的循环辅助有向边的插桩值;所述路径索引重置指令为将路径索引值赋值为循环体前序节点至该循环体回边的末端节点的循环辅助有向边的插桩值的指令。4.如权利要求3所述的程序热点路径确定的方法,其特征在于,所述步骤S542中,若该边为循环体回边,则在该边对应在程序源码的位置上插入三条指令,按顺序分别为:路径索引增量指令、路径索引对应路径的执行频次记录指令和路径索引重置指令。5.如权利要求1所述的程序热点路径确定的方法,其特征在于,所述步骤S7包括用于按倒序排序所述控制流简化图节点得到倒序节点序列的步骤以及遍历所述倒序节点序列的步骤;所述遍历所述倒序节点序列的步骤包括如下步骤:步骤S71,用于:若当前节点为出口节点,则构建初始的节点确定流集合;所述初始的节点确定流集合包含唯一的后序路径,该唯一后序路径包含唯一的出口节点,所对应的确定频次为所述第二插桩代码执行的总次数;所述当前节点为当前所遍历的节点;步骤S72,用于:遍历当前节点的出度边,为每条出度边构建边确定流集合;
步骤S73,用于:将当前节点的所有出度边的确定流集合进行合并,得到当前节点的确定流集合;步骤S74,用于:重复执行步骤S71至步骤S73直到所述倒序节点序列中的节点均被遍历。6.一种...
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。