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

系列文章目录

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.mzph.cn/news/694459.shtml

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

相关文章

typescript映射类型

ts映射类型简介 TypeScript中的映射类型(Mapped Type)是一种高级类型,它允许我们基于现有类型创建新的类型,同时对新类型的每个属性应用一个转换函数。通过使用映射类型,我们可以方便地对对象的属性进行批量操作&…

typescript 索引签名类型

ts索引类型简介 在TypeScript中,索引签名类型(Index Signature Type)是一种特殊的类型,它定义了对象中键的类型以及相应的值的类型。通过使用索引签名类型,我们可以表示一个对象,该对象的键可以是任意类型…

python3 flask 实现对config.yaml文件的内容的增删改查,并重启服务

config.yaml配置文件内容 功能就是userpass下的用户名和密码做增删改查,并重启hy2服务 auth:type: userpassuserpass:csdn: csdnlisten: :443 masquerade:proxy:rewriteHost: trueurl: https://www.bing.com/type: proxy tls:cert: /root/hyst*****马赛克******er…

【算法2-1】前缀和、差分与离散化

一、【P3406】海底高铁(差分贪心)​​​​​​ 由于本题涉及到线路问题,需要统计Uim途径每条线路的次数,而且Uim每次的轨迹都是很长一段路径,所以需要使用一个合理的数据结构来维护区间的变化,首先想到线段…

正交匹配追踪算法(Orthogonal Matching Pursuit)实现过程及Python模拟

正交匹配追踪(Orthogonal Matching Pursuit,OMP)是一种用于寻找稀疏信号的贪婪算法,用于求解压缩感知问题中的稀疏近似问题。在压缩感知的背景下,通常我们有一个欠定的线性系统Ax y,其中A是一个已知的测量…

信奥一本通:2022:【例4.7】最小n值

这个题目的难点在于他让你输入1 2 3&#xff0c;不等的数&#xff0c;意思就是你不知道循环要执行几次&#xff0c;用户输入几次就是几次&#xff0c;那就只有这样写 while (cin >> num) #include <iostream> # include <iomanip> using namespace std;…

第三百五十九回

文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 013pickers2.gif 我们在上一章回中介绍了"如何实现Numberpicker"相关的内容&#xff0c;本章回中将介绍wheelChoose组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念…

学习鸿蒙基础(4)

1.条件渲染 ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态&#xff0c;使用if、else和else if渲染对应状态下的UI内容。 当if、else if后跟随的状态判断中使用的状态变量值变化时&#xff0c;条件渲染语句会进行更新。。 Entry Component struct PageIfElse {Stat…

【C++杂货铺】模板

&#x1f308;前言&#x1f308; 欢迎观看本期【C杂货铺】&#xff0c;本期内容将讲解模板的初阶&#xff0c;即了解模板&#xff0c;熟练掌握模板的使用方法&#xff0c;了解模板的工作原理等内容。 &#x1f4c1; 函数模板 &#x1f4c2; 概念 函数模板代表了一个函数家族&am…

如何在Windows系统中检测和结束运行中的程序(任务管理器显示运行程序可能有bug)

如何在Windows系统中检测和结束运行中的程序 在Windows系统的日常使用和管理过程中&#xff0c;我们经常需要检测某个程序是否正在运行&#xff0c;并在必要时结束它。本文将详细介绍如何在Windows系统中检测运行中的程序&#xff0c;并提供多种方法来结束这些程序。 检测运行…

通俗易懂的双亲委派机制

当你超过别人一点点&#xff0c;别人会嫉妒你&#xff1b;当你超过别人一大截&#xff0c;别人就会羡慕你 据说给我点关注的都成了大佬&#xff0c;点关注的我都会私发一份好东西 ​​​​你得先知道 在介绍双亲委派机制的时候&#xff0c;不得不提ClassLoader&#xff08;类…

Java字符串转整数的超简单方法!

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 问题描述 当你把一个字符串值和一个整数加在一起而不进行任何形式的转换时会发生什么呢&#…

聚合支付,聚合系统,聚合程序或将成为主流

支付市场的变化对用户、代理商和运营商产生了重大影响。 随着政策监管的日益严格&#xff0c;支付行业逐渐朝着标准化和合理化的方向发展&#xff0c;日益增强其安全性。在这个背景下&#xff0c;聚合平台已经成为未来支付行业发展的重要趋势。特别是在“一机一码”政策实施后&…

前端进度条组件NProgress

nprogress 安装 npm install --save nprogress使用 import NProgress from nprogress // 引入nprogress插件 import nprogress/nprogress.css // 这个nprogress样式必须引入// axios请求拦截器 axios.interceptors.request.use(config > {NProgress.start() // 设置加载进…

【学习心得】编程小白该如何学好C语言(✨新手推荐阅读)

前言 对于刚刚踏入编程领域的小白来说&#xff0c;C语言可能是一个既神秘又充满挑战的领域。但只要你掌握了正确的学习方法&#xff0c;C语言的学习之旅也可以是充满乐趣和成就感的。 一、明确学习目标 对于初学者来说&#xff0c;明确学习目标是学好C语言的第一步。一个清晰…

BIG DATA —— 大数据时代

大数据时代 [英] 维克托 迈尔 — 舍恩伯格 肯尼斯 库克耶 ◎ 著 盛杨燕 周涛◎译 《大数据时代》是国外大数据研究的先河之作&#xff0c;本书作者维克托迈尔舍恩伯格被誉为“大数据商业应用第一人”&#xff0c;他在书中前瞻性地指出&#xff0c;大数据带来的信息…

扩散模型+轨迹预测

目录 1. 基础知识2. 轨迹预测相关2.1 Leapfrog Diffusion Model2.2 MID2.3 中科院2.4 DICE2.5 MotionDiffuser2.6 DiffTraj 3. 练手时可参考4. 扩展&#xff1a;扩散模型RL 1. 基础知识 Stable diffusion扩散模型相关 Diffusion相关二 Diffusers是hugging face发起的用于专门…

Vue3引用第三方模块报错Could not find a declaration file for module ***.

在引用第三方的组件时候报错如下 原因是&#xff1a;该组件可能不是.ts文件而是.js文件 解决方案&#xff1a; 1.在Src的目录下面新建一个文件为shims-vue.d.ts的文件 2.文件内容为 declare module xxx&#xff0c;xxx就是你报错的模块 例如我这样 declare module vue3-pu…

单片机03--按键--寄存器版

GPIO端口相关寄存器&#xff08;STM32F40x芯片&#xff09; 目标&#xff1a; 开关KEY1控制开灯。 分析&#xff1a; KEY1---PA0--->输入---->浮空输入/下拉输入 KEY1不导通时&#xff0c;PA0输入为低电平&#xff0c;KEY1导通时&#xff0c;PA0输入为高电平。 实现…

Vue中 Runtime-Only和Runtime + Compiler的区别

在 Vue 项目中&#xff0c;Runtime-Only 和 Runtime Compiler 是两种不同的构建方式。 Runtime-Only&#xff08;仅运行时&#xff09;&#xff1a;在 Runtime-Only 构建中&#xff0c;Vue 库只包含运行时的代码&#xff0c;不包含模板编译器。。Runtime Compiler&#xff08…