软件验证与确认实验一:静态分析

server/2024/10/9 3:26:52/

目录

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”提供了一个优秀的算法实现库,支持日常学习和应用。有效的测试策略可以帮助项目保持高质量并降低维护成本。综合所述,项目质量良好。


http://www.ppmy.cn/server/127763.html

相关文章

Python环境安装教程

文章目录 一、搭建Python环境1.官网下载Python2.安装Python3.检验是否安装成功 二、安装pip1.检验是否有pip2.pip升级3.模块安装4.检验模块是否安装成功5.番外:pip做了什么? 本教程是安装Windows环境下Python3.7.4 一、搭建Python环境 1.官网下载Python…

<Rust>iced库(0.13.1)学习之部件(二十九):button部件新增方法on_press_with,可传入闭包函数

前言 本专栏是学习Rust的GUI库iced的合集,将介绍iced涉及的各个小部件分别介绍,最后会汇总为一个总的程序。 iced是RustGUI中比较强大的一个,目前处于发展中(即版本可能会改变),本专栏基于版本0.12.1. 注:新版本已更新为0.13 概述 这是本专栏的第二十九篇,在新版本中…

【GeekBand】C++设计模式笔记5_Observer_观察者模式

1. “组件协作”模式 现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式。典型模式 Template MethodStrategyObserver / Event 2.…

GO网络编程(四):海量用户通信系统2:登录功能核心【重难点】

目录 一、C/S详细通信流程图二、消息类型定义与json标签1. 消息类型定义2. JSON标签3.结构体示例及其 JSON 表示:4.完整代码与使用说明 三、客户端发送消息1. 连接到服务器2. 准备发送消息3. 创建 LoginMes 并序列化4. 将序列化后的数据嵌入消息结构5. 序列化整个 M…

C语言语句、语句分类及注释

文章目录 一、语句和语句分类二、注释🍕注释是什么?为什么写注释?1. /**/的形式2. //的形式3. 注释会被替换 三、随机数的生成1.rand函数2.srand函数3.time函数4.设置随机数的范围 四、C99中的变长数组五、问题表达式解析表达式1表达式2表达式…

Linux驱动开发常用调试方法汇总

引言:在 Linux 驱动开发中,调试是一个至关重要的环节。开发者需要了解多种调试方法,以便能够快速定位和解决问题。 1.利用printk 描述: printk 是 Linux 内核中的一个调试输出函数,类似于用户空间中的 printf。它用于…

【初阶数据结构】排序——选择排序

目录 前言选择排序堆排序 前言 对于常见的排序算法有以下几种: 下面这节我们来看选择排序算法。 选择排序 基本思想:   每一次从待排序的数据元素中遍历选出最大(或最小)的元素放在序列的起始位置,直到全部待排序…

水波荡漾效果+渲染顺序+简单UI绘制

创建场景及布置 创建新场景Main,在Main场景中创建一个plane物体,命名为WaterWavePla,具体数值及层级面板排布如下: 编写脚本 创建一个文件夹,用于存放脚本,命名Scripts,创建一个子文件夹Effect,存放特效相关脚本,创建…