LDRA Testbed软件静态分析_软件质量度量

news2024/10/5 20:26:59

系列文章目录

LDRA Testbed软件静态分析_操作指南
LDRA Testbed软件静态分析_自动提取静态分析数据生成文档
LDRA Testbed软件静态分析_Jenkins持续集成_(1)自动进行静态分析的环境搭建
LDRA Testbed软件静态分析_Jenkins持续集成_(2)配置邮件自动发送静态分析结果
LDRA Testbed软件静态分析_软件质量度量
LDRA Testbed软件静态分析_常见问题及处理
LDRA Testbed软件单元测试_操作指南
LDRA Testbed软件单元测试_常见问题及处理
LDRA Testbed软件集成测试_操作指南
LDRA Testbed软件集成测试_常见问题及处理
粉丝问题解答系列文章… …
其他持续更新中… …


文章目录

  • 系列文章目录
  • 前言
  • 一、Testbed软件质量审查报告概述
    • 1.Overall Results
    • 2.Reformatted Code Information for File
    • 3.Procedure Information
    • 4.Comments Associated with Procedures (% of total)
    • 5.Ratio of Comments to Executable lines (%)
    • 6.Complexity Metrics
    • 7.Halsteads Metrics
    • 8.Loop/Interval Analysis
    • 9.LCSAJ and Unreachability
    • 10.Dataflow Information
  • 二、重点软件质量项详述
    • 1.Cyclomatic Complexity(圈复杂度)
    • 2.Essential Cyclomatic Complexity(基本圈复杂度)
    • 3.Fan in(扇入数)
    • 4.Fan Out(扇出数)
    • 5.代码注释率
  • 总结


前言

在之前的文章已经讲解了如何使用Testbed进行软件静态分析,包括手动的操作指南,以及如何在Jenkins下搭建自动化的静态分析环境。之前着重讲的是软件静态分析中对软件编码标准的检查情况(比如使用MISRA C/C++等标准),本篇文章将基于Testbed进一步讲解软件质量度量。包括软件质量度量项的整体概述,以及对圈复杂度、扇入数、扇出数等项的重点介绍。


一、Testbed软件质量审查报告概述

1.Overall Results

首先映入眼帘的是“Overall Results - Percentage of Metrics Passing”,即“总体结果 - 通过指标的百分比”,对每个源文件按照“All Metrics”(所有指标)、“Clarity”(清晰性)、“Maintainability”(可维护性)、“Testability”(可测试性)等维度进行结果展示。这些维度的结果是后续所有相关度量项的统计结果,如下图:
Testbed_10.x.x之后的版本的质量审查报告如下:
在这里插入图片描述
Testbed_10.x.x之前的版本(如8.x.x、9.x.x等)的质量审查报告如下:
在这里插入图片描述
虽然不同版本的质量审查报告显示视图有些差异,但其中的度量项基本相同,此后均以更新版本的Testbed_10.1.0的质量审查报告作为示例进行讲解。
此后的2~10小节是按照每个源文件分别进行质量度量结果的展示。

2.Reformatted Code Information for File

在这里插入图片描述
“Reformatted Code Information for File”即“源文件的格式化代码的信息”,testbed对源代码的格式化示例如下:
在这里插入图片描述
Testbed会对源代码进行格式化处理后再进行分析;在格式化代码的基础上进行各项度量和分析,这样可以保证工程中的所有代码都是在一致的科学的格式和标准下进行度量和分析,使度量结果更准确。其中包括格式化代码总行数、格式化代码注释总行数、可执行格式化代码行数、不可执行格式化代码行数、函数的总数、原码的总行数、扩展因子(膨胀比率)等。

在软件质量中,Expansion Factor(扩展因子)(膨胀比率)通常指的是软件的可扩展性,即对软件的规约进行修改,以适应变化的能力。这涉及到软件设计和架构的灵活性,以便在需求或环境发生变化时,能够容易地对软件进行扩展和修改。扩展因子通常与软件的可维护性、可复用性和灵活性等质量属性相关。一个具有良好扩展性的软件应该能够容易地添加新功能、修改现有功能或适应新的运行环境,而不需要对整个系统进行大规模的修改或重构。
在评估软件的扩展因子时,可以考虑以下几个方面:
模块化程度:软件是否被划分为清晰的模块,每个模块具有明确的职责和接口。
耦合度:各个模块之间的依赖关系是否紧密,是否容易解耦。
内聚性:模块内部的功能是否紧密相关,是否容易进行功能的增加或修改。
可扩展性设计原则:是否遵循了如开闭原则(OCP)、里氏替换原则(LSP)等面向对象的设计原则,以提高软件的可扩展性。
可测试性:新的或修改的功能是否容易进行测试和验证。
不同的软件项目和团队可能对扩展因子的定义和评估方法有所不同,因此,在具体项目中,需要根据项目的需求和团队的实际情况来定义和评估扩展因子。testbed只是提供了一个参考结果,这个用得比较少,这里只做概念介绍。

