MurasatoNaoya/crap4x

GitHub: MurasatoNaoya/crap4x

多语言 CRAP(变更风险反模式)指标分析器,结合圈复杂度和测试覆盖率帮助 Go、Python、Rust 项目识别高变更风险的代码函数。

Stars: 0 | Forks: 0

# crap4x 支持多语言的 **CRAP**(变更风险反模式,Change Risk Anti-Pattern)指标分析器,适用于 **Go、Python 和 Rust**。 受 Robert C. Martin 的 [crap4go](https://github.com/unclebob/crap4go)([@unclebob](https://github.com/unclebob))启发,并将其通用化以支持这三种语言。 **CRAP(f) = cc(f)² · (1 - cov(f))³ + cc(f)** 其中 `cc` 是函数的圈复杂度,`cov` 是其测试覆盖率(0 到 1)。高复杂度加上低覆盖率会产生高分,从而标记出修改成本最高且风险最大的代码。crap4x 使用 tree-sitter 解析每个源文件以计算复杂度,读取 lcov 覆盖率报告,按函数将它们合并,最后打印出排好序的表格。 ## 安装 ``` go install github.com/MurasatoNaoya/crap4x/cmd/crap4x@latest ``` 或者从克隆的仓库中构建:`go build ./cmd/crap4x`。 ## 用法 ``` crap4x [path] --coverage cover.lcov [--lang go,python,rust] [--threshold 30] [--top 20] ``` - `path` 默认为 `.`。crap4x 会根据项目标记文件(`go.mod`、`Cargo.toml`、`pyproject.toml`/`setup.py`/`requirements.txt`)自动检测语言;使用 `--lang` 可覆盖此设置。 - `--coverage` 是一个 lcov 文件(见下文)。该参数是必需的;如果没有提供,crap4x 将退出并打印出为相应语言生成该文件的命令。 - `--threshold N` 会标记 CRAP 值超过 `N` 的函数,并以非零状态码退出,适用于 CI 环境。 - `--top N` 会将表格限制为最差的 `N` 个函数。 - 默认情况下会跳过测试文件(Go:`_test.go`;Python:`test_*.py`、`*_test.py`、`conftest.py`,或位于 `tests/`/`test/` 目录下;Rust:位于 `tests/` 目录下)。传入 `--include-tests` 可将它们包含在内。 ## 生成 lcov 报告 | 语言 | 命令 | |----------|---------| | Go | 先执行 `go test ./... -coverprofile=cover.out`,然后执行 `gcov2lcov -infile=cover.out -outfile=cover.lcov` | | Python | `coverage run -m pytest && coverage lcov -o cover.lcov` | | Rust | `cargo llvm-cov --lcov --output-path cover.lcov` | ## 示例 ``` | Function | File | CC | Cov% | CRAP | | ---------- | ------------ | -- | ----- | ----- | | handleScan | scanner.go | 13 | 42.0 | 168.4 | | parseEntry | scanner.go | 6 | 80.0 | 6.3 | | simple | util.go | 1 | 100.0 | 1.0 | ``` 具有完全覆盖率的函数,其分数等于自身的复杂度(此时 `(1 - cov)³` 项为零);而复杂且未经测试的函数分数为 `cc² + cc`。 ## 复杂度的计算方式 每个文件进行一次 tree-sitter 遍历。函数的复杂度为 `1 + ` 其主体中决策点的数量:`if`/`elif`、`for`、`while`、`switch`/`match` 分支、`except`、`&&`/`||`/`and`/`or` 运算符,以及三元运算符和 `?` 表达式。嵌套函数或闭包内的决策点会计入该内部函数,而不是外部函数。无条件的 `loop`(Rust)不会增加复杂度。 ## 支持的语言 Go、Python、Rust。添加一种语言只需定义一个新的 `LangSpec`(包含其 tree-sitter 语法,以及被视为函数和决策点的节点类型);分析器和报告器是与语言无关的。 ## 致谢 CRAP(变更风险反模式,Change Risk Anti-Pattern)指标由 Alberto Savoia 和 Bob Evans(Crap4J)引入。Robert C. Martin([@unclebob](https://github.com/unclebob))随后发布了针对特定语言的实现([crap4go](https://github.com/unclebob/crap4go)、[crap4java](https://github.com/unclebob/crap4java)、[crap4clj](https://github.com/unclebob/crap4clj)),这些项目直接启发了本项目。 crap4x 是一个独立的重新实现,将此指标通用化以支持 Python、Go 和 Rust。它与这些项目没有任何共享代码,并根据 MIT License 单独发布。 ## 许可证 MIT。版权所有 (c) 2026 Andrew Naoya McWilliam
标签:Anchore, EVTX分析, Go, IPv6支持, Python, Ruby工具, Rust, tree-sitter, 云安全监控, 代码质量分析, 可视化界面, 圈复杂度, 无后门, 日志审计, 测试覆盖率, 网络流量审计, 逆向工具, 静态分析