值得推荐的五种自动化代码审查工具

【51CTO.com快译】众所周知,代码审查不但可以提高代码库的质量,而且能够避免开发人员将程序中的错误和问题传递给其他团队成员。不过,手动执行代码审查既费时又费力。这就是为什么许多开发团队会使用自动化工具,来完成此项工作的原因。

通过自动化流程,此类代码审查工具可以提高代码的质量,节省宝贵的开发时间,并且让开发人员更专注于构建应用,而不必反复地检查代码。此外,作为静态分析和单元测试框架,自动化代码审查工具不但能够满足业务所需的速度和敏捷性,还可以提供更快的反馈、更好的代码质量、以及更少的产品转化时间。

通过长时间的迭代,目前自动化的代码审查工具不但高效、准确,而且可以实现自定义。下面,我将和您一起探讨目前五种优秀的自动化代码审查工具,并且通过对比每一种工具的优缺点,以方便您在实际项目中做出适合的选择。

CodeBeat是一种流行的代码审查工具,它可以提供自动化的代码审查与反馈。在从1到4级的通用等级代码审查标准中,它属于第4级工具。CodeBeat支持诸如Python、Ruby、Java、Javascript、Golang、以及Swift等多种语言。

通过提供团队管理工具,CodeBeat可以轻松地分析代码,并在团队中出现开发人员调整时,保持代码的一致性。由于能够与Github、Gitlab、Bitbucket、Slack和Hipchat等许多流行工具相集成,因此开发人员和软件团队都可以在项目中协同使用CodeBeat。

CodeBeat的优势包括:

  • 提供带有项目审查的集成式仪表板
  • 可对发现的问题按照复杂性、重复性、以及代码层面的分类
  • 提供对于目标项目中的电子邮件地址更新,并能持续检查拉取请求的代码质量
  • 提供及时的反馈,并能以“快赢(quick wins)”的方式,来提高代码库的质量
  • 所需的设置最少,并易于集成与使用

CodeBeat的缺点包括:

  • 缺乏安全性分析
  • 缺乏对开源工具和linter工具的支持

总的说来,CodeBeat不但完全免费开源,而且能够为大型团队提供企业级支持,以识别那些复杂、且可能重复的代码。

DeepSource可以针对各种流行的通用编程语言,提供自动化的代码分析。目前,它能够支持Python、Javascript、Golang、Ruby、以及Java等语言。凭借着单文件配置,DeepSource能够让针对每一次提交和拉取请求的持续分析,变得更加容易。

DeepSource可以检查各种性能问题、类型问题、样式问题、文档问题、缺陷风险、以及各种反模式。通过明确定义待现实的目标,它可以让开发人员和维护人员管理其代码库,并简化代码的审查过程。

DeepSource的优势包括:

  • 单文件配置,可用于自动化代码分析
  • 可与Travis CI和Circle CI等持续集成管道相整合
  • 支持black、rubocop和gofmt等代码格式化程序
  • 提供横跨代码库的常见问题自动化修复
  • 提供针对每个问题和拉取式请求的分析

DeepSource的缺点包括:

  • 缺乏针对PHP、C++和Rust的支持
  • 缺乏对于Azure DevOps的支持

总的说来,DeepSource不但完全免费开源,而且能够为大型团队提供企业级支持。其分析器不但可以工作在文件级和存储库级,并且能够提供比其他分析器和代码查看工具更低的误报率。

CodeClimate旨在通过提供从提交到部署(commit-to-deploy)的可见性,以提高团队的工作效率。其工程智能化(Engineering Intelligence)可以在“速度”上简化持续交付;并在“质量”上为每一个提交和提取式请求,提供自动化的代码审查。

CodeClimate可以根据各种参数(包括代码重复率、代码风格等),提供从A到F的可维护性评分等级,并能够方便用户根据测试覆盖率、或技术债的变化,来确定瓶颈与发展趋势。

