ascendc-sync-audit-tests:基于 AscendC 同步审计的评测语料项目

ascendc-sync-audit skill evaluator corpus (submodule)

Branch1Tags0
FilesLast commitLast update
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago

ascendc-sync-audit tests 语料仓

ascendc-sync-audit Skill 的评测语料独立仓。 tests/ 目录以 git submodule 方式挂载到主仓,避免大体积测试数据与 CI 扫描噪音进入主仓。

挂载方法

在主仓(cannbot-skills)根目录执行:

git submodule update --init --recursive

挂载位置:ops/ascendc-sync-audit/tests(与本地开发时的引用路径完全一致)。

目录结构

评测语料(4 套件,571 文件)

套件 文件数 评测点
dataset/ 53 条例覆盖样例 + mask 变形(宏封装/改名/#ifdef 包裹),测抗变形能力
real_dataset/ 54 真实算子仓(blas/nn/transformer/tensor)代码片段,缺陷+正确同源
real_pr/ 64 真实同步修复 PR 的修复前完整文件,在真实复杂度(500~2000 行)下测检出召回
real_pairs/ 400 同一 PR 修复前/后成对文件(200 对),测判别力(能否区分修前/修后)

标注文件:各套件目录就近存放的 labels.json(dataset/labels.json、real_dataset/labels.json、 real_pr/labels.json、real_pairs/labels.json,字段 label + expected_sync + defect_lines, 机器 ground truth;real_pairs 的 pair 字段为本目录文件名)、issues.md(人读版标注表)、 real_pairs/issues.md(配对说明,94 个 PR / 200 对索引)。

defect_lines 覆盖:dataset/real_dataset 未标注(0/76,评测仅做条例判定); real_pr 40/64;real_pairs 134/200 有值(66 个为空:diff 变更行全部为注释/空白/宏定义, 被 extract_change_lines.py 过滤规则剔除)。

评测脚本:eval_recall.py(主评测,量化召回/误报/条例命中/配对判别)、 measure_accuracy.py(CPU 仿真 UT ground truth)、regression_real_ops.py(真实算子仓回归)、 common.py(共享引导模块,供上述评测脚本复用)。

与 benchmark/ 门禁的分工

benchmark/(主仓) 本仓 tests/
角色 L0 门禁,随主仓提交 L1 全量语料,submodule 按需拉取
样例数 15 缺陷 + 6 正确 571(4 套件)
评测器 benchmark/eval_benchmark.py tests/eval_recall.py
缺陷判定 三层:有候选 + 条例命中 + 行号命中 文件级召回:有 ≥1 候选即算(条例命中单列统计)
real_pairs 口径 sync 子集 49 对(correct 侧同步过滤) sync 子集 49 对(correct 侧同步过滤),口径一致
门槛 强约束(CI,15/15 + 0% 误报) 无固定门限,目标为不回退

两个评测同源(同一 sync_audit.py、同一标注体系 label + expected_sync + defect_lines), 但口径不同:L0 是"条例+行号精确命中"门禁,L1 是"文件级召回 + 误报率"量化基线,两者互补。

评测

cd ops/ascendc-sync-audit
python3 tests/eval_recall.py               # 全部套件(L1 量化基线)
python3 tests/eval_recall.py --json        # JSON 输出(门禁/趋势跟踪)
python3 benchmark/eval_benchmark.py --full # L0 门禁 + L1 全量(消费本语料)

L0 门禁不依赖本仓(benchmark/ 最小集随主仓提交);L1 全量评测需先拉取本语料。

指标口径(与 eval_recall.py docstring 一致)

  • 文件级召回:defect 文件中产生 ≥1 个候选(任意级别)的比例
  • 条例命中率:已检出的 defect 文件中,候选条例包含 expected_sync 的比例(辅助指标)
  • 文件级误报率:correct 文件中产生 ≥1 个候选的比例(含性能/信息级)
  • 红线误报率:correct 文件中产生 ≥1 个红线候选的比例
  • 配对判别率(仅 real_pairs):以配对 correct 文件候选为噪声基线, defect 文件存在"新增候选签名"(code + 去行号 message,计数多于 correct 侧)的比例

量化基线(2026-08-26 实测)

套件 文件级召回 条例命中 文件级误报率 红线误报率
dataset/ 89.1%(41/46) 31/41 42.9% 0%
real_dataset/ 70.0%(21/30) 17/21 29.2% 12.5%
real_pr/ 82.8%(53/64) — — —
real_pairs/(sync 子集 49 对) 75.5%(37/49) — 79.6% 36.7%,配对判别率 20.4%

real_pairs 共 200 对,经 diff 审计仅 49 对为真实同步修复(diff 含同步 API 增删, 白名单见 eval_recall.py SYNC_CHANGE_RE),同步相关指标只统计这 49 对(sync 子集); 其余 151 对为精度/NAN/功能修复,不计入召回分母。

复现:python3 tests/eval_recall.py;指标变化记录于主仓 DEV_LOG.md。

维护

  • 语料修改:更新对应套件的 <suite>/labels.json(或 issues.md + 二次生成)后重跑 eval_recall.py 确认指标,并在主仓 DEV_LOG.md 记录变化
  • 历史:本仓由主仓 git subtree split --prefix=ops/ascendc-sync-audit/tests 导出, 语料完整提交历史保留于本仓 master

评测示例

示例数据均为实测:标注取自各套件 labels.json,脚本输出取自 python3 scripts/sync_audit.py <文件> --format json 的 findings,可直接复现。

dataset/:条例命中判定

文件:   dataset/sync01a_wait_before_set.cpp
标注:   { "label": "defect", "expected_sync": "SYNC-01" }
脚本:   n=1, findings=[{code: "SYNC-01", line: 24, severity: "高",
          message: "Wait 先于 Set(同函数消费+生产...): 方向=MTE2_V flag=EVEN"}]
判定:   有候选,且候选条例与 expected_sync 一致(SYNC-01)
        → 计入文件级召回与条例命中

real_dataset/:条例命中判定

文件:   real_dataset/blas_1_SYNC-01.cpp   (源自 ops-blas scopy_kernel.cpp)
标注:   { "label": "defect", "expected_sync": "SYNC-01" }
脚本:   n=1, findings=[{code: "SYNC-01", line: 14, ...}]
        (该缺陷为把 MTE2_MTE3 的 WaitFlag 提到 SetFlag 之前)
判定:   有候选,且候选条例与 expected_sync 一致 → 计入文件级召回

real_pr/:行号命中判定

文件:   real_pr/pr_3920_1.cpp   (Conv3D 同步死锁修复的修复前完整文件,528 行)
标注:   { "label": "defect", "defect_lines": [273, 274, 275, 283, ...] }(无 expected_sync)
脚本:   n=10, codes={SYNC-01, SYNC-03}, lines={193, 203, 209, ...}
判定:   候选行号与 defect_lines 无交集 → 判为漏检

real_pairs/:配对判别与行号命中判定

文件:   real_pairs/defect_pr_1678_1.cpp ↔ correct_pr_1678_1.cpp(同一 PR 修前/修后)
标注:   { "label": "defect", "defect_lines": [179], "pair": "correct_pr_1678_1.cpp" }
脚本:   defect 侧存在相对 correct 侧的新增候选签名(SYNC-11),候选行号 179 命中标注
判定:   配对判别成立(修复前较修复后新增 SYNC-11 候选),行号命中 → 通过

全量评测实测输出(复现:python3 tests/eval_recall.py)

[dataset]
  文件级召回: 41/46 = 89.1%   条例命中: 31/41
  文件级误报率(任意级别): 3/7 = 42.9%   红线误报率: 0.0%
[real_dataset]
  文件级召回: 21/30 = 70.0%   条例命中: 17/21
  文件级误报率(任意级别): 7/24 = 29.2%   红线误报率: 12.5%
[real_pr]
  文件级召回: 53/64 = 82.8%
[real_pairs]
  文件级召回: 37/49 = 75.5%  (sync子集 49)
  文件级误报率(任意级别): 39/49 = 79.6%   红线误报率: 36.7%
  配对判别率: 20.4%

单文件验证:

cd ops/ascendc-sync-audit
python3 scripts/sync_audit.py tests/dataset/sync01a_wait_before_set.cpp --format json

Introduction

ascendc-sync-audit skill evaluator corpus (submodule)

Customize your domain