已关闭
[issue] 独立文件输入仅 lib/main/mod.rs 视为 crate 根,其余入口按子目录规则解析 mod #19
cezarbbb创建于  9月9日关闭于  9月20日
cezarbbb
9月9日 创建
name about title labels
BotMetric 问题单 报告 BotMetric 中可复现的问题 [Issue] --file 独立文件输入仅 lib.rs/main.rs/mod.rs 视为 crate 根,其余入口按子目录规则解析 mod(与 rustc 存在差异) bug, input, low

问题概述

--file 独立文件输入时,仅 lib.rs / main.rs / mod.rs 被视为 crate 根(mod-rs);其他文件名(如 app.rs)中的 mod x; 按子目录规则解析(到同名子目录查找),与 rustc 对独立文件的解析行为存在差异(源码位置 src/.../collector.rs:719)。首次出现版本:v1.0.0 即存在,v1.1.0 延续。受影响对象:--file 独立文件输入。实际影响:非标准命名的独立文件模块解析结果可能与 rustc 不一致,影响 scope=tree / file+modules 下的指标统计范围。本问题涉及输入解析口径。

影响范围

项目 内容
分析对象 ☑ 独立 .rs 文件(Cargo 软件包/工作空间不受影响)
受影响的指标、规则或报告字段 模块解析(--resolve-modules)与 scope=tree / file+modules 的计入范围;报告 input.files 组成
影响程度 ☑ 轻微
临时规避办法 ① 独立文件使用标准命名入口(lib.rs / main.rs / mod.rs);② 需要子目录模块时显式传 --edition 并按 rustc 规则组织目录

复现步骤

最小源码样例:夹具 fixtures\standalone(app.rs + app/ 子目录模块对,5 个 .rs 文件、26 行)。自包含最小样例如下(构造 mod 解析差异场景,可直接创建后复现;下述命令中的 <modcase> 即指向该样例目录):

modcase/
├── app.rs
└── helper.rs

app.rs(非 lib.rs/main.rs/mod.rs 命名的入口文件):

mod helper;

pub fn run() -> u32 {
    helper::value()
}

helper.rs(与 app.rs 同目录):

pub fn value() -> u32 { 42 }

说明:rustc(edition 2018+)将命令行传入的 app.rs 作为 crate 根,mod helper; 解析到同目录 helper.rs;bot-metric 仅将 lib.rs/main.rs/mod.rs 视为 crate 根,对 app.rs 按非 mod-rs 规则解析到 app/helper.rs 子目录(collector.rs:719),故 --resolve-modules 下计入的文件集合与 rustc 不一致。

  1. BM110 analyze --file <modcase>\app.rs --resolve-modules --format json
  2. 检查报告中计入的文件列表(app.rs 的 mod 声明解析到何处)
  3. 与 rustc 对照:rustc --edition 2018 --emit=metadata <standalone>\app.rs 观察其模块解析
  4. x86 与 ARM64 各执行一次并对比

预期结果

与 rustc 对独立文件的解析规则一致,或文档明确 bot-metric 的 crate 根判定规则(仅 lib.rs/main.rs/mod.rs)。

实际结果

仅 lib.rs / main.rs / mod.rs 被视为 crate 根;app.rs 中的 mod 声明按子目录规则解析(到 app/ 子目录查找),与 rustc 解析存在差异。两平台行为一致。证据:x86_linux\records\batch-02\;arm_linux\records-arm64\batch-02\。

证据原文(x86_linux\records\batch-02\t2.4-standalone-file.txt,7 行全文):

### CMD: BM100 analyze --file fixtures/standalone/app.rs --format json
status: complete | origin: rust_file | scope: file | files: ['/root/cezarbbb/bot-metric_test/fixtures/standalone/app.rs'] | nbnc: 4.0
exit=0

### CMD: BM110 analyze --file fixtures/standalone/app.rs --format json
status: complete | origin: rust_file | scope: file | files: ['/root/cezarbbb/bot-metric_test/fixtures/standalone/app.rs'] | nbnc: 4.0
exit=0

证据原文(x86_linux\records\batch-02\t2.5-resolve-modules.txt,7 行全文):

### CMD: BM100 analyze --file standalone/main.rs --resolve-modules --format json
status: complete | scope: file_and_modules | files: ['main.rs', 'util.rs'] | nbnc: 7.0 | errors: []
exit=0

