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,