已关闭
[Issue] stable_subject 内嵌绝对路径 #10
cezarbbb创建于  9月9日关闭于  9月15日
cezarbbb
9月9日 创建
name about title labels
BotMetric 问题单 报告 BotMetric 中可复现的问题 [Issue] BM007 stable_subject 内嵌绝对路径,项目根移动产生假 Added+Resolved 差异对 bug, baseline, medium

问题概述

BM007(完全重复文件)finding 的 stable_subject 稳定标识内嵌绝对路径;项目根目录移动或改名后 baseline compare 报 BM007 Added+Resolved 成对假差异;BM006(连续重复块)使用相对路径无此问题,两类 finding 行为不对称。首次出现版本:v1.0.0 即存在,v1.1.0 延续(非回归)。受影响对象:含完全重复文件的 Cargo 软件包/目录输入。实际影响:CI 中 checkout 路径变化(目录改名、容器挂载点不同)产生假差异噪音,掩盖真实变化。本问题涉及报告字段口径(stable_subject 稳定标识的路径口径),不涉及指标数值。

影响范围

项目 内容
分析对象 ☑ Cargo 软件包 ☑ 独立 .rs 文件(目录输入均适用,机制相同)
受影响的指标、规则或报告字段 BM007 finding 的 stable_subject 字段;baseline compare 的 Added/Resolved 分类
影响程度 ☑ 一般
临时规避办法 ① 固定项目根路径(CI 固定 checkout 目录);② 路径变化后重建基线,或对 Added/Resolved 成对项人工比对

复现步骤

最小源码样例:夹具 fixtures\dup-many(48 个 .rs 文件、831 行,含 tiny_dup_a.rs / tiny_dup_b.rs 完全重复文件对)。自包含最小样例如下(完全重复文件对触发 BM007;下述命令中的 <dup-files> 即指向该样例目录):

dup-filepair/
├── Cargo.toml
└── src/
    ├── lib.rs
    ├── tiny_dup_a.rs
    └── tiny_dup_b.rs

Cargo.toml:

[package]
name = "dup-filepair"
version = "0.1.0"
edition = "2021"

src/lib.rs:

pub mod tiny_dup_a;
pub mod tiny_dup_b;

src/tiny_dup_a.rs:

// tiny_dup_a.rs - exact duplicate of tiny_dup_b.rs (file-level duplication).

pub fn tiny_dup_pair() -> u32 {
    let mut x = 7;
    x += 11;
    x += 22;
    x += 33;
    x += 44;
    x += 55;
    x
}

src/tiny_dup_b.rs:

// tiny_dup_b.rs - exact duplicate of tiny_dup_b.rs (file-level duplication).

pub fn tiny_dup_pair() -> u32 {
    let mut x = 7;
    x += 11;
    x += 22;
    x += 33;
    x += 44;
    x += 55;
    x
}

配置 bot-metric-dup-top.toml:

[rules]
duplication_findings = "top"
  1. BM110 baseline create --output base.json <dup-many> --config bot-metric-dup-top.toml
  2. 将 dup-many 整体复制/移动到新路径(如 dup-many-moved)
  3. BM110 baseline compare --baseline base.json <dup-many-moved> --config bot-metric-dup-top.toml --format json
  4. 检查输出中 Added/Resolved 项

预期结果

stable_subject 路径无关,项目根移动后 compare 无差异项,退出码 0。

实际结果

BM007 报 Added+Resolved 成对假差异;BM006 无差异(相对路径,行为不对称)。ARM64 批次 9 复现(R2)实测通过,与 x86 位级一致。证据:x86_linux\records\batch-09\verify-groupA_7-1_8-1.txt;arm_linux\records-arm64\batch-09\verify-groupA_7-1_8-1.txt、arm_linux\records-arm64\batch-08\out\t81-pathmove.json。

证据原文(x86_linux\records\batch-09\verify-groupA_7-1_8-1.txt,8-1 部分):