CodeClimate的优势包括:

  • 能够借助自动化的Git更新,来简化安装
  • 在代码库中识别出各个“热点”,以标记需要重构的部分
  • 通过提供安全仪表板,来识别应用程序中的漏洞
  • 提供可在本地用于自动化代码审查的API
  • 可通过邮件和RSS反馈,来提供警报和实例的通知
  • 能与VS Code和Atom等集成开发环境(IDE)相整合
  • 可通过名为“cc-test-reporter”的软件库,来测试覆盖率

CodeClimate的缺点包括:

  • 缺乏对于问题的描述、搜索、以及过滤
  • 缺乏可定制能力,且售价较高
  • 由于无法提供用于识别核心复杂性(例如文件长度和复杂度)的规则,因此其误报率比较高

Codacy是个人开发者和软件开发团队最常用的自动化代码审查工具之一。它能够支持包括Python、Java、Javascript、C/C++、Ruby、以及Golang在内的各种通用编程语言。Codacy可以对代码的复杂性、易错点(error-prone)、安全性、代码样式、兼容性、文档和性能等问题进行审查。

Codacy的优势包括:

  • 通过最小化安装,来实现自动化的代码检查
  • 能够与包括GitHub、GitLab、GitHub Actions、CircleCI等服务相集成
  • 通过协助定义项目的特定目标,来提供实现目标的建议
  • 可分析拉取式请求、以及单独的提交
  • 可通过滤除各种“噪点”和重复性,来专注于新出现的问题
  • 提供了易用且直观的用户界面,可协助开发人员轻松地管理其代码
  • 允许开发人员保存完整的代码质量,以及对代码的纯净度进行审查

Codacy的缺点包括:

  • 缺乏对于问题的搜索能力(个别过滤器除外)
  • 缺乏对于导出代码模式提供支持

Veracode可被用于代码审查、自动化测试、以及提高代码库的效率。它支持包括Python、Java、Javascript、以及Golang在内的多种通用编程语言。Veracode能够提供两种代码检查工具:静态分析和软件组成分析。其中,静态分析工具可以方便开发人员找到各种错误和反模式,并在代码投入生产环境之前进行修复。而软件组成分析则可以在代码库中,使用第三方程序包来识别漏洞。

Veracode的优势包括:

  • 易于配置和快速上手
  • 提供二进制扫描,以减少对于代码的误报
  • 可指出代码中的真实漏洞,并提出解决方案
  • 提供可自定义的仪表板,并带有直观、友好的用户界面

Veracode的缺点包括:

  • 缺乏可定制的分析规则
  • 用户使用体验欠佳

总的说来,由Veracode提供的代码分析平台可方便开发人员查看、分析和修复代码中的安全漏洞。同时,通过与SDLC的集成,Veracode还可以协助开发人员验证目标代码是否符合OWASP Top 10,以及其他实践标准。

原文标题:Automated Code Review Tools for Developers in 2021,作者: Saif Sadiq

GaussDB技术解读系列之SQL Audit,面向应用开发的SQL审核工具

本文分享自华为云社区《​》​​,作者:华为云数据库和应用迁移专家。

我们先从一个SQL语句说起(以某传统单机数据库为例)。

也许这就是我们业务代码中潜藏的一个SQL语句,对于一个普通开发者来说,这个语句编写工整,逻辑清晰,没有什么问题,可以直接推到代码仓中交付上线。但是一个有经验的开发者或数据库管理员可能会发现这个SQL存在诸多的优化点:

  • 两张表的id字段是否有索引?
  • like语句不符合最左匹配原则,能否改写?
  • test_1表where条件中的create_time判断不符合单边原则,无法走索引,可以改写;
  • union会对结果集去除,效率较低,能否换成union all?
  • test_2表的id字段被函数引用,也可能用不上索引,可以优化;
  • test_2表是否存在id和name联合索引,能否加hint,指定特定索引提高查询性能?

