美文网首页js css html
Sonar代码审查工具简析

Sonar代码审查工具简析

作者: 晓柒NLP与药物设计 | 来源:发表于2022-07-15 11:48 被阅读0次

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),逻辑析取,三元条件表达式, 环, caseswitchthrowcatchgo 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. 忽略简写:把多句代码缩写为一句可读的代码,不改变认知复杂度;
  2. 对线性的代码逻辑中,出现一个打断逻辑的东西,复杂度+1;
  3. 当打断逻辑的是一个嵌套时,复杂度+1;

进一步说,复杂度得分是来源于以下几种不同的类型:(PS:这段比较抽象,后面有详解)

  1. Nesting:把一段代码逻辑嵌套在另一段逻辑中;
  2. Structural:被嵌套的控制流结构;
  3. Fundamental:不受嵌套影响的语句;
  4. 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版本识别的文件才会加载到项目中。

相关文章

  • Sonar代码审查工具简析

    1.代码规模 Classes(classes),类数目。 Comment lines(comment_lines)...

  • Sonar入门学习

    1. 什么是Sonar? Sonar的全称是SonarQube,是一种自动代码审查工具,用于检测代码中的错误,漏洞...

  • sonar代码审查-软件环境

    sonar代码审查 环境 mysql 5.7 jdk 1.8 SonarQube(sonar sever) 5.5...

  • 使用Sonar进行项目代码扫描

    前言 Sonar qube是一款市面上使用较为广泛的代码审查工具,支持20+ 种编程语言,经过Sonar scan...

  • SonarQube

    简介 Sonar 是一个用于代码质量管理的开放平台。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具...

  • 使用 Sonar 进行代码质量管理

    Sonar 是一个开源的代码质量管理平台。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续...

  • 初识Sonar——代码质量管理平台

    Sonar介绍 Sonar是一个用于代码质量管理的开放平台。 通过插件机制,可以集成不同的测试工具、代码分析工具等...

  • sonar代码审查问题总结

    主要问题列表:

  • 了解sonarqube

    一、sonar简介 sonar是一款静态代码质量分析工具,支持Java、Python、PHP、JavaScript...

  • iOS Sonar 集成

    1.Sonar介绍 Sonar 是一个用于代码质量管理的开放平台。通过插件机制,Sonar 可以集成不同的测试工具...

网友评论

    本文标题:Sonar代码审查工具简析

    本文链接:https://www.haomeiwen.com/subject/xygqirtx.html