我们做了一款静态代码分析程序

大家好,我是王有志,一个分享硬核 Java 技术的金融摸鱼侠。本文首发于微信公众号王有志

各位小伙伴,好久不见啊,我王有志又回来了!今天开始我会回归到正常的更新节奏中,当下的计划是对之前的文章做一些修改和勘误,直到找到新的分享主题为止。

不过今天我先向大家汇报下最近的工作成果,就是之前在公众号中提到过的,和朋友一起搞的用于分析程序不同分支之间的改动,并基于改动生成方法调用链路的程序,我们叫它静态代码分析(CodeAnalysis,简称 CA)。

目前我们已经实现了核心功能,已经可以简单的使用了,所以先将 CA 开源出来(项目地址:https://gitee.com/wyz-A2/CodeAnalysis),欢迎大家批评指正,提出宝贵意见。

免责声明

CA 是我们利用业余时间做的,没有进行过完整的测试和验证,程序中难免会存在着一些不完善的地方和 BUG.,遇到这类情况大家可以提 issue。需要注意,由于 CA 分析的是源码,所以提 issue 时不要泄漏生产环境的源代码。

另外,由于本人水平和精力有限,程序中难免会有设计不合理,实现不够优秀的地方,欢迎大家基于项目本身提出自己的想法和不同的见解,互相交流学习

最后,CA 处于早期版本,无法做到面面俱到,目前仅能够支持分析通过 Git 进行版本控制,基于 Maven 构建的 Java 项目

CA 是如何诞生的

最初,和朋友聊天的时候提到,我们的“屎山”终于要重构了,但是由于经年累月的积累和人员的变动,公司内部已经没有人能够摸透“屎山”的脉络了,这给我们在分析项目时带来了极大的困扰,如果能够通过系统自动分析接口中方法的调用链路就好了。

朋友也提到,他们最近出现了很多因代码改动分析不足导致的问题,举个例子,假如方法 A,方法 B,方法 C 都调用了方法 D,这次修改了方法 D,但是由于分析不充分,只分析到了方法 D 对方法 A 和方法 B 的影响,忽略了方法 C,这可能会导致方法 C 执行异常,对于这种场景,通过人去保障是不可靠的,如果能够通过系统去分析就好了。

针对于上述两种场景,我们提出了一个想法,利用系统去分析项目中方法的调用链路。在我们的设想中,这个系统应该具备两个核心功能:

  • 根据分支间的差异,解析到本次修改的方法,并分析出方法的调用链路;
  • 通过指定类型和方法,分析该类型中的指定方法,在程序中的调用链路。

我们先尝试着搜索了网上已经开源的项目,确实发现了几款类似的开源工具,但整体看下来不太能够满足我们的需求,于是我们决定自己做一个。

CA 的定位与能力

在我们的设想中,CA 应该是作为公司 DevoOps 自动化流程中的一环,能够在开发前由开发人员制定方法分析方法的调用链路以确定程序修改的影响范围,在 Code Revie 环节和 QA 环节前,系统自动分析修程序修改后所影响的方法调用链路,辅助 Code Review 环节以及验证测试案例的覆盖是否全面。

明确了 CA 的定位后,我们开始思考 CA 应该具备哪些能力。不同的公司在技术栈的应用上会有所差异,最基础的如版本控制软件的选择上,互联网企业中最主流的应该就是 Git 了,但 SVN 在传统企业中占比也不少;另外,在编程语言上,虽然我们的主要业务都是跑在 Java 上的,但是我也需要写一些 Python 处理数据,公司其它的门也有其它语言的应用。

因此,在我们的设想中,CA 应该要能够支持多种版本控制软件,多种编程语言,多种项目构建方式。基于我们设想的 CA 的定位与能力,我们又提出了一些要求:

  • 不侵入业务系统,CA 作为代码分析工具,它不应该侵入到业务系统中
  • 自动执行,能够支持多种项目管理工具,并集成到项目管理的流程中
  • 多种结果输出形式,能够支持不同的结果输出形式,如,文本,思维导图等形式

因为 CA 不涉及到实际业务,仅仅只是 DevoOps 中的一环,所以对性能的要求非常宽松,甚至可以说是没有性能要求,我们只需要保证 CA 别太“慢”就好了。

当我们基于上述的定位与能力对 CA 进行设计时,我们发现我们把 CA 想的太“大”了,因为要支持各种各样的场景,所以在设计环节要考量的东西非常多了,导致我们的开发进度非常缓慢且痛苦。这也给了我们一个警醒,当实力与“野心”不匹配的时候,步子迈太大,容易扯着蛋~~

不过,在经历了各种痛苦的挣扎后,CA 已经初具雏形了,也算是能够拿出来献丑了。目前 CA 能够支持使用 Git 进行版本控制的,通过 Maven 构建的 Java 程序的两个分支间的差异分析,并生成类似于 Maven 解析依赖树的文字描述版的方法调用链路,如下图所示:

Tips: 关于各种字符的含义,我会在下文中详细解释。

CA 要如何使用

CA 的使用非常简单,只需要安装一些常用的软件,做一些简单的数据库配置,并调用接口即可,下面我们就一步一步的来配置并使用 CA。

关于软件部分,CA 目前依赖 Git,Maven 和 Java,CA 自身使用 Java 17 进行开发,使用 Maven 进行构建,除了 CA 自身使用的软件外,还需要根据待分析项目的软件环境安装对应的软件,例如,使用 CA 分析基于 Java 8 开发的项目,就需要额外安装 Java 8。不过这些基本上是每个 Java 开发者必备的软件了,因此我这里默认你已经具备了使用 CA 的基本软件环境了。

数据库配置

首先进行数据库配置,CA 使用的数据库是 MySQL,因为 SQL 语句非常简单,也没有使用高级特性,所以无论是 5.X 版本还是 8.X 版本都能够使用。目前 CA 依赖了 3 张表(未来会拓展输出形式,会额外添加相关的配置表),分别是:项目配置表,版本控制配置表,编译工具表。

项目配置表

用于配置项目的基本信息,建表 SQL 语句如下:

create table project_config (
    project_id           varchar(50)  not null primary key,
    project_name         varchar(50)  not null comment '项目名称',
    project_language     varchar(50)  null comment '项目使用的语言',
    language_version     varchar(50)  null comment '语言版本',
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术范王有志

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值