### CMD: BM110 analyze --file standalone/main.rs --resolve-modules --format json
status: complete | scope: file_and_modules | files: ['main.rs', 'util.rs'] | nbnc: 7.0 | errors: []
exit=0

证据原文(arm_linux\records-arm64\batch-02\t2.4-standalone-file.txt,7 行全文):

### CMD: BM100 analyze --file fixtures/standalone/app.rs --format json
status: complete | origin: rust_file | scope: file | files: 1 | views: 1 | nbnc: 4.0 available | findings: 0
exit=0

### CMD: BM110 analyze --file fixtures/standalone/app.rs --format json
status: complete | origin: rust_file | scope: file | files: 1 | views: 1 | nbnc: 4.0 available | findings: 0
exit=0

证据原文(arm_linux\records-arm64\batch-02\t2.5-resolve-modules.txt,9 行全文):

### CMD: BM100 analyze --file fixtures/standalone/main.rs --resolve-modules --format json
status: complete | origin: rust_file | scope: file_and_modules | files: 2 | views: 1 | nbnc: 7.0 available | findings: 0
files: ['main.rs', 'util.rs']
exit=0

### CMD: BM110 analyze --file fixtures/standalone/main.rs --resolve-modules --format json
status: complete | origin: rust_file | scope: file_and_modules | files: 2 | views: 1 | nbnc: 7.0 available | findings: 0
files: ['main.rs', 'util.rs']
exit=0

(对照说明:main.rs(mod-rs)--resolve-modules 解析出同目录 util.rs;app.rs(非 mod-rs)仅 scope=file 单文件、mod 声明到 app/ 子目录解析——两平台记录一致。)

分析环境与范围

项目 内容
BotMetric 版本或提交号 v1.1.0(commit 8ef52f6);v1.0.0 行为一致
操作系统与架构 x86_64 Linux(rustc/cargo 1.95.0)+ aarch64 Linux(rustc/cargo 1.98.0),均 root 用户
软件包 / 目标 / 特性 / 范围参数 standalone(--file app.rs --resolve-modules,默认 scope)
文件数 / 代码行数 5 个 .rs 文件 / 26 行
模块层级 app.rs + app/ 子目录模块对(两层)

指标、发现与报告证据

  • ☑ 已说明发现条目的编号、严重级别、位置和 human_message:无 finding 产生(解析行为差异);证据为报告 input.files 组成与 rustc 对照结果
  • ☑ 已附 analysis-report:完整 JSON 输出存于 batch-02 证据文件
  • ☑ 指标口径:影响 scope 计入范围(模块树组成决定哪些文件计入统计)
  • ☑ 已说明 Cargo/独立文件口径差异:本条即独立文件口径与 rustc 的差异,Cargo 输入不受影响

性能与资源证据

项目 内容
冷缓存 / 热缓存 热缓存复现(与缓存无关)
执行次数 / 基线 每平台 ≥2 次,结果一致
总耗时 <100ms(x86)/ 约 0.05s(ARM64)量级
处理器占用 / 内存峰值 未采样(本项非性能问题)
采样工具 无
测试数据集规模 / 硬件条件 standalone 5 文件 26 行;x86_64 与 aarch64 Linux 服务器(root)

附件与提交确认

  • ☑ 已检索现有问题单,确认不是重复问题
  • ☑ 已提供最小复现步骤、预期结果和实际结果
  • ☑ 已明确指标公式、统计范围和实际证据(如适用)——本条涉及模块解析对统计范围的影响,已说明
  • ☑ 已完成日志、配置、源码和附件脱敏(输出不含本机用户路径)
likedislike
WWangZijun成员
9月18日 关联了pull request:fix: resolve standalone files as crate roots (issue#19)
WangZijun成员
9月18日 评论:

https://gitcode.com/xuanwu/bot-metric/pull/17

结论:

  • 问题可以复现:修复前的最小复现与回归测试确认了 issue 描述的行为。
  • 问题可以修复:当前分支的针对性测试和全量质量门禁均已验证修复结果。

具体修复:

  • 仅把初始的独立 --file app.rs 明确视为 crate 根,使 mod helper; 与 rustc 一样解析同目录文件。
  • 发现的子模块继续使用普通路径推断,确保 helper.rs -> helper/nested.rs 不会被错误提升为新的 crate 根。
  • 增加真实 CLI、嵌套模块、Cargo 行为及边界保护回归测试。
likedislike
VVaynNecol成员
9月20日 关闭了 issue