fix(appearance): M91 r2 —— 真交叉断言 + unsafe 门禁跨行扫描 + α 上取整
P2-1「与 design 码值一致」的守门此前不存在 - 新增 crates/app-iced/src/platform/mod.rs::palette_source_codes_match_design_level_codes: 三个格子对照 PaletteSource::as_str() 与 unlucky_design::palette::Level::code(), 并覆盖反方向(from_key_value(level.code()) 必须还原同一档)与「码值在允许值表里」 - core 侧那条测试改名为 value_tables_are_self_consistent,注释改成事实: core 不依赖 design,只能钉自己的字面量;一致性由 app-iced 的那条对照断言守 - 实测:把 design 的 Level::Wallpaper 码值改成 "desktop" → 新断言红(design 自己 178 个测试仍全绿) P2-2 unsafe-scope 门禁:行级正则 → 跨行扫描 - 去注释 + 按方括号闭合把续行并成逻辑行,再逐个属性组判断 allow(...unsafe_code) - 抓得住原来两种绕过:多行属性 #![allow(\n unsafe_code\n)]、同行两属性 #[inline] #[allow(unsafe_code)] - 门禁注释补全已知边界(不再声称「依赖 fmt job 兜底」——已不依赖) O-1 α 量化方向:round → ceil - 0.08×255=20.4,round 得 20 → 实际下发 20/255=0.0784,低于 D36 名义下限 - ceil 得 21 → 0.0824;新增 applied_alpha_is_never_below_the_floor 断言 下发字节/255 ≥ 0.08 O-7 契约测试补三个新键 - appearance_keys_are_all_ai_writable_and_registered 的 audited 清单加 window_opacity / titlebar_mode / palette_source
This commit is contained in:
1 parent
7406785325
commit
fa2c6560fd
6 files changed
+108
-16
No files matched your search
@@ -156,7 +156,9 @@ jobs:
|
||||
# - 新增第二个带 allow(unsafe_code) 的文件 → 红(黑名单写法在这里会假绿);
|
||||
# - 落点文件把 allow 删掉 / 改名 / 搬走 → 红(否则门禁守着一条已经不存在的路径);
|
||||
# - 落点文件里多开别的 unsafe 能力 → 门禁看不见(这是本守门的已知边界,
|
||||
# workspace 的 `unsafe_code = "deny"` 也只是按文件放行,逐行审计靠 code review)。
|
||||
# workspace 的 `unsafe_code = "deny"` 也只是按文件放行,逐行审计靠 code review);
|
||||
# - 多行属性 / 同行合并属性:**已由跨行扫描覆盖**(r2 加固前是行级正则,那两种写法能过闸,
|
||||
# 当时唯一的缓解是 ci.yml 里独立的 fmt job——rustfmt 会把它们归成一行。现在不再依赖 fmt)。
|
||||
unsafe-scope:
|
||||
name: unsafe 落点守门(集合必须恰好一个文件)
|
||||
runs-on: ubuntu-latest
|
||||
@@ -166,14 +168,42 @@ jobs:
|
||||
run: |
|
||||
set -uo pipefail
|
||||
EXPECTED='crates/app-iced/src/platform/win32/transparency.rs'
|
||||
# 只认「行首就是属性」的写法,并允许与其他 lint 混写:
|
||||
# #[allow(unsafe_code)] #![allow(unsafe_code)]
|
||||
# #[allow(dead_code, unsafe_code)] #[cfg_attr(windows, allow(unsafe_code))]
|
||||
# 文档/注释里提到这个属性**不算**(crates/app/src/main.rs 的说明文字就提到过它,
|
||||
# 用无锚定的 `grep -r allow(unsafe_code)` 会把它当越线)。
|
||||
ATTR='^[[:space:]]*#!?\[(.*,)?[[:space:]]*allow\([^]]*unsafe_code[^]]*\)\]'
|
||||
# 扫描口径(M91 r2 加固):**跨行**扫描属性,不再用行级正则。
|
||||
# 旧版是单行正则,实测有两种绕过能过闸:多行属性 `#![allow(\n unsafe_code\n)]`、
|
||||
# 以及同行两个属性 `#[inline] #[allow(unsafe_code)]`——当时只能靠 ci.yml 的独立
|
||||
# fmt job 兜底(rustfmt 会把这两种写法归成一行,所以 fmt 红会间接拦住它们)。
|
||||
# 现在不依赖 fmt 了:注释先去掉,再把「方括号未闭合」的续行并成逻辑行,
|
||||
# 最后在逻辑行里逐个属性组 `#[...]` / `#![...]` 判断是否含 `allow(...unsafe_code...)`。
|
||||
#
|
||||
# 仍然抓不住的(已知边界,别把它当全覆盖):
|
||||
# - 落点文件**内部**多开别的 unsafe 能力(本门禁只看「有没有 allow」,不看 unsafe 块有几个);
|
||||
# - 宏/`include!` 生成出来的 allow(扫描的是源码文本,不是展开后的 HIR);
|
||||
# - 字符串字面量里写着属性文本的行(会被当代码扫;本仓库不存在这种行);
|
||||
# - 注释里提到的属性**刻意不算**(`crates/app/src/main.rs` 的说明文字就提到过它)。
|
||||
scan() {
|
||||
awk '
|
||||
BEGIN { buf = ""; depth = 0; found = 0 }
|
||||
{
|
||||
line = $0
|
||||
if (line ~ /^[[:space:]]*\/\//) next
|
||||
sub(/\/\/.*$/, "", line)
|
||||
buf = (buf == "" ? line : buf " " line)
|
||||
opens = gsub(/\[/, "[", line)
|
||||
closes = gsub(/\]/, "]", line)
|
||||
depth += opens - closes
|
||||
if (depth > 0) next
|
||||
s = buf; buf = ""; depth = 0
|
||||
while (match(s, /#!?\[[^]]*\]/)) {
|
||||
attr = substr(s, RSTART, RLENGTH)
|
||||
if (attr ~ /allow\([^]]*unsafe_code/) found = 1
|
||||
s = substr(s, RSTART + RLENGTH)
|
||||
}
|
||||
}
|
||||
END { exit(found ? 0 : 1) }
|
||||
' "$1"
|
||||
}
|
||||
actual=$(git ls-files '*.rs' | while IFS= read -r f; do
|
||||
if grep -qE "$ATTR" "$f"; then printf '%s\n' "$f"; fi
|
||||
if scan "$f"; then printf '%s\n' "$f"; fi
|
||||
done | LC_ALL=C sort)
|
||||
echo "期望(恰好这一个):$EXPECTED"
|
||||
echo "实际扫到的集合:"
|
||||
|
||||
Reference in new issue
Block a user