目录
1. 实验目的及要求.................................................................................................... 3
2. 实验软硬件环境.................................................................................................... 3
3. 实验原理................................................................................................................ 3
4. 实验过程................................................................................................................ 3
4.1. 方法.............................................................................................................. 3
4.2. 步骤.............................................................................................................. 3
5. 实验结果................................................................................................................ 4
5.1. 分析与讨论.................................................................................................. 4
5.2. 总结.............................................................................................................. 4
一、实验目的及要求
理解静态分析目标与主要活动。
通过understand获取被测程序(Program under test,PUT)的注释率、最大圈复杂度等主要指标,绘制函数的butterfly图、control flow图,使用code check对PUT实施代码规范检测。
二、实验软硬件环境
软件环境:操作系统OS为windows 10,understand 6.2.1112。
硬件环境:CPU为11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz 2.42 GHz,内存为16G,硬盘为512GB,显卡为Intel(R) lris(R) Xe Graphics.
三、实验原理
静态分析可以在不执行PUT的前提下,获取PUT的主要指标,检查其对编码规范的违例程度,快速建立软件质量初步评价结果。
四、实验过程
4.1方法
使用静态分析工具,掌握PUT的概况,了解指定函数的依赖关系、控制流图,以及编码规范的遵从程度。
4.2 步骤
创建项目。
Overview。
Butterfly。
Control flow。
Code check。
五、实验结果
(1)根据图1描述圈复杂度最大的10个函数的统计信息,包括:总行数、代码行、注释行、循环nesting深度,并在表1中设计相关统计信息表格。
图1 代码质量报表↑
表 1 主要统计信息↓
序号 | 函数 | 总行数 | 代码行 | 注释行 | 最大nesting |
1 | Others.Graph.Vertex | 62 | 50 | 2 | 1 |
2 | Sorts.CycleSort | 66 | 41 | 11 | 4 |
3 | DataStructures.Graphs.FloydWarshall | 72 | 66 | 6 | 4 |
4 | DataStructures.Trees.TrieImp | 125 | 109 | 6 | 4 |
5 | DataStructures.Graphs.BellmanFord | 157 | 125 | 44 | 3 |
6 | Others.CRCAlgorithm | 187 | 112 | 55 | 4 |
7 | DataStructures.Trees.BinaryTree | 256 | 143 | 89 | 3 |
8 | BSTIterative | 285 | 199 | 84 | 4 |
9 | DataStructures.Trees.RedBlackBST | 327 | 302 | 1 | 4 |
10 | divideconquer.ClosestPair | 336 | 210 | 130 |
(2)选取较复杂函数DataStructures.Trees.RedBlackBST.insert,生成butterfly图与control flow图,如图2、图3所示。
图 2 butterfly图
图 3 control flow图
(3)选取HIS规则集进行编码规范检测,冲突项753个,根据图5可知违例数量最多的五条规则分别是:
·规则1:Language scope(VOCF)-HIS_11,如AES.keyExpansion函数违例是因为该函数维护/修改的成本较高。
·规则2:Comment Density(COMF)-HIS_01,如ciphers.Vigenere函数违例是因为注释行相对于指令行比例较低。
·规则3:Number of call levels(LEVEL)-HIS 09,如BellmanFord.printPath函数违例是因为该函数内的嵌套深度过高。
·规则4:Called Functions(CALLS)-HIS_06,如RSA.generateKeys函数违例是因为该函数调用了太多其他函数。
·规则5:Recursion(AP_CG_CYCLE)-HIS_12,如QuickSort.doSort函数违例是因为该函数采用直接递归,违反安全规范。
规则 | 规则含义 | 违例数量 | 违例实例 |
Number of call levels(LEVEL)-HIS 09 | 函数调用了太多其他函数 | 52 | BellmanFord.printPath |
Called Functions(CALLS)-HIS_06 | 函数调用了太多其他函数 | 65 | RSA.generateKeys |
Language scope(VOCF)-HIS_11 | 维护/修改函数的成本较高 | 82 | AES.keyExpansion |
Recursion(AP_CG_CYCLE)-HIS_12 | 某个函数采用直接递归,违反安全规范 | 84 | QuickSort.doSort |
Comment Density(COMF)-HIS_01 | 注释行相对于指令行比例较低 | 451 | ciphers.Vigenere |
表 2 HIS规则集违例信息
图4 规则集下的冲突项
5.1分析与讨论
如图5可知,最大圈复杂度为15,对应函数是DataStructures.Trees.BinaryTree.remove
图5 最大圈复杂函数
六、总结
项目概况: “项目TheAlgorithms”是一个开源算法和数据结构库,包含用不同编程语言实现的常见算法。
“项目TheAlgorithms”共有228个文件、296个类、1047个函数,最大圈复杂度为15,超过14的函数有1个,注释率26%,编码规范HIS的违例项753个,通过系统的测试流程,“项目TheAlgorithms”提供了一个优秀的算法实现库,支持日常学习和应用。有效的测试策略可以帮助项目保持高质量并降低维护成本。综合所述,项目质量良好。