fix(app-iced): M100 r3 P2-1 —— 判据从「帧超时」升级成「终态无证据即失败」
复审在 `95530a5` 的导出上用变异实测证明:把第 3 帧的采样换成 `window::close(id)` 时, 进程 **exit 0 且没有 PNG**,日志与成功跑同一形状只少了出图那几行 —— 只看退出码的脚本会读到 「成功 + 零证据」。 根因:`window::frames()` 只在 `Event::Window(RedrawRequested)` 时产消息,窗口消失 ⇒ 不再有帧 ⇒ `Message::Frame` 不再产生 ⇒ `capture_stalled` **永远求值不到**;同时 iced_winit 对「最后一个 窗口 Destroyed」直接 `Control::Exit`,`run()` 返回 `Ok(())` ⇒ 例子返回 SUCCESS。 我原来在 `CAPTURE_GIVE_UP_FRAMES` 的注释里把「窗口消失」写进了覆盖清单,实测是**说反的**。 改法(后置不变量,比超时强): - 落盘计数改成共享 `Arc<AtomicU32>`,**只在 `shot::save` 成功后**自增(U1:不是「打算写」)。 - `run()` 里 `outcome?;` 之后加终态判据 `no_evidence(written) == 0` ⇒ 打具名错误并 `exit(1)`。 - 帧超时兜底保留(管「有帧但采样回不来」);注释订正为三路:后端报错 ⇒ Err(本就非 0)、 窗口消失 ⇒ 帧不再产生 ⇒ 由终态判据兜住、有帧但采样卡住 ⇒ 帧超时。 实测: - 正常路径(最终二进制 ×6):exit 0、PNG 存在、`落盘次数=1`、`passthrough_ext=on`、sha `0d7b4f5b`、错误行 0。 - **M3 变异复现**(采样换成 `window::close(id)`,×3):**exit=1**、**PNG 不存在**、 `[harness] 取证结束但没有任何图落盘(窗口提前消失 / 落盘失败),按失败退出`。 - **M4 变异**(`CAPTURE_GIVE_UP_FRAMES` 改 0,×2):仍 exit=1 + `采样超时` ⇒ 旧兜底没被改坏。 - 新断言 `finishing_without_a_single_write_is_a_failure` 守终态判据(变异:删掉 `run()` 里那条 检查不会让它红——它守的是判据本身,不是调用点,报告里写清了「抓不住」)。
This commit is contained in:
1 parent
95530a5311
commit
d298691c17
3 files changed
+76
-10
No files matched your search
@@ -221,3 +221,24 @@ fn the_stall_guard_fires_only_after_the_grace_window() {
|
||||
let grace = CAPTURE_GIVE_UP_FRAMES;
|
||||
assert!(grace >= 10, "宽限帧数 {grace} 太小,正常路径会误触发");
|
||||
}
|
||||
|
||||
/// **终态不变量:跑完了没有图就是失败**(M100 r3 P2-1)。
|
||||
///
|
||||
/// 抓得住:谁把 `run()` 里那条后置检查删掉/改弱(删掉之后,窗口在第 3 帧消失会让进程
|
||||
/// **exit 0 且没有 PNG** —— 复审变异实测就是这个形状,只看退出码的脚本会读到「成功 + 零证据」)。
|
||||
/// 抓不住:这条检查**有没有被走到**(窗口消失的时序要真窗口,见报告里的变异复现);
|
||||
/// 也抓不住「图写到了错误的路径」(那要校验目标文件,属另一件事)。
|
||||
#[test]
|
||||
fn finishing_without_a_single_write_is_a_failure() {
|
||||
use super::app::no_evidence;
|
||||
|
||||
assert!(
|
||||
no_evidence(0),
|
||||
"一张图都没落盘时,取证结束必须判失败(不许 exit 0)"
|
||||
);
|
||||
assert!(!no_evidence(1), "落过盘就算有证据");
|
||||
assert!(
|
||||
!no_evidence(2),
|
||||
"重复落盘也算有证据(虽然不该发生,见一次性闸门)"
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user