1.代码规模
- Classes(classes),类数目。
- Comment lines(comment_lines),注释行数,该指标仅包含注释或已注释代码的行数。不重要的注释行(即空注释行、只包含特殊字符的注释行等)不会增加注释行数量
- Comments (%) (comment_lines_density),注释比例,注释行数/(注释行数 + 代码行数)
官方指出该定义下: 50% 意味着所有代码都有注释。100% 意味着代码中仅仅有注释。 - Directories (directories),目录数。
- Files(files), 文件数。
- Lines(lines), 物理代码行数(包含回车)。
- Lines of code(ncloc), 代码行数,至少包含一个非空格,非tab和非注释的字母的代码行数。
- Functions(functions), 函数数量,取决于语言的不同有不同的定义。
- Projects(projects), 项目数。
- Statements(statements), 语句数。
2.重复度
- Duplicated blocks(duplicated_blocks),代码中重复块的数量。对于非Java项目,重复块指的是不同语句块之间至少有100个连续的重复tokens,对于COBOL,语句块中的指定行的数量是30,对于ABAP,语句块中指定行的数量是20,对于其他语言,语句块中指定行的数量是10。
- Duplicated files(duplicated_files),重复文件的数量。
- Duplicated lines(duplicated_lines),重复行的数量。
- Duplicated lines (%)(duplicated_lines_density),重复行的百分比。
- 计算公式为duplicated_lines/lines*100
3.覆盖率
- Condition coverage(branch_coverage),检测是否每一个含有布尔表达式的语句及其分支都被执行过。
- Condition coverage = (CT+CF)/(2*B),CT表示至少进入过"True"分支一次的条件语句数量,CF表示至少进入过"False"分支一次的条件语句数量, B是总的条件语句数量。
- Line coverage (line_coverage),检测是否每一条语句都被执行过。
- Line coverage = LC/EL, LC是执行过的语句,EL是所有可执行的语句。
- Coverage(coverage),对Condition coverage和Line coverage的综合考虑。
- Coverage = (CT + CF + LC)/(2*B + EL)。
4.复杂度
文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们, 且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试。
- 圈复杂度,复杂性根据通过代码的路径数计算的圈复杂度。每当函数的控制流分裂时,复杂性计数器就会增加1。每个函数的最小复杂度为1。这种计算方法因语言而异,因为关键字和功能会有所不同。
| Language | Notes |
|---|---|
| ABAP | 以下关键字将复杂性增加1:AND, CATCH, CONTINUE, DO, ELSEIF, IF, LOOP, LOOPAT, OR, PROVIDE, SELECT…ENDSELECT, TRY, WHEN, WHILE
|
| C/C++/Objective-C | 函数定义的复杂性增加1: while, do while, for, throw statements, switch, case, default, &&operator , ? ternary operator, catch, break, continue, goto, ... |
| COBOL | 以下命令将复杂性增加了1(除非在copybook中使用):ALSO, ALTER, AND, DEPENDING, END_OF_PAGE, ENTRY, EOP, EXCEPTION, EXIT, GOBACK, CONTINUE, IF, INVALID, OR, OVERFLOW, SIZE, STOP, TIMES, UNTIL, USE, VARYING, WHEN, EXEC CICS HANDLE, EXEC CICS LINK, EXEC CICS XCTL, EXEC CICS RETURN
|
| Java | 关键词增加复杂性: if, for, while, case, catch, throw, &&, ... |
| JavaScript, PHP | 复杂性增加1:函数(即非抽象和非匿名构造函数、函数、过程或方法),if, 短路(AKA lazy) ,逻辑连词(&&),短路 (AKA lazy),逻辑析取,三元条件表达式, 环, case , switch,throw和catch,go to (only for PHP) |
| PL/I | 以下关键字将复杂性增加一个:PROC, PROCEDURE, GOTO, GO TO, DO, IF, WHEN, !, !=, &, &= , ... |
| VB.NET | 方法或构造函数声明(子,函数)的复杂性增加1: AndAlso, Case, Continue, End, Error, Exit, If, Loop, On Error, GoTo, OrElse, Resume, Stop, Throw, Try. |
- 认知复杂度,认知复杂度的评估分数,是基下面三条基本规则:
- 忽略简写:把多句代码缩写为一句可读的代码,不改变认知复杂度;
- 对线性的代码逻辑中,出现一个打断逻辑的东西,复杂度+1;
- 当打断逻辑的是一个嵌套时,复杂度+1;
进一步说,复杂度得分是来源于以下几种不同的类型:(PS:这段比较抽象,后面有详解)
- Nesting:把一段代码逻辑嵌套在另一段逻辑中;
- Structural:被嵌套的控制流结构;
- Fundamental:不受嵌套影响的语句;
- Hybrid:一些控制流结构,但不包含在嵌套中;
然而不同类型在数学上没有区别,都只是对复杂度加一。在要计算的不同类别之间进行区分,可以更轻松地了解某一处是否适用嵌套的逻辑。
5.可靠性
- Bugs,错误问题的数量。
- 可靠性等级
- A=0个错误
- B=至少1个小错误
- C=至少1个主要缺陷
- D=至少1个严重错误
- E=至少1个阻止程序错误
- 预估修复Bug所需要的时间。测量值以分钟为单位存储在数据库中。当数值以天为单位显示时,假定为8小时一天。
6.安全性
- 漏洞,脆弱性问题的数量。
- 安全等级(安全等级)
- A=0漏洞
- B=至少1个次要漏洞
- C=至少1个主要漏洞
- D=至少1个严重漏洞
- E=至少1个阻止程序漏洞
- 预估修复所有漏洞问题。测量值以分钟为单位存储在数据库中。当数值以天为单位显示时,假定为8小时一天。
- 安全热点数量(例如执行正则表达式、加密数据或控制访问控制。此外还有涵盖了多个框架和库的规则,每条规则都解释了可能潜伏的危险,以确定代码是否易受攻击,并提供建议。)
- 安全审查评级
- 安全审查评级是基于已审查(固定或安全)安全热点百分比的字母等级。
- A=>=80
- B=>=70%和<80%
- C=>=50%和<70%
- D=>=30%和<50%
- E=<30%
- 已审核安全热点,已审核(固定或安全)安全热点的百分比。
- 比率公式:已审核(固定或安全)热点数量x 100/(To_审核热点+已审核热点)
7. 代码审查
代码规范应遵循的编码标准或实践。 不遵守代码规范会导致代码异味警告。
-
Sonar本身基于各语言设计了代码规范
-
Sonar基于不同语言可以引入第三方的代码风格审查工具,例如:
java:SpotBugs, FindBugs, FindSecBugs, PMD, Checkstyle
Apex:PMD Apex
Sonar可针对语言设计自定义的规则
8.语言支持:
- 主流语言支持
python
粒度支持版本,例如:sonar.python.version=3.7
Java
粒度支持版本,例如:sonar.java.source=1.6
C/C++/Objective-C
全版本支持
html
粒度支持版本,默认由php分析器支持,例如.php, .php3, .php4, .php5, .phtml
- 其他支持语言:
ABAP
Apex
C#
COBOL
Flex
Go
JavaScript/TypeScript/CSS
Kotlin
PHP
PLI
PL/SQL
RPG
Ruby
Scala
Swift
T-SQL
VB.NET
VB6
XML
SonarQube可以根据您的版本分析多达27种不同的语言。该分析的结果将是质量度量和问题(编码规则被破坏的情况)。但是所分析的内容将因语言而异:
-
在所有语言上,blame数据将自动从支持的SCM提供程序导入。自动支持Git和SVN。其他提供商需要额外的插件。
-
在所有语言上,都会执行源代码的静态分析(Java文件、COBOL程序等)
-
可以对某些语言(Java中的类文件、C#中的dll文件等)执行编译代码的静态分析
-
默认情况下,在分析期间,只有SonarQube版本识别的文件才会加载到项目中。












网友评论