0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

代码结构分析

嵌入式大杂烩 2023-05-12 22:23 次阅读

1 代码结构分析概述

在编写代码时,要求要结构清晰、接口简单。如果代码结构过于复杂,会带来很多问题:代码很难被理解,不方便编写测试用例,容易隐藏错误,出现问题难以定位,修改代码容易产生新的Bug等等。因此,需要有一些指标来评估代码的复杂度,以方便对过于复杂的代码进行重构。

代码的复杂度通常可通过以下几个指标来评估:

  • 总行数:包括注释以及空行在内的代码行数;
  • 语句数目:有效的语句行数,包括#include、#define、#undef 这三个预处理命令在内,括号不包含在内;
  • 分支语句比例:分支语句占总语句数目的比例;
  • 注释比例:注释占总行数的比例;
  • 函数数目:函数的数量;
  • 平均每个函数的语句数;
  • 函数圈复杂度;
  • 函数最大嵌套层数;
  • 类的数量;
  • 平均每个类的函数数量。

2 基于的SourceMonitor代码结构检查

当前能够进行代码结构检查的工具有不少,本文中选择 SourceMonitor 作为代码结构检查工具。

2.1 SourceMonitor简介

官网地址:https://www.derpaul.net/SourceMonitor/

SourceMonitor 是 Campwood Software LLC 拥有版权的自由软件,非商业用途可免费使用。

SourceMonitor的主要功能是对代码的一个分析和度量。即使用SourceMonitor软件我们可以清晰的看到代码的总行数,注释比例,语句数以及类的个数和函数的个数。

SourceMonitor 有以下特点:

  • 支持对 C、 C++C#、 VB.NET、 java、 Delphi、 Visual Basic 以及 HTML 在内的多种语言的源代码的分析;
  • 效率高,每秒钟能够分析 10000 行以上的代码;
  • 可以修改各个度量指标的阈值。

2.2 C语言度量值(C Metrics)

下面以C语言度量值为例,看看SourceMonitor都给我们反馈了哪些信息

总行数(Lines) :包括空行在内的代码行数;

语句数目(Statements) :在C语言中,语句是以分号结尾的。分支语句if,循环语句for、while,跳转语句goto都被计算在内,预处理语句#include、#define和#undef也被计算在内,对其他的预处理语句则不作计算,在#else和#endif、#elif和#endif之间的语句将被忽略;

分支语句比例(Percent Branch Statements) :该值表示分支语句占语句数目的比例,这里的“分支语句”指的是使程序不顺序执行的语句,包括if、else、for、while和switch;

