cqfn/aibolit

GitHub: cqfn/aibolit

基于机器学习的 Java 静态分析器,识别反模式并提供重构建议。

Stars: 98 | Forks: 38

# 基于 ML 的 Java 静态分析器 ![Docker Image Version](https://img.shields.io/docker/v/yegor256/aibolit-image) [![PyPi version](https://img.shields.io/pypi/v/aibolit.svg)](https://pypi.org/project/aibolit/) [![make](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/30d45701d0002529.svg)](https://github.com/cqfn/aibolit/actions/workflows/make.yml) [![Hits-of-Code](https://hitsofcode.com/github/cqfn/aibolit)](https://hitsofcode.com/view/github/cqfn/aibolit) [![Test Coverage](https://img.shields.io/codecov/c/github/cqfn/aibolit.svg)](https://codecov.io/github/cqfn/aibolit?branch=master) [![Maintainability](https://api.codeclimate.com/v1/badges/fd7e32d8472b4d5e8ecb/maintainability)](https://codeclimate.com/github/cqfn/aibolit/maintainability) [![License](https://img.shields.io/badge/license-MIT-green.svg)](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
Null check
294 391 30.95612931128819 1/4
Non final attribute
235 10.76 2/4
Var in the middle
235 2.056 3/4
Null Assignment
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 ```
标签:Aibolit, Apex, Docker, Java静态分析, PyPI, Python机器学习, SOC Prime, 云安全监控, 代码健康度, 代码审查, 代码异味, 代码异味检测, 代码维护, 反模式, 圈复杂度, 域名枚举, 复杂度分析, 安全防御评估, 开发工具, 开源静态分析工具, 技术债务, 机器学习, 自动化重构, 请求拦截, 逆向工具, 重构推荐, 静态分析