3.Procedure Information

在这里插入图片描述
“Procedure Information”即“函数信息”,这里按照函数列表的视图进行展示,包括每个函数的可执行的格式化代码行数、基本模块数、基本模块的平均长度、函数的入口个数、函数的出口个数等。

4.Comments Associated with Procedures (% of total)

在这里插入图片描述
“Comments Associated with Procedures (% of total)”即“与函数相关的注释”,这里按照函数列表的视图进行展示,包括每个函数的总注释行数、函数头注释行数、函数声明中的注释行数、函数可执行代码中的注释行数、空白行数等。

5.Ratio of Comments to Executable lines (%)

在这里插入图片描述
“Ratio of Comments to Executable lines (%)”即“注释和可执行代码行的比率”,这里按照函数列表的视图进行展示,包括每个函数的总注释与可执行代码的比率、头注释与可执行代码的比率、声明注释与可执行代码的比率、代码注释与可执行代码的比率、以及每个函数重新格式化后的可执行代码行数。

6.Complexity Metrics

在这里插入图片描述
“Complexity Metrics”即“复杂度度量”,这里按照函数列表的视图进行展示,包括每个函数的基本结点数、基本圈复杂度、结点数、圈复杂度、函数的结构化验证等。稍后将对圈复杂度和基本圈复杂度做详细介绍

7.Halsteads Metrics

在这里插入图片描述
“Halsteads Metrics”即“Halsteads 度量”,它是一种用于评估软件质量的方法,由Maurice Halstead在1970年代提出,它基于程序中出现的运算符和运算元的数量来进行分析。具体来说,它衡量的是一个程序或模块的复杂性和工作量。在Halstead Metrics中,程序被看作是由运算符和运算元组成的序列。运算符是程序中的动作或操作,如加、减、乘、除等;而运算元则是这些操作的对象,如变量、常量等。通过统计这些元素的出现次数,可以计算出几个重要的指标,如程序容量、工作量、难度等。
testbed的Halsteads 度量包括总操作符、总操作数、独特的操作符、独特的操作数、词汇量、长度、容积等。

8.Loop/Interval Analysis

在这里插入图片描述
“Loop/Interval Analysis”即“循环/嵌套分析”,这里按照函数列表的视图进行展示,包括第一个嵌套的个数、最大的嵌套数、可简化的个数(嵌套)、循环的个数、循环嵌套深度等。

9.LCSAJ and Unreachability

在这里插入图片描述
“LCSAJ and Unreachability”即“线性代码序列和跳转 和不可达性”,LCSAJ(Linear Code Sequence and Jump)是指一种特定的代码结构,由一组顺序执行的代码段组成,以控制跳转作为结束点。LCSAJ覆盖是一种路径覆盖的变种,它考虑了那些在程序代码里容易表现出来且不需要流图的子路径,这种覆盖方式比判定覆盖更加彻底。LCSAJ是衡量软件质量时考虑的一种代码结构,有助于评估代码的可读性、可维护性和可测试性等方面。通过分析和优化LCSAJ,可以提高软件的质量和性能。
testbed的LCSAJ and Unreachability度量包括LCSAJ 的总个数、不可达的 LCSAJ、 LCSAJ 密度的最大值、不可达代码行数、不可达分支数、可达的 LCSAJ等。

10.Dataflow Information

在这里插入图片描述
“Dataflow Information”即“数据流信息”,这里按照函数列表的视图进行展示,包括全局变量个数、扇入数、扇出数等。稍后将对扇入数和扇出数做详细介绍

二、重点软件质量项详述

1.Cyclomatic Complexity(圈复杂度)

圈复杂度(Cyclomatic Complexity,简称CC)也称为条件复杂度,是一种代码复杂度的衡量标准。这一概念在1976年由Thomas J. McCabe, Sr.提出,用于表示程序的复杂度。圈复杂度是用来衡量一个模块判定结构的复杂程度,数量上表现为线性无关的路径条数,也可以理解为覆盖所有可能情况最少使用的测试用例数。根据经验,程序的可能错误和高的圈复杂度有着很大关系。
圈复杂度是最常用的一种软件质量度量项,各大标准中一般都要求比较苛刻(1 ~ 10),行业实践中一般会稍微放宽到1 ~ 15(仅供参考)。
圈复杂度的计算方法有3种,主要是基于控制流图中的边数、节点数、划分成的区域数等进行计算:
1、公式(一):V(G)=E-N+2(E–表示控制流图中边的数量、N–表示控制流图中节点的数量)
在这里插入图片描述
2、公式(二):V(G) = P+1(P–判定节点数)
在这里插入图片描述
3、公式(三):V(G) = R(R–平面被控制流图划分成的区域数)
在这里插入图片描述