貌似经过上述的分析后,这个SQL可以焕然一新,在该数据库上飞一样地跑起来,但这就完了吗?其实并没有,在单机数据库上也许已经优化到了极致,可当我们的数据库是一个分布式数据库呢?它可能又会带来新的性能问题,我们要考虑where条件中的id是否是分布键,concat函数是否会影响算子的下推……这一系列的问题都会产生。

这实际就是我们所面临的现状,开发者的技术能力良莠不齐,DBA对数据库知识的局限性导致烂SQL无处不在,而且随着数据库的不断变更或演进,一些好的SQL也可能逐步变成需要优化的烂SQL, 我们要时刻不断地找寻它们的踪迹。

华为内部有很多业务部门,对传统单机数据库、MySQL、PostgreSQL等各种数据库都有深度的使用,也一直备受烂SQL的困扰,随着GaussDB在内部业务系统的规模应用,现存SQL在GaussDB中能否高质量运行也面临挑战,于是我们开发了SQL Audit工具,根据公司内部各业务部门多年积累的SQL开发规范和GaussDB数据库的优秀实践,整理出SQL审核规则上百条,对命名规范、表结构/索引设计、SQL性能优化、分布键及算子下推等常见影响SQL质量的问题都可以做深入的分析和审核,同时我们又开发了一些插件,直接集成到开发的流水线中,自动从代码仓获取SQL语句,做到一键审核。

SQL审核的核心流程可以分为以下三个阶段:

SQL获取:即我们能从哪些渠道获取到需要审核的SQL, 获取能力决定了我们能否对开发中的代码做更全面的审核;

SQL语法解析:是针对具体的每一条SQL做语法树的生成和分析;

SQL规则审核:是拆解SQL语句的每一部分,和相关审核规则项逐一做匹配,找出待优化或风险点,最终形成审核报告。

客户通过SQL访问数据库的渠道多种多样,客户端工具、命令行、SQL脚本、应用代码……

代码开发又可以采用JDBC、ODBC、底层API调用等各种方式,SQL语句既可以直接在代码中拼接,也可以通过配置文件(如:Mybatis),还可以通过ORM框架(如:Hibernate )访问数据库,所以如果想要获取到客户的全部SQL是一件非常困难的事情。

SQL Audit对当前大部分SQL使用场景进行了支持,而且还在持续扩大SQL能获取的范围,力求能够全面地将客户使用的所有SQL全部审核到,下图是当前SQL Audit工具支持的SQL获取范围。

  • 手动输入

手动输入为客户提供了一个简单、易操作的平台,客户可以随时把自己编写的SQL语句输入到SQL Audit工具中进行审核,根据审核结果直接对语句做调整,同时也可以将一个.sql文件整体上传上来,进行批量的审核。

  • 源代码

源代码是烂SQL最主要的来源,但因其编程语言多种多样(C/C++/JAVA/GO/PYTHON/SHELL……),编写方式也千奇百怪,所以很难将每种场景的SQL都获取完整,我们将代码中的SQL分成了三类:

1) 源码拼接SQL

通过拼接的方式生成SQL语句,拼接的过程可能会引入很多变量,这种情况无法获取到完整的SQL,所以通过静态文件提取SQL的方式会有很大缺陷,SQL Audit工具支持对Java代码做语法解析,提取里面的SQL,对于其他语言的代码目前暂不支持。

2) 无SQL的ORM框架

例如Hibernate、SQLAlchemy等这些ORM框架无法从代码中获取到SQL语句,SQLAudit工具提供了基于Java二进制改写技术,在JVM运行时动态监听JDBC API,获取SQL语句。

3) 配置SQL的ORM

很多业务系统基于Mybatis框架搭建访问数据库的能力,Mybatis通过注解或配置文件的方式编写SQL语句,SQL Audit工具能够对Mybatis的注解和配置文件进行深度解析,提取SQL成功率达99%以上。

  • 数据库对象

