From e63de5548e53ed6569d4768d1f9ec1464c3a91cd Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sun, 25 Oct 2026 20:45:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(S6=E4=BF=A1=E5=8F=B7?= =?UTF-8?q?=E7=BA=AA=E5=BE=8B=E9=97=B8):=20core=20=E4=BF=A1=E5=8F=B7?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E7=A6=81=E5=86=85=E8=81=94=20lambda=20?= =?UTF-8?q?=E8=90=BD=20static=5Fscan(S10=20=E5=90=8E=E7=8B=AC=E7=AB=8B?= =?UTF-8?q?=E6=AE=B5,=E8=B1=81=E5=85=8D=E9=80=9A=E9=81=93=20s6-signal-exem?= =?UTF-8?q?pt),=E7=9B=98=E9=9D=A2=E9=9B=B6=E5=AD=98=E9=87=8F,=E6=92=A4?= =?UTF-8?q?=E9=94=80=E8=AF=81=E6=98=8E=E7=BA=A2=E7=BB=BF=E9=97=AD=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/tests/static_scan.sh | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/game/tests/static_scan.sh b/game/tests/static_scan.sh index 0582fd30..2851c244 100644 --- a/game/tests/static_scan.sh +++ b/game/tests/static_scan.sh @@ -51,6 +51,36 @@ else fail=1 fi +# ── S6 — core 信号连接禁内联 lambda(架构文档 S 表:core↔core 信号连接只许方法 Callable,禁 lambda 捕获 self)── +# 扫描面:$DIR_CORE(game/core,core↔core 规则域=core 文件集;单点变量防空转)。 +# 判据=信号连接的内联 lambda 形态,保守集合(误报零容忍,拿不准的形态宁可不抓不红): +# ①同行形态:`.connect(` 后紧接 `func`——`sig.connect(func(a): ...)`; +# ②跨行形态:行尾以 `.connect(` 结束、下一行以 `func(` 起始(awk 前行状态机实现)。 +# 拿不准不抓的形态:bind/Callable 变量中转等间接 lambda 通道、注释外的字符串字面量内 `.connect(func` 同行 +# 全行注释已排除、行尾注记已豁免——间接通道归人工评审,本闸只防直接内联 lambda 回归。 +# 豁免通道:行内注记 s6-signal-exempt(仿 S2 rng-seed-exempt)——确需内联 lambda 的在册例外逐处留档。 +# 规则第二句「发射者禁持有订阅者反向引用」:静态判据不成熟(持有引用形态难可靠识别),不造弱判据, +# 该句归人工评审面承接,本闸只防内联 lambda 回归(2026-10-24 人工 grep 盘面干净,闸为防回归防线)。 +if require_scan_face "S6" "$DIR_CORE"; then +S6_HITS="$( + grep -rnE '\.connect[[:space:]]*\([[:space:]]*func\b' "$DIR_CORE" --include='*.gd' 2>/dev/null \ + | grep -vE '^[^:]+:[0-9]+:[[:space:]]*#' | grep -v 's6-signal-exempt'; + find "$DIR_CORE" -name '*.gd' -print0 2>/dev/null | xargs -0 awk ' + prev ~ /\.connect[ \t]*\([ \t]*$/ && $0 ~ /^[ \t]*func[ \t]*\(/ && + prev !~ /^[ \t]*#/ && prev !~ /s6-signal-exempt/ && $0 !~ /s6-signal-exempt/ { + print FILENAME ":" FNR ":" $0 " (跨行 lambda——上一行行尾 .connect( )" + } + { prev = $0 }' +)" +if [ -n "$S6_HITS" ]; then + echo "[static_scan] S6 FAIL: core 信号连接内联 lambda 命中(只许方法 Callable,禁 lambda 捕获 self)" + echo "$S6_HITS" + fail=1 +else + echo "[static_scan] S6 ok(扫描面 $DIR_CORE 共 $(scan_files "$DIR_CORE") 个 .gd,内联 lambda 零命中)" +fi +fi + # S1/S2 — 玩法代码禁 randomize()/自建 RandomNumberGenerator/全局随机函数(绕开 RngService 的口子) # 违规签名=裸 randomize/rand* 调用(实例方法 .randi() 排除) @@ -89,7 +119,6 @@ if [ "$hits" -gt 0 ]; then echo "[static_scan] S5 FAIL: core 裸引用 autoload fi # TODO(正式工程落地后精化为扫描配置并升格为硬失败): -# S6 core↔core 信号连接只许方法 Callable(禁 lambda 捕获 self);发射者禁反向引用 # S7 B2/B3/B4 API 符号命中文件 ⊆ B1 文件集(编排唯一性) # S8 结算路径 await 零命中(B1 结算/编排文件集)