2.Essential Cyclomatic Complexity(基本圈复杂度)

与圈复杂度相关的另一个概念是基本圈复杂度,这是一种衡量程序非结构化程度的度量指标。它基于模块控制流图中的结构化子图的数量来计算,将模块控制流图中的结构化部分简化成节点,计算简化后控制流图的圈复杂度就是基本复杂度。计算公式为EV(G) = V(G) - M,其中V(G)是圈复杂度,M是结构化子图的数量。基本圈复杂度可以帮助我们了解程序模块的结构化程度。
例如,当基本复杂度为1时,这个模块是充分结构化的;当基本复杂度大于1而小于圈复杂度时,这个模块是部分结构化的;当基本复杂度等于圈复杂度时,这个模块是完全非结构化的。

3.Fan in(扇入数)

扇入数(Fan In)是指直接调用一个模块(或函数、过程等)的上级模块的数量。
扇入大意味着模块的复用程度较高,即该模块被多个其他模块调用,表明该模块的功能相对独立和通用。高扇入数通常意味着模块具有较高的聚合性,这有助于提高软件的模块化和可维护性。但是不能为了获得高扇入而不惜代价,例如把彼此无关的功能凑在一起构成一个模块,虽然扇入数高了,但这样的模块内聚程度必然低,这是我们应避免的。

4.Fan Out(扇出数)

扇出数(Fan Out)则是指一个模块直接调用的下级模块(或函数、过程等)的数量。
扇出大意味着模块的复杂度较高,需要控制和协调较多的下级模块。但扇出过小(例如总是为1)也不好,因为这可能表明模块的功能过于单一或缺乏中间层次的抽象。扇出数过大通常是因为缺乏中间层次的模块,此时可以考虑适当增加中间层次的模块来降低复杂度。当扇出数过小时,可以考虑将下级模块进一步分解成若干个子功能模块,或者将其合并到它的上级模块中去。
扇出数一般来说要求为0 ~ 7。

5.代码注释率

从第一章的4、5小结可以看到,testbed对代码注释率的度量做得非常细,具体到了每个源文件、每个函数,甚至区分了函数的头注释、声明注释、可执行代码的注释。但是testbed没有对整个工程进行完整的注释率度量,这个一般也是有要求的(一般要求注释率不低于20%),可以通过SourceCounter、LineCount之类的软件进行统计,如下图所示。
在这里插入图片描述
在这里插入图片描述


总结

以上就是对Testbed软件质量审查报告中度量项的详细介绍,希望对大家有所帮助,如有疑问可以评论或私信交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1460699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为配置直连三层组网直接转发示例

华为配置直连三层组网直接转发示例 组网图形 图1 配置直连三层组网直接转发示例组网图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件扩展阅读 业务需求 企业用户接入WLAN网络,以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff…

【力扣hot100】刷题笔记Day7

