Understand完成项目分析后,可以直接统计代码行数、函数复杂度、嵌套深度、类耦合等度量数据,也能按函数、文件、类和项目层级查看汇总结果。代码度量比较适合用来找体量较大的文件、复杂函数和耦合集中的模块,但这些数值依赖Understand已经识别到的源码实体。项目文件缺失、宏配置不对或者选错度量层级,都可能让结果和人工检查出现明显差异。
一、Understand怎么进行代码度量分析
Understand内置了多类代码度量指标,可以从Metrics Browser查看具体数据,也可以借助Treemap观察复杂度集中位置。分析时先确定对象层级,再选择对应指标,避免把函数值和文件汇总值放在一起比较。
1、在Metrics Browser查看度量数据
①打开已经完成Analyze的Understand项目。
②进入【Metrics】→【Browse Metrics】。
③在实体列表中选择准备分析的【File】【Function】【Class】等对象。
④在度量列中查看【CountLine】【CountLineCode】【Cyclomatic】【MaxNesting】等数据。
⑤点击列标题,可以按照对应数值排序。
⑥要找复杂度偏高的函数,可以选择函数实体后按【Cyclomatic】从高到低排列。
⑦要检查源码体量,则查看【CountLineCode】或【CountStmt】。
⑧双击目标实体,回到对应源码位置继续检查。
同一个指标并不一定适用于所有实体。例如【Cyclomatic】主要针对函数和方法,到了文件或项目层级,Understand通常会显示【AvgCyclomatic】【MaxCyclomatic】【SumCyclomatic】这类汇总数据。
2、查看圈复杂度和嵌套深度
圈复杂度适合检查函数内部控制分支是否过多,嵌套深度则可以辅助判断代码层级是不是过深。
①在【Metrics Browser】中筛选【Function】或【Method】。
②添加或显示【Cyclomatic】列。
③同时查看【MaxNesting】。
④找到数值较高的函数。
⑤双击函数进入源码。
⑥检查其中的【if】【for】【while】【switch】等控制结构。
⑦如果项目采用不同的复杂度算法,进入【Project】→【Configure Project】→【Metrics】。
⑧找到【Complexity】相关设置,检查当前使用的是【Normal】【Strict】【Modified】还是其他复杂度方式。
【Strict】一类计算方式会把条件表达式里的逻辑运算考虑进去,所以同一个函数切换复杂度算法后,数值可能发生变化。做版本对比时应保持算法设置一致。
3、用Metrics Treemap找复杂代码区域
工程文件较多时,逐行看表格不够直观,可以先用Treemap定位异常区域。
①进入【Metrics】→【Metrics Treemap】。
②选择当前准备查看的代码范围。
③设置方块大小对应的度量,例如【CountLineCode】。
④再把颜色映射到【Cyclomatic】或其他复杂度指标。
⑤观察面积较大的区域,找到代码量集中的模块。
⑥再查看复杂度颜色较明显的函数或文件。
⑦点击对应节点,继续进入实体详情。
⑧回到【Metrics Browser】查看该对象的具体数值。
Treemap适合做定位,不适合直接拿颜色判断代码质量。真正要处理哪个函数,还要回到具体指标和源码结构里看。
二、Understand代码度量结果异常如何检查
度量数字明显偏大、偏小或者同一份源码换个项目结果就不一样时,先检查项目分析数据。Metrics使用的是项目数据库里的实体,如果源码没有解析完整,后面的度量也会受到影响。
1、先确认项目文件有没有漏掉
①进入【Project】→【Configure Project】。
②打开【Files】配置。
③检查主要源码目录是否都已经加入项目。
④确认.c、.cpp、.h等文件没有被错误排除。
⑤项目近期增加过新目录时,把对应目录补进文件列表。
⑥保存配置后执行【Analyze Changed Files】。
⑦改动范围较大时重新执行完整Analyze。
⑧回到【Metrics Browser】重新查看文件数和代码行数。
如果项目少分析了一个源码目录,【CountDeclFile】【CountDeclFunction】和代码行数都会一起减少,这时单独调整Metrics设置没有作用。
2、检查Missing Includes和Undefined Macros
C/C++工程中,头文件和条件编译配置不完整,对度量结果影响比较明显。
①进入【Project】→【Improve Project Accuracy】。
②打开【Missing Includes】。
③查看当前找不到的头文件。
④进入项目C++配置,把缺少的Include目录补进去。
⑤再打开【Undefined Macros】。
⑥对照原工程编译参数填写实际使用的宏和值。
⑦保存后重新Analyze项目。
⑧检查之前显示异常的函数、类和文件度量是否变化。
某段代码受宏控制时,Understand使用的宏值不同,参与分析的代码内容也会跟着变化。代码行数、函数数量和复杂度因此出现差异,并不一定是度量功能本身算错。
3、检查比较的是不是同一种指标
有时看起来像数据异常,其实是拿不同层级的指标互相比了。
①在【Metrics Browser】确认当前实体类型。
②函数层级查看【Cyclomatic】。
③文件层级查看【AvgCyclomatic】【MaxCyclomatic】或【SumCyclomatic】。
④不要把一个函数的Cyclomatic和整个文件的SumCyclomatic直接比较。
⑤检查代码行数时,区分【CountLine】和【CountLineCode】。
⑥前者会统计物理行,后者更偏向实际代码行。
⑦项目做历史对比时,确保两次导出的指标名称保持一致。
指标名称相近,但计算对象不同,结果差很多很正常。做表格统计时,把Metric ID一起保留下来会更容易核对。
三、度量配置修改后怎么确认结果正常
调整源码范围、宏或度量设置后,可以选几段容易人工核对的代码做验证,再扩大到整个工程。
1、拿单个函数做人工核对
①选择一个结构比较清楚的函数。
②在【Metrics Browser】查看它的【Cyclomatic】。
③打开对应源码。
④数一下主要判定结构,例如【if】【while】【for】和【switch】。
⑤再检查当前项目使用的复杂度算法。
⑥如果数值差异明显,确认函数里是否存在条件宏或未解析代码。
⑦修正项目配置后重新Analyze。
⑧再次查看同一函数的度量值。
2、重新导出度量结果做对照
①进入【Metrics】→【Browse Metrics】。
②选择需要保留的指标列。
③执行度量数据导出。
④保存为CSV后记录当前项目版本。
⑤配置调整后重新分析。
⑥再次导出同一组指标。
⑦对照【CountLineCode】【CountDeclFunction】【Cyclomatic】等数据变化。
命令行环境也可以使用【und metrics】生成项目度量数据。长期做版本比较时,固定同一组指标和项目配置,会比每次手工挑选不同字段更容易判断代码变化。
总结
Understand代码度量结果要和项目实际代码对应,前提是源码范围、编译条件和分析配置没有明显缺口。发现行数、函数数量或复杂度异常时,可以先从项目文件和解析状态查起,再确认使用的指标层级和计算方式。度量数据适合帮助定位值得检查的代码区域,具体是否需要调整,还要结合源码结构和项目规范判断。如需进一步了解Understand代码度量、复杂度分析与度量异常排查方法,欢迎联系咨询。