cqfn/aibolit
GitHub: cqfn/aibolit
基于机器学习的 Java 静态分析器,识别反模式并提供重构建议。
Stars: 98 | Forks: 38
# 基于 ML 的 Java 静态分析器

[](https://pypi.org/project/aibolit/)
[](https://github.com/cqfn/aibolit/actions/workflows/make.yml)
[](https://hitsofcode.com/view/github/cqfn/aibolit)
[](https://codecov.io/github/cqfn/aibolit?branch=master)
[](https://codeclimate.com/github/cqfn/aibolit/maintainability)
[](https://github.com/cqfn/aibolit/blob/master/LICENSE.txt)
请阅读我们的 [白皮书] 了解 Aibolit 的工作原理。
首先,您需要安装它(必须已安装
[Python 3.11+](https://www.python.org/downloads/)
和 [Pip](https://pip.pypa.io/en/stable/installing/)):
```
pip3 install aibolit~=1.3.0
```
要在 Docker 中运行最新版本:
```
docker run --rm -it \
-v :/in \
yegor256/aibolit-image recommend --folder /in --format compact
```
要分析位于 `src/java`(例如)的 Java 源代码,运行:
```
aibolit recommend --filenames src/java/File.java src/java/AnotherFile.java
```
您也可以设置包含 Java 文件的文件夹:
```
aibolit recommend --folder src/java
```
它将运行模型(模型位于
[aibolit/binary_files/model.pkl][model])
中的推荐函数。
该模型会找到对圈复杂度贡献最大的模式。
如果找到任何内容,您将看到所有提及模式的建议。
您可以在
[Patterns.md](https://github.com/cqfn/aibolit/blob/master/PATTERNS.md)
中查看所有模式的列表。
推荐结果将重定向到标准输出。
如果程序的退出代码为 `0`,则表示所有分析的文件
没有问题。
如果程序的退出代码为 `1`,则表示至少 1 个分析的文件
存在问题。
如果程序的退出代码为 `2`,则表示程序发生崩溃。
您可以抑制某些模式(逗号分隔值),它们将被
忽略。它们不会包含在报告中,其重要性将被设为 0。
```
aibolit recommend --folder src/java --suppress=P12,P13
```
您可以使用 `--format` 参数更改格式。默认值为
`--format=compact`。
```
aibolit recommend --folder src/java --format=compact --full
```
它将按重要性降序排列模式,并按模式名称分组:
```
Show all patterns
Configuration.java score: 127.67642529949538
Configuration.java[3840]: Var in the middle (P21: 30.95612931128819 1/4)
Configuration.java[3844]: Var in the middle (P21: 30.95612931128819 1/4)
Configuration.java[3848]: Var in the middle (P21: 30.95612931128819 1/4)
Configuration.java[2411]: Null Assignment (P28: 10.76 2/4)
Configuration.java[826]: Many primary constructors (P9: 10.76 3/4)
Configuration.java[840]: Many primary constructors (P9: 10.76 3/4)
Configuration.java[829]: Partial synchronized (P14: 0.228 4/4)
Configuration.java[841]: Partial synchronized (P14: 0.228 4/4)
Configuration.java[865]: Partial synchronized (P14: 0.228 4/4)
Configuration.java[2586]: Partial synchronized (P14: 0.228 4/4)
Configuration.java[3230]: Partial synchronized (P14: 0.228 4/4)
Configuration.java[3261]: Partial synchronized (P14: 0.228 4/4)
Configuration.java[3727]: Partial synchronized (P14: 0.228 4/4)
Configuration.java[3956]: Partial synchronized (P14: 0.228 4/4)
ErrorExample.java: error when calculating patterns: Can't count P1 metric:
Total score: 127.67642529949538
```
`(P21: 30.95612931128819 1/4)` 表示如下内容:
```
30.95612931128819 is the score of this pattern
1 is the position of this pattern in the total list of patterns
found in the file 4 is the total number of found patterns
```
您可以使用 `format=long`。在这种情况下,所有结果将按行号排序:
```
Show all patterns
Configuration.java: some issues found
Configuration.java score: 127.67642529949538
Configuration.java[826]: Many primary constructors (P9: 10.76 3/4)
Configuration.java[829]: Partial synchronized (P14: 0.228 4/4)
Configuration.java[840]: Many primary constructors (P9: 10.76 3/4)
Configuration.java[841]: Partial synchronized (P14: 0.228 4/4)
Configuration.java[865]: Partial synchronized (P14: 0.228 4/4)
Configuration.java[2411]: Null Assignment (P28: 10.76 2/4)
Configuration.java[2586]: Partial synchronized (P14: 0.228 4/4)
Configuration.java[3230]: Partial synchronized (P14: 0.228 4/4)
Configuration.java[3261]: Partial synchronized (P14: 0.228 4/4)
Configuration.java[3727]: Partial synchronized (P14: 0.228 4/4)
Configuration.java[3840]: Var in the middle (P21: 30.95612931128819 1/4)
Configuration.java[3844]: Var in the middle (P21: 30.95612931128819 1/4)
Configuration.java[3848]: Var in the middle (P21: 30.95612931128819 1/4)
Configuration.java[3956]: Partial synchronized (P14: 0.228 4/4)
ErrorExample.java: error when calculating patterns: Can't count P1 metric:
MavenSlice.java: your code is perfect in aibolit's opinion
Total score: 127.67642529949538
```
您也可以选择 xml 格式。它将具有与 `compact` 模式相同的格式,但会创建 xml 文件:
```
127.67642529949538
Configuration.java
Some issues found
127.67642529949538
294
391
30.95612931128819
1/4
235
10.76
2/4
235
2.056
3/4
2411
0.228
4/4
ErrorExample.java
Error when calculating patterns: Can't count P1 metric:
MavenSlice.java
Your code is perfect in aibolit's opinion
```
分数是模式的相对重要性(没有范围)。
分数越高,模式越重要。
例如,如果您有多个模式,首先需要修复分数为 5.45 的模式:
```
SampleTests.java[43]: Non final attribute (P12: 5.45 1/10)
SampleTests.java[44]: Non final attribute (P12: 5.45 1/10)
SampleTests.java[80]: Var in the middle (P21: 3.71 2/10)
SampleTests.java[121]: Var in the middle (P21: 3.71 2/10)
SampleTests.java[122]: Var declaration distance for 5 lines (P20_5: 2.13 3/10)
SampleTests.java[41]: Non final class (P24: 1.95 4/10)
SampleTests.java[59]: Force Type Casting (P5: 1.45 5/10)
SampleTests.java[122]: Var declaration distance for 7 lines (P20_7: 1.07 6/10)
SampleTests.java[122]: Var declaration distance for 11 lines (P20_11: 0.78 7/10)
SampleTests.java[51]: Protected Method (P30: 0.60 8/10)
SampleTests.java[52]: Super Method (P18: 0.35 9/10)
SampleTests.java[100]: Partial synchronized (P14: 0.08 10/10)
SampleTests.java[106]: Partial synchronized (P14: 0.08 10/10)
SampleTests.java[113]: Partial synchronized (P14: 0.08 10/10)
```
每个类的分数是所有模式分数的总和。
总分是项目(您设置分析的文件夹)中所有 Java 文件的平均值
```
SampleTests.java score: 17.54698560768407
```
如果您有 2 个不同项目的分数,较差的项目是那个分数最高的项目。
模型会随着 *aibolit* 包自动安装,但您也可以尝试使用自己的模型
```
aibolit recommend --folder src/java --model /mnt/d/some_folder/model.pkl
```
您可以使用 `--full` 命令获取完整报告,这样所有模式都会包含在输出中:
```
aibolit recommend --folder src/java --full
```
您可以使用 `--exclude` 命令排除文件。
您需要设置要忽略的 glob 模式:
```
aibolit recommend --folder src/java \
--exclude=**/*Test*.java --exclude=**/*Impl*.java
```
如果需要帮助,请运行
```
aibolit recommend --help
```
## 如何重新训练它?
`Train` 命令执行以下操作:
* 计算模式和指标
* 创建数据集
* 训练模型并保存
Train 仅在克隆的 git 仓库中工作。
1. 克隆 aibolit 仓库
2. 进入 `cloned_aibolit_path`
3. 运行 `pip install .`
4. 设置环境变量 `export HOME_AIBOLIT=cloned_aibolit_path`(例如
Linux)。
5. 如果需要将数据集文件保存到其他目录,请设置环境变量 `TARGET_FOLDER`。
6. 您必须指定训练和测试数据集:设置 `HOME_TRAIN_DATASET`
环境变量用于训练数据集,`HOME_TEST_DATASET` 环境变量用于测试数据集。
通常,这些文件位于 `scripts/target/08` 目录中(数据集收集后
如果未跳过)。
但您可以使用自己的数据集。
请注意,如果设置了 `TARGET_FOLDER`,数据集文件将位于
`TARGET_FOLDER/target` 中。
因此,需要设置
HOME_TRAIN_DATASET=`TARGET_FOLDER`\target\08\08-train.csv,
HOME_TEST_DATASET =`TARGET_FOLDER`\target\08\08-test.csv
7. 如果需要设置模型保存目录,请设置 `SAVE_MODEL_FOLDER`
环境变量。否则模型将保存到
`cloned_aibolit_path/aibolit/binary_files/model.pkl`
8. 如果需要设置包含 Java 文件的文件夹,请使用 `--java_folder
` 参数,默认值为 `scripts/target/01`(aibolit 克隆仓库)
或者您可以使用我们的 [docker 镜像](https://hub.docker.com/r/yegor256/aibolit-image)
运行训练流水线:
```
aibolit train --java_folder=src/java [--max_classes=100] [--dataset_file]
```
如果需要将包含所有计算指标的数据集保存到其他目录,请使用 `dataset_file` 参数
```
aibolit train --java_folder=src/java --dataset_file /mnt/d/new_dir/dataset.csv
```
您可以使用 `skip_collect_dataset` 参数跳过数据集收集。在这种情况下
模型将使用预定义的数据集进行训练(参见第 5 点):
```
aibolit train --java_folder=src/java --skip_collect_dataset
```
如果一切正常,请提交
[拉取请求](https://www.yegor256.com/2014/04/15/github-guidelines.html)。
使用 Docker 推荐流水线
```
docker run --rm -it \
-v :/in \
-v :/out \
yegor256/aibolit-image
```
Null check
Non final attribute
Var in the middle
Null Assignment
标签:Aibolit, Apex, Docker, Java静态分析, PyPI, Python机器学习, SOC Prime, 云安全监控, 代码健康度, 代码审查, 代码异味, 代码异味检测, 代码维护, 反模式, 圈复杂度, 域名枚举, 复杂度分析, 安全防御评估, 开发工具, 开源静态分析工具, 技术债务, 机器学习, 自动化重构, 请求拦截, 逆向工具, 重构推荐, 静态分析