ydah/necropsy
GitHub: ydah/necropsy
Necropsy 是一个基于统一调用图的 Ruby 混合死代码检测器,结合静态与动态分析从框架入口点出发进行可达性分析,帮助开发者识别项目中不再被调用的代码。
Stars: 0 | Forks: 0
# 尸体剖检
Necropsy 是一个基于统一调用图构建的 Ruby 死代码检测器。它
使用 Prism 收集方法定义,添加来自静态和可选动态分析器的调用边证据,
然后从框架和配置的入口点运行可达性分析。
首个实现包括:
- 基于 Prism 的 `def`、`define_method`、`attr_*` 和 `delegate` 方法收集
- 静态名称解析、CHA 以及对实例化类进行 RTA 风格的过滤
- Rails 路由/回调/视图辅助方法/组件、普通 Ruby 以及测试套件的入口点提供器
- `unreachable`、`unused` 和 `test_only_reachable` 分类
- 置信度级别、JSON/YAML/human/SARIF/GitHub 报告、基线/检查防护机制、隔离建议、TracePoint 记录以及基准评估器
## 安装说明
将 gem 添加到 development/test 组:
```
gem "necropsy", require: false
```
## 用法
创建基线:
```
bundle exec necropsy baseline --root .
```
运行报告:
```
bundle exec necropsy analyze --root . --format human
```
仅针对新的高置信度发现导致 CI 失败:
```
bundle exec necropsy check --root . --fail-on high
```
从 Ruby 脚本记录动态证据:
```
bundle exec necropsy record --root . --output tmp/necropsy_trace_point.yml -- script/runner.rb
bundle exec necropsy coverage --root . --output tmp/necropsy_coverage.yml -- script/runner.rb
```
在运行外部命令时记录 Ruby Coverage:
```
bundle exec necropsy coverage --root . --output tmp/necropsy_coverage.yml -- bundle exec rspec
```
子 Ruby 进程会继承收集器,并将其合并到该次运行的同一输出中。
对照黄金标准进行评估:
```
bundle exec necropsy bench --root . --gold-standard gold.yml --ablation
```
配置示例:
```
analyzers:
static: [name_resolution, cha, rta]
dynamic:
coverage:
source: tmp/necropsy_coverage.yml
min_observation_days: 30
coverband:
source: redis://prod-redis:6379/2?key=coverband
trace_point:
source: tmp/necropsy_trace_point.yml
custom:
- "MyCompany::GraphqlEntryAnalyzer"
cache:
enabled: true
path: .necropsy_cache/scan.yml
entry_points:
extra:
- "PublicApi::*"
ci:
fail_on: high
baseline: .necropsy_baseline.yml
quarantine:
days: 30
bench:
precision_threshold: 0.85
```
当扫描的 Ruby 文件或配置值发生更改时,扫描缓存将失效。
动态输入可以提供包含方法 ID 的 `executed` 或 `nodes` 条目,包含 `caller_id`/`callee_id` 的 `edges`,以及一个 `observation` 哈希。可以通过 `--format sarif` 和
`--format github` 获取 SARIF 和 GitHub Actions 注释。
支持 Coverband 文件、Redis 字符串和 Redis 哈希导出。Rails 路由入口点检测涵盖常见的 `resources`、`resource`、`namespace`、`scope`、`controller`、`concerns`、`draw`、`mount`、`root` 以及动词路由形式。
`necropsy quarantine --write` 会添加 `# necropsy:quarantine since=YYYY-MM-DD`。
当配置的隔离窗口过期且未出现存活证据时,
该发现将提升为 `certain`。
## 开发说明
检出代码库后,运行 `bin/setup` 安装依赖项。然后运行 `rake spec` 来执行测试。你也可以运行 `bin/console` 获取一个交互式提示符,以便进行实验。
要将此 gem 安装到本地计算机上,请运行 `bundle exec rake install`。要发布新版本,请更新 `version.rb` 中的版本号,然后运行 `bundle exec rake release`,这将创建该版本的 git tag,推送 git 提交和已创建的 tag,并将 `.gem` 文件推送到 [rubygems.org](https://rubygems.org)。
## 贡献
欢迎在 GitHub 上提交 Bug 报告和 Pull Request。
## 许可证
该 gem 作为开源软件提供,基于 [MIT License](https://opensource.org/licenses/MIT) 的条款。
标签:Ruby, 云安全监控, 批量扫描, 搜索引擎查询, 死代码检测, 知识库, 网络攻击, 静态分析