=== 8-1 复现:BM007 stable_subject 绝对路径 → 根移动假差异 ===
compare exit=0
added: ['rust.file.exact_duplicate duplicate-file:/tmp/v81/copyB/src/copy1.rs:286:3']
resolved: ['rust.file.exact_duplicate duplicate-file:/tmp/v81/copyA/src/copy1.rs:286:3']

证据原文(arm_linux\records-arm64\batch-09\verify-groupA_7-1_8-1.txt,8-1 部分):

=== 8-1 复现:BM007 stable_subject 绝对路径 → 根移动假差异 ===
夹具:/tmp/v81/copyA、/tmp/v81/copyB(同一 demo-pkg 副本,各含 src/copy1.rs 286 字节 ×3 份相同文件)
命令:BM110 baseline create /tmp/v81/copyA --config fixtures/configs/bot-metric-dup-top.toml --output /tmp/v81/base.json
      BM110 baseline compare /tmp/v81/copyB --baseline /tmp/v81/base.json --config fixtures/configs/bot-metric-dup-top.toml --format json
compare exit=0
added (1): ['rust.file.exact_duplicate duplicate-file:/tmp/v81/copyB/src/copy1.rs:286:3']
resolved (1): ['rust.file.exact_duplicate duplicate-file:/tmp/v81/copyA/src/copy1.rs:286:3']
与 x86 归档同构:Added+Resolved 各 1 条假差异,subject 内嵌绝对路径(元素为 JSON 字符串,含 rule/subject/path/owners 字段,两平台一致)。
结论:复现成立——项目根移动后 BM007 因 stable_subject 含绝对路径产生假差异对;BM006 及其它规则(相对路径键)不受影响。

证据原文(arm_linux\records-arm64\batch-08\out\t81-pathmove.json,Added/Resolved 相关部分):

{
  "metric_deltas": {
    "complexity.cca.adequacy": 0.0,
    "complexity.cca.average": 0.0,
    "complexity.cca.huge_ratio": 0.0,
    "complexity.cyclomatic.average": 0.0,
    "complexity.cyclomatic.huge_ratio": 0.0,
    "diagnostic.compiler_warning_density": 0.0,
    "diagnostic.static_warning_density": 0.0,
    "directory.huge_ratio": 0.0,
    "duplication.code_ratio": 0.0,
    "duplication.file_exact_ratio": 0.0,
    "file.lines.average": 0.0,
    "file.lines.huge_ratio": 0.0,
    "function.lines.average": 0.0,
    "function.lines.huge_ratio": 0.0,
    "redundancy.commented_code_density": 0.0,
    "rules.conformity.function": 1.1102230246251565e-16,
    "rules.conformity.function.maintainability": 0.0,
    "rules.conformity.function.performance_efficiency": 0.0,
    "rules.conformity.function.portability": 0.0,
    "rules.conformity.function.readability": 0.0,
    "rules.conformity.function.reliability": 1.1102230246251565e-16,
    "rules.conformity.function.security": 1.1102230246251565e-16,
    "rules.conformity.function.testability": 0.0,
    "rules.conformity.maintainability": 0.0,
    "rules.conformity.performance_efficiency": 0.0,
    "rules.conformity.portability": 0.0,
    "rules.conformity.project": 0.0,
    "rules.conformity.project.maintainability": 0.0,
    "rules.conformity.project.performance_efficiency": 0.0,
    "rules.conformity.project.portability": 0.0,
    "rules.conformity.project.readability": 0.0,
    "rules.conformity.project.reliability": 0.0,
    "rules.conformity.project.security": 0.0,
    "rules.conformity.project.testability": 0.0,
    "rules.conformity.readability": 0.0,
    "rules.conformity.reliability": 0.0,
    "rules.conformity.security": 0.0,
    "rules.conformity.testability": 0.0,
    "rules.conformity.total": 0.0,
    "rules.coverage.function": 0.0,
    "rules.coverage.function.maintainability": 0.0,
    "rules.coverage.function.performance_efficiency": 0.0,
    "rules.coverage.function.portability": 0.0,
    "rules.coverage.function.readability": 0.0,
    "rules.coverage.function.reliability": 0.0,
    "rules.coverage.function.security": 0.0,
    "rules.coverage.function.testability": 0.0,
    "rules.coverage.maintainability": 0.0,
    "rules.coverage.performance_efficiency": 0.0,
    "rules.coverage.portability": 0.0,
    "rules.coverage.project": 0.0,
    "rules.coverage.project.maintainability": 0.0,
    "rules.coverage.project.performance_efficiency": 0.0,
    "rules.coverage.project.portability": 0.0,
    "rules.coverage.project.readability": 0.0,
    "rules.coverage.project.reliability": 0.0,
    "rules.coverage.project.security": 0.0,
    "rules.coverage.project.testability": 0.0,
    "rules.coverage.readability": 0.0,
    "rules.coverage.reliability": 0.0,
    "rules.coverage.security": 0.0,
    "rules.coverage.testability": 0.0,
    "rules.coverage.total": 0.0,
    "safety.unsafe_density": -3.469446951953614e-18,
    "size.nbnc_lines": 0.0
  },
  "added_metrics": {},
  "removed_metrics": {},
  "added_findings": [
    "{\"owners\":[\"demo-pkg::demo_pkg\"],\"package\":\"demo-pkg\",\"path\":\"src/copy1.rs\",\"rule\":\"rust.file.exact_duplicate\",\"subject\":\"duplicate-file:/tmp/bm-t8/copyB/src/copy1.rs:286:3\"}"
  ],
  "resolved_findings": [
    "{\"owners\":[\"demo-pkg::demo_pkg\"],\"package\":\"demo-pkg\",\"path\":\"src/copy1.rs\",\"rule\":\"rust.file.exact_duplicate\",\"subject\":\"duplicate-file:/tmp/bm-t8/copyA/src/copy1.rs:286:3\"}"
  ]
}

