From 098f3b894679038ac71931db4bc1e3623f3679a9 Mon Sep 17 00:00:00 2001 From: AskaEth Date: Wed, 11 Nov 2026 22:34:17 +0800 Subject: [PATCH] =?UTF-8?q?fix(guards):=20=E6=8A=8A=20unsafe-scope=20?= =?UTF-8?q?=E7=9A=84=E8=AF=B4=E6=98=8E=E6=B3=A8=E9=87=8A=E5=8E=8B=E7=BC=A9?= =?UTF-8?q?=E5=88=B0=20397=20=E8=A1=8C=EF=BC=88=E5=AE=88=E5=8D=AB=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E8=87=AA=E5=B7=B1=E4=B9=9F=E8=A6=81=E8=BF=87=20400=20?= =?UTF-8?q?=E8=A1=8C=E7=BA=A2=E7=BA=BF=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit M256 加 EXPECTED 一行后本文件 401 行,触发 guards.yml::file-size 自己那条门禁。 只合并注释里的重复表述(词法器段 8→6 行)+ 去掉两处纯分隔空注释行; 判据逻辑、shell 片段、EXPECTED 的三条路径一字未动。 --- .github/workflows/guards.yml | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/.github/workflows/guards.yml b/.github/workflows/guards.yml index 1de583a..d2c7667 100644 --- a/.github/workflows/guards.yml +++ b/.github/workflows/guards.yml @@ -180,10 +180,9 @@ jobs: echo "OK: unlucky-design 依赖树只有自身,零第三方依赖" # D36 定案:整窗 α 需要 `unsafe`(`SetLayeredWindowAttributes` 没有安全替代)。 - # M196 加了第二处:控制台附着(`AttachConsole`)同样只有 Win32 一条路。两处各自成文件, - # M256 加了第三处:系统「减少动效」探针(`SystemParametersInfoW(SPI_GETCLIENTAREAANIMATION)` - # 同样没有安全替代;Linux/macOS 那两支走子进程,零 unsafe)。三处各自成文件, - # 判据是**集合相等**而不是「黑名单命中」: + # M196 加第二处(控制台附着 `AttachConsole`)、M256 加第三处(系统「减少动效」探针 + # `SystemParametersInfoW(SPI_GETCLIENTAREAANIMATION)`;Linux/macOS 两支走子进程、零 unsafe)。 + # 三处各自成文件,判据是**集合相等**而不是「黑名单命中」: # - 任何第四个显式放行 unsafe 的文件 → 红(黑名单写法在这里会假绿); # - 落点文件把放行删掉 / 改名 / 搬走 → 红(否则门禁守着一条已经不存在的路径); # - 多行属性、同行合并属性、多行 `cfg_attr`、`expect(unsafe_code)` 都已覆盖 @@ -202,11 +201,10 @@ jobs: # 为什么必须用词法器:r2 的写法是「按全文方括号净深度合并续行」,但 Rust 里 # `['[', '(']`、`"[2"`、`starts_with("[2")` 这类**不配对括号字面量**会让深度永久跑偏, # 于是该文件后面的一切(包括一个真的 `#[allow(unsafe_code)]`)都再也不会被扫到—— - # 实测本仓 601 个文件里有 10 个扫到 EOF 仍非 0,`gate.rs` 就是其中之一(r3 复审实证: - # 在它尾部加作用域 allow,r2 门禁 exit 0 假绿)。 - # 现在的做法:逐字符状态机(普通 / 行注释 / 块注释(可嵌套)/ 字符串 / raw 字符串 / - # 字符字面量),只在「普通态」里认 `#` 或 `#!` 紧跟 `[` 的属性起点,然后只在这一个 - # 属性内部累计到它的 `]` 配平——数组字面量跨行不再参与合并,也就不会带偏。 + # 实测本仓 601 个文件里有 10 个扫到 EOF 仍非 0,`gate.rs` 就是其中之一(在它尾部加 + # 作用域 allow,r2 门禁 exit 0 假绿)。 + # 现在的做法:逐字符状态机(普通 / 行注释 / 块注释(可嵌套)/ 字符串 / raw / 字符字面量), + # 只在「普通态」认 `#`/`#!` 紧跟 `[` 的属性起点,再累计到那一个属性的 `]` 配平。 # # 放行的两种拼法都算:`allow(...)` 与 `expect(...)`。`expect(unsafe_code)` 同样会 # 放行 unsafe 代码(rustc 实测:`#![expect(unsafe_code)]` + `pub unsafe fn f() {}` 在 @@ -219,7 +217,6 @@ jobs: # - 注释(行注释/块注释)与字符串(普通/raw)里的属性文本**刻意不算**:它们不构成放行; # 代价是「真把 allow 写进字符串」这种写法不会被当作落点(它也确实不放行任何代码); # - manifest 侧 `[lints.rust] unsafe_code = "allow"`:本门禁只扫 `*.rs`,看不见 Cargo.toml; - # # r4 回归用例(属性内的 raw string / 字符字面量曾经是盲区;现在两处共用 step(), # 它们不再是边界,但下面五条必须一直保持红/绿正确 —— 改这段词法器前先跑它们): # 红 #[doc = r#"a "b"#] 后跟真 allow @@ -236,7 +233,6 @@ jobs: # 完全不认识 —— `#[doc = r#"a "b"#]` 之后的一切对门禁失明(假绿), # `#[doc = r#"x" allow(unsafe_code) "y"#]` 这种纯文档被误报(误红)。 # 现在两处只认这一个 step(),属性解析只多一层「[ ] 深度决定何时离开属性」。 - # # 状态:0 普通 / 1 行注释 / 2 块注释(可嵌套)/ 3 字符串 / 4 raw 字符串 / 5 字符字面量。 # 返回值 = 本次消费到的位置(`//`、`/*`、`r#"`、raw 收尾会一次吃掉多个字符); # g_plain=1 表示该位置处在「普通态代码」里(注释/字符串内容一律 0,