数据库表结构、索引、约束的设计以及存储过程、函数等PL/SQL的编写对数据库的性能起决定性作用,SQL Audit工具可以连接到数据库,获取数据库中的全部对象定义,从设计的规范性(如:命名规范、长度/大小写限制)、合理性(如:索引是否合理)和性能等方面进行考量,给出审核建议。

  • 数据库日志

为了更全面地获取到发生在数据库的SQL语句,从数据库本身的日志层面着手也是一个比较可行的方案,解析数据库的redo、开启数据库审计日志、查询SQL缓存区等方式都能够有效获取到运行SQL,SQL Audit工具也支持通过数据库日志获取SQL语句的能力。

  • 流量抓取

为了解决从源代码中无法获取全部SQL的问题,我们开发了基于流量抓取的SQL审核能力,它能极大提升对SQL获取的完整度。IP+端口作为数据库对外的统一入口,基本可以包含客户业务和运维所产生的全部SQL语句,通过对数据库服务器端口的旁路监听,获取到网络协议包,经过对数据库网络协议解析和重复SQL过滤,得到有效的SQL语句,最后将这些SQL传入SQL Audit工具进行审核。

SQL解析的过程就是将SQL语句按照语法规则解析成语法树的过程,一般的解析过程分为词法解析和语法解析,然后生成语法树,大部分对SQL语句分析的工具都是直接遍历语法树实现的,SQL Audit工具没有直接解析语法树,而是增加了一个处理过程,将语法树解析成Java描述类,后面所有的审核规则都是基于这个语法描述类进行,这样大大提高对审核规则的开发效率,同时降低了开发难度。

  • 丰富的审核规则

审核的核心是审核规则,而审核规则的核心是对数据库的理解+对客户业务开发理解的实践经验总结,我们结合GaussDB数据库的最佳实践+公司内外部客户的实际使用场景,整理出审核规则数百条,目前产品中已支持规则78条,包含了SQL开发过程中常见的规范和性能问题,后续会有更多的规则持续丰富到产品中。

SQL Audit同时提供了模板配置功能,客户可以根据自身业务场景灵活地选择需要审核的规则。

  • 深度审核

SQL Audit审核流程如下图所示:

当一个SQL输入到SQL Audit中后,首先会对SQL进行语法解析,然后根据SQL中所依赖的表、视图等对象,去数据库中获取元数据信息(列信息、索引信息等),如果这个SQL语句的性能可能受执行计划的影响,则会再从数据库中获取该语句的执行计划,综合上述全部信息,逐一匹配每一个相关的规则进行审核,最终输出全部违反规则项。

华为云内部某系统有一部分的业务代码是基于JAVA的Mybatis框架开发,在将数据库替换到GaussDB的过程中有大量的SQL做了兼容性改造,为保证改造后的SQL能够高质量地在GaussDB数据库中运行,该系统通过SQL Audit工具对整个代码仓进行全面审核,同时在流水线中部署了SQL Audit审核插件,持续对增量代码进行看护。SQL Audit发现了大量的不规范和低性能的SQL,提前规避了风险SQL流入到生产环境,开发人员根据SQL Audit的审核报告对代码进行了优化,业务切换到GaussDB后持续稳定运行。

以其中一个任务为例,该任务涉及SQL总数有1881个,审核出有问题的SQL有300多个。

审核结果统计报告

审核问题SQL详情

GaussDB在打造内核竞争力的同时,希望给客户提供全流程、全链路,面向开发和运维的数据库自动驾驶体验。今年我们发布的SQL自动审核工具,在开发环节帮助客户写好SQL,拒绝烂SQL。

未来,我们还将进一步支持对PL/SQL审核的支持,比如存储过程、函数、触发器、包等的审核,以及与AI大模型的结合,大模型在SQL语言的处理上已经做得很好,SQL Audit工具会和华为的盘古大模型进行对接,通过大模型的能力增强它的审核、优化和改写能力。

​​关注 点击下方,第一时间了解华为云新鲜技术~​

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。