分析环境与范围

项目 内容
BotMetric 版本或提交号 v1.1.0(commit 8ef52f6);对照 v1.0.0(commit 8cfb20e)
操作系统与架构 x86_64 Linux(rustc/cargo 1.95.0)+ aarch64 Linux(rustc/cargo 1.98.0),均 root 用户
软件包 / 目标 / 特性 / 范围参数 dup-many(目录输入,默认 scope);--config bot-metric-dup-top.toml;baseline create / compare
文件数 / 代码行数 48 个 .rs 文件 / 831 行
模块层级 / 重复窗口 11 行连续重复块 22 组 + 完全重复文件对 1 组(BM007)

指标、发现与报告证据

  • ☑ 已说明发现条目的编号、严重级别、位置和 human_message:BM007 / 依配置严重级别 / 完全重复文件对位置(tiny_dup_a.rs、tiny_dup_b.rs)/ human_message 原文见证据文件
  • ☑ 已附 analysis-report:compare JSON 输出存于 t81-pathmove.json 与 verify-groupA_7-1_8-1.txt
  • ☐ 指标口径:不适用(finding 稳定标识口径问题,指标数值无差异)
  • ☑ 已说明 Cargo/独立文件口径差异:BM007 对目录与 Cargo 输入行为一致,均受影响

性能与资源证据

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

附件与提交确认

  • ☑ 已检索现有问题单,确认不是重复问题
  • ☑ 已提供最小复现步骤、预期结果和实际结果
  • ☑ 已明确指标公式、统计范围和实际证据(如适用)——本条为 finding 标识口径问题,已附 compare 证据
  • ☑ 已完成日志、配置、源码和附件脱敏(输出不含本机用户路径)
likedislike
WWangZijun成员
9月15日 关联了pull request:fix: make finding identities path independent (issue#10)
WangZijun成员
9月15日 评论:

https://gitcode.com/xuanwu/bot-metric/merge_requests/9

结论:

  • 问题可复现:已通过修复前最小复现/回归测试确认。
  • 问题可修复:当前分支集成测试已验证修复行为。

具体修复:

  • 移除 BM007 stable_subject 中的绝对工作区路径。
  • 使用文件内容哈希、字节长度和文件数生成稳定身份。
  • 增加跨临时根目录 baseline compare 回归测试。
likedislike
VVaynNecol成员
9月15日 关闭了 issue