前言 身边同学已经陆陆续续回来啦,舍友都开始投简历了,我也要加油啦!刷完hot100就投! 73. 矩阵置零 - 力扣(LeetCode) 标记数组:空间复杂度O(mn) class Solution:def setZeroes(self, matrix:…

LeetCode--代码详解 59. 螺旋矩阵 II

59. 螺旋矩阵 II 题目 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n 3 输出:[[1,2,3],[8,9,4],[7,6,5]]示例 2: 输入&a…

【Effective Objective - C】—— 系统框架

【Effective Objective - C】—— 系统框架 47.熟悉系统框架CoreFoundation框架其他框架要点 48. 多用块枚举,少用for循环for循环使用Objective-C 1.0的NSEnumerator遍历快速遍历基于块的遍历方式要点 49.对自定义其内存管理语义的collection使用无缝桥接要点 50.构…

利用MATLAB/Simulink仿真模型加速嵌入式控制系统的开发——以多学科融合的电机控制为例

电机控制涵盖了广泛的应用领域,从家用电器到工业设备,从电动汽车到航空航天,其重要性不言而喻。从过去到现在,再到未来,电机控制技术的发展经历了显著的变革,并持续推动着相关行业的进步。 一、电机控制的…

pip镜像源:清华镜像、阿里云镜像、豆瓣镜像与如何修改默认镜像源

pip镜像源:清华镜像、阿里云镜像、豆瓣镜像与如何修改默认镜像源 🌈 个人主页:高斯小哥 🔥 高质量专栏:【Matplotlib之旅:零基础精通数据可视化】 🏆🏆关注博主,随时获取…

git clone 克隆代码报错

在拉取代码的时候报这个错误,也看了一下地址是正确的的,网络也正常。然后ping gitlab.com执行也没问题,如果有问题就是是环境问题。我以为是git名字和邮箱没有绑定的原因,结果绑定了还是这个问题,这个时候就只好百度啦…

OpenAI划时代大模型——文本生成视频模型Sora作品欣赏(六)

Sora介绍 Sora是一个能以文本描述生成视频的人工智能模型,由美国人工智能研究机构OpenAI开发。 Sora这一名称源于日文“空”(そら sora),即天空之意,以示其无限的创造潜力。其背后的技术是在OpenAI的文本到图像生成模…

数据结构---字典树(Tire)

字典树是一种能够快速插入和查询字符串的多叉树结构,节点的编号各不相同,根节点编号为0 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。 核心思想也是通过空间来换取时间上的…

Elastic Stack--01--简介

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 Elastic Stack 简介为什么要学习ESDB-Engines搜索引擎类数据库排名常年霸榜![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/051342a83f574c8c910cda522…

YOLOv8改进 | 进阶实战篇 | 利用辅助超推理算法SAHI推理让小目标无所谓遁形(支持视频和图片)

欢迎大家订阅我的专栏一起学习YOLO! 一、本文介绍 本文给大家带来的是进阶实战篇,利用辅助超推理算法SAHI进行推理,同时官方提供的版本中支持视频,我将其进行改造后不仅支持视频同时支持图片的推理方式,SAHI主要的推理场景是针对于小目标检测(检测物体较大的不适用,…

WMS仓储管理系统解决方案如何释放智能仓库的潜力

随着科技的不断进步与创新,智能化仓储设备正逐渐成为企业转型升级的必备利器。越来越多的企业纷纷投入巨资,打造智能仓库,以应对激烈的市场竞争。与传统仓库相比,智能仓库凭借其高效、准确、自动化的特点,成为了企业提…

在springboot项目中调用openai API及我遇到的问题

这两天我在自己的网站中集成了openai API,引入chatgpt对话机器人,中途遇到了很多坑,记录一下。文章中会涉及一些付费工具,如果你有类似功能的工具,完全可以使用自己的。(主要是我想澄清一下,我不…

LPDDR6与LPDDR5 ZQ Calibration技术探讨

LPDDR6相比LPDDR5在ZQ校准这一块删除了command-based相关的描述,删除了ZQ校准模式切换的描述,仅支持background-based的校准。 回顾一下LPDDR5 基于background-based的校准: background ZQC是通过MR28 OP[5]来选择的,当选择为0&a…

一个基于C#开发的、开源的特殊字符输入法

emoji表情在社交网络非常流行,我们在手机也非常方便输入,但是在PC电脑我们一般需要到归集好的网页拷贝,所以今天推荐一个Windows小工具,让你方便输入特殊字符和emoji表情。 01 项目简介 这是一个基于C#开发的开源项目&#xff0…

解锁动态体验:探秘文件二维码生成的多重魅力

文件生成二维码,作为一种动态二维码,不仅能够存储丰富的信息,更通过其独特的特点为用户带来了全新的使用体验。让我们一起深入探讨这一引人注目的技术。 1. 数据追踪:揭示用户互动的面纱 在二维彩虹的文件二维码中,数…

使用 Next.js 连接 mysql 数据库

前言 本文主要为大家介绍,如何使用 Next 框架实现一个简单的后端接口,并且从数据库中请求数据返回给前端。 实现 创建api/getData文件夹 项目创建完成后在 app 文件下新建api文件夹,在 api 文件夹下新建 getData 文件夹,在 ge…

聊一聊bpmn-js中的Viewer和Modeler

通过之前对于bpmn-js的学习,可以完成一个基础的Bpmn编辑器(或者叫建模器)的显示和简单绘制,若需要做更多工作还需加强对其的内部实现的了解。通过使用我们可以知道bpmn-js中有两个比较重要的操作对象:bpmnViewer和bpmnModeler。 Viewer:一般习惯性对齐命名对象称之为bpmnVi…

golang入门介绍-1

今天开始发布关于go语言入门到实战内容,各位小伙伴准备好。 go介绍 Go语言(或 Golang)起源于 2007 年,并在 2009 年正式对外发布。是由 Google 公司开发的一种静态强类型、编译型、并发型、并具有垃圾回收功能的编程语言。 Go 是…

在哪些领域中最需要使用 OCR 识别技术?真实场景介绍

根据我们的项目经验总结来说,OCR(光学字符识别)技术在多个领域中扮演着至关重要的角色,它能够将图像中的文本内容转换为机器可读的格式,极大地提高了数据处理的效率和准确性。以下是一些主要领域及其对应的应用场景和用…