注释比例(Percent Lines with Comments) :该值指示注释行(包括/……/和//……形式的注释)占总行数的比例;

函数数目(Functions) :指示函数的数量;

平均每个函数包含的语句数目(Average Statements per Function) :总的函数语句数目除以函数数目得到该值;

函数圈复杂度(Function Complexity) :圈复杂度指示一个函数可执行路径的数目,以下语句为圈复杂度的值贡献1:if/else/for/while语句,三元运算符语句,if/for/while判断条件中的"&&"或“||”,switch语句,后接break/goto/ return/throw/continue语句的case语句,catch/except语句;

函数深度(Block Depth) :函数深度指示函数中分支嵌套的层数。

对其他语言,SourceMonitor输出不同的度量值,例如在C++度量值中包括类的数目(Classes),在HTML中包括各个标签的数目(HTML Tags)、超链接数目(Hyperlinks)等。

2.2.1 SourceMonitor使用指南

首先在SourceMonitor官网下载SourceMonitor安装包后,双击安装包,按向导进行安装即可,这里就不再赘述了。

打开 SourceMonitor,选择菜单“File→New Project”新建项目。

1683896863274x0e51xaemr

弹出如下图所示的语言选择对话框,选择源文件的语言以及需要扫描的文件类型,SourceMonitor 对自动扫描对应的源文件进行分析。 闰年判断函数是使用 C 语言编写的, 所以选择 C 语言,扫描的文件类型指定.c 和.h,然后点击下一步继续。

1683896863625x4cudrx9f6

在接下来弹出的如下图所示的对话框中,设置项目的名称和保存路径,并点击下一步继续。

1683896863956pnviqdnwl8

在接下来弹出的如下图所示的对话框中,填入源文件所在的目录,并点击下一步继续。

1683896864256fw9xsupj66

设置源代码目录后,后面所有设置都采用默认设置即可,一直点击下一步直到完成。

1683896864553st636cvelz

在新建项目完成后,系统会自动创建一个检查点,可以手动修改检查点的名称和需要检查的文件列表。修改完毕后,点击OK 按钮检查点的创建,详见下图。

16838968648687qkxr1nmsr

2.2.2 分析代码结构

新建项目并创建检查点后,接下来就可以进行代码结构分析了。在检查列表中列出了当前已经创建的所有的检查点,详见下图。

1683896865163qdr2hjoy1y

针对每个检查点,SourceMonitor 给出了每个度量指标的具体的值,可以通过左右划动滚动条进行查看。

如果需要查看某个检查点是否有指标超标,可右击对应的检查点,然后在右键菜单中选择“Display CheckPoint Metrics Kiviat Graph”,详见下图。

1683896865549bh9oq9cg1a

打开的指标度量图标详见下图。

1683896865926y2lwfh3n5c

从指标度量图表中可以看出,每个指标都有下限和上限值。 在实际应用中,要求注释比例和平均每个函数的代码数必须在下限和上限指示的范围内,而其他的指标则要求不能超出上限,否则代码就需要重构。

若从指标度量图中发现某项指标不合格,则可双击对应的检查点打开文件列表。在打开的文件列表中,可以通过点击表头改变排序方式以快速找到指标不合格的文件。如下图所示为按文件名升序进行排序。

1683896866253puyfbt8cbp

找到指标不合格的文件,单击鼠标右键,然后在右键菜单中选择“Display Function Metrics”打开函数列表,详见下图。

1683896866572omzzv0yp7w

同样在打开的函数列表中,可以通过点击表头改变排序方式以快速找到指标不合格的函数,然后就可以对对应的函数进行重构。如下图所示为按照函数名称升进行排序。

16838968669299hf5qjmneu

2.2.3 修改指标阈值

在有些时候,开发者可能并不希望使用系统默认的指标阈值,而是希望能够自定义指标阈值。 SourceMonitor 支持对各个指标的阈值进行自定义,这样使用时就会更加灵活。选择菜单“File→Option”,打开选项设置对话框。

168389686722171aelv6yqi

如果需要修改对应语言的阈值,可以选中对应的选项卡进行修改即可。详见下图。

1683896867517f8qnmokssl

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66784
收藏 人收藏

    评论

    相关推荐

    llama.cpp代码结构&调用流程分析

    llama.cpp 的代码结构比较直观,如下所示,为整体代码结构中的比较核心的部分的代码结构
    的头像 发表于 11-07 09:23 912次阅读
    llama.cpp<b class='flag-5'>代码</b><b class='flag-5'>结构</b>&amp;调用流程<b class='flag-5'>分析</b>

    请问什么是电机结构分析的大局观?

    何为电机结构分析的大局观?在电机设计阶段,可以做哪些结构分析?需要做哪些分析?每个分析的目的是什
    发表于 10-31 10:36

    【跑通HarmonyOS智能家居模块模块】lingxin-yuhe Codelab第二期记录帖

    Ability(JS)】新建一个工程。4、大体看一下代码结构分析一下。Tools选择运行模拟器。5、运行出来的如图所示。
    发表于 04-17 08:05

    LINUX 进程源代码分析

    LINUX 进程源代码分析 task_struct 数据结构表示进程的数据结构是struct task_struct。task_struct 结构
    发表于 02-09 15:13 16次下载

    如何看懂源代码--(分析代码方法)

    如何看懂源代码--(分析代码方法) ________________________________________我们在写程式时,有不少时间都是在看别人的代码。 例如看小组的
    发表于 02-10 14:40 51次下载

    静态代码分析

    Fortify的静态代码分析器(Static Code Analyzer,SCA)是组成Fortify 360的三个分析器之一。SCA工作在开发阶段,以用于分析应用程序的源
    发表于 04-07 20:32 22次下载

    Hypertable底层存储结构分析

    通过分析Hypertable 的源代码,描述了CellStore 存储结构,介绍其读写流程,总结了该结构存在的缺陷,并提出了优化思路。优化步骤主要包括:将关键字数据进行合并,建立关键字
    发表于 05-12 16:37 27次下载
    Hypertable底层存储<b class='flag-5'>结构</b><b class='flag-5'>分析</b>

    Struts2源代码分析

    Struts2源代码分析
    发表于 11-06 10:06 0次下载

    德国mk代码分析

    德国mk代码分析德国mk代码分析德国mk代码分析
    发表于 01-15 17:03 9次下载

    ARM单片机教程(HAYDEN Luo bios总体结构及源代码分析

    ARM单片机教程(HAYDEN Luo bios总体结构及源代码分析)文档免费下载,由于 Hayden Luo Bios 的结构特殊性,虽然是缩减,却丝毫没有改动 bios 的大
    发表于 10-27 15:50 12次下载
    ARM单片机教程(HAYDEN Luo bios总体<b class='flag-5'>结构</b>及源<b class='flag-5'>代码</b><b class='flag-5'>分析</b>)

    Java异常的习题和代码分析

    Java异常的习题和代码分析
    发表于 07-08 14:54 5次下载
    Java异常的习题和<b class='flag-5'>代码</b><b class='flag-5'>分析</b>

    MATLAB代码和例子分析

    MATLAB代码和例子分析
    发表于 05-27 09:44 0次下载

    什么是静态代码分析?静态代码分析概述

    静态分析可帮助面临压力的开发团队。高质量的版本需要按时交付。需要满足编码和合规性标准。错误不是一种选择。 这就是开发团队使用静态分析工具/源代码分析工具的原因。在这里,我们将讨论静态
    的头像 发表于 07-19 12:09 928次阅读
    什么是静态<b class='flag-5'>代码</b><b class='flag-5'>分析</b>?静态<b class='flag-5'>代码</b><b class='flag-5'>分析</b>概述

    瑞数的代码结构及逆向分析

    上述文章中,详细介绍了瑞数的特征、如何区分不同版本、瑞数的代码结构以及各自的作用,本文就不再赘述了,不了解的同志可以先去看看之前的文章。 逆向目标 目标:瑞数 6 代 网站
    的头像 发表于 11-02 11:08 1002次阅读
    瑞数的<b class='flag-5'>代码</b><b class='flag-5'>结构</b>及逆向<b class='flag-5'>分析</b>

    【鸿蒙】OpenHarmony 4.0蓝牙代码结构简析

    OpenHarmony 4.0蓝牙代码结构简析前言 OpenHarmony 4.0上蓝牙仓和目录结构进行一次较大整改,本文基于4.0以上版本对蓝牙代码进行
    的头像 发表于 02-26 16:08 328次阅读
    【鸿蒙】OpenHarmony 4.0蓝牙<b class='flag-5'>代码</b><b class='flag-5'>结构</b>简析