arkanjo-tool/arkanjo
GitHub: arkanjo-tool/arkanjo
一款基于 Tree-sitter 和相似度算法的 CLI 工具,用于在代码库中检测函数级别的重复代码并生成分类报告。
Stars: 3 | Forks: 3
**ArKanjo** 是一款 CLI 工具,旨在帮助开发人员在
其代码库中查找代码重复,特别是针对函数范围内的重复。
该工具目前的功能包括:
- 探索代码库中的代码重复,为用户提供数量有限的过滤器。
- 查找用户指定函数的所有重复函数。
- 创建一份报告,详细说明代码库中重复的数量,并按文件夹进行分类。
其他一些命令曾用于其创建者的硕士学位项目,但与最终用户无关。
该工具目前仅支持由 Tree-sitter API 提供的语言;这些语言必须显式地添加到 `config.json` 文件中。
# 相似度
该工具目前使用**相似度**的概念。用户可以向
该工具传递一个**相似度阈值**,该阈值是介于 0.0 到 100.0 之间的数字。此阈值用于限制
该工具认定为重复的内容。
如果阈值设置为 **0.0**,则所有内容都会被视为重复。如果阈值设置为
**100.0**,则仅完全相同的函数才会被视为重复。在当前状态下,
该工具在相似度阈值设置为 **90.0** 左右时能够提供良好的结果。
ArKanjo 工具使用
[Duplicate Code Detection Tool](https://github.com/platisd/duplicate-code-detection-tool)
作为子程序来生成相似度指标。
有关相似度模型的更多详细信息,请参阅 [`docs/similarity.md`](docs/similarity.md)。
# 来自 Linux 内核的洞察
ArKanjo 曾用于一项涉及对 Linux 内核真实贡献的人种学研究。
结果表明,代码重复并不总是不可取的,而是取决于上下文。
与维护者互动的主要发现:
- **Driver 分叉 (T1)**
代码重复有时是故意的。整个 driver 被克隆以作为独立的基准。
- **可读性优于去重 (T2)**
如果重复的代码能提高清晰度并降低认知负担,维护者通常会倾向于保留重复代码。
- **集成开销 (T3)**
由于集成和维护的成本,小规模的去重更改可能会被拒绝。
- **性能权衡 (T4)**
在底层代码中,为了避免性能衰退,可能会优先选择代码重复。
这些发现挑战了 DRY 原则在大型系统中的严格应用。
# 环境要求
该工具仅在 **Ubuntu** 操作系统上进行了测试。后续可能会包含一份安装指南。
# 如何安装
在终端中运行以下命令,以安装仅用于基于 gensim 的 NLP 文本相似度方法的可选 Python 依赖项:
```
pip3 install --user nltk
pip3 install --user gensim
pip3 install --user astor
python3 -m nltk.downloader punkt
```
下载源代码:
```
git clone https://github.com/arkanjo-tool/arkanjo.git
cd arkanjo
```
构建二进制文件:
```
mkdir build && cd build
cmake ..
cmake --build .
```
二进制文件将生成在 `build/` 目录中。
(可选)使用以下命令安装二进制文件:
```
cmake --install .
```
# 如何运行
## 预处理与缓存
该工具采用了**重度预处理**的设计,这使其能够快速响应不同类型的查询。缓存文件会存储在您的系统上,并且可能会随着代码库的大小而显著增长。
要执行预处理,请运行预处理器:
```
arkanjo-preprocessor build
```
* 预处理器会询问您要分析的代码库的完整路径以及所需的相似度阈值。
* **缓存回退路径:** `./tmp/arkanjo`
## 执行工具
要执行该工具的命令,您需要运行遵循以下格式的命令:
```
arkanjo [command_parameters] [--preprocessor] [-S ]
```
如果预处理器尚未运行,该工具将自动执行它。
所有命令通用的参数包括:
- `--preprocessor`:强制执行预处理器。
- `-S `:仅针对当前命令将相似度阈值更改为 `SIMILARITY`。
### 命令 (摘要)
| 命令 | 用途 | 示例 |
|---------------|---------|---------|
| `explorer` | 探索项目中检测到的重复函数 | `arkanjo explorer -l 10 -s` |
| `function` | 使用子字符串匹配搜索函数。 | `arkanjo function offset_to_id` |
| `duplication` | 分析并报告整个代码库中的重复行,并按文件夹层次结构分组。 | `arkanjo duplication` |
有关每个命令的完整详细信息和选项,请运行:
```
arkanjo --help
```
标签:Bash脚本, IPv6支持, SOC Prime, 云安全监控, 代码审查, 开发工具, 逆向工具, 重复代码检测, 静态分析