37 lines
2.6 KiB
Bash
37 lines
2.6 KiB
Bash
#!/usr/bin/env bash
|
||
# tests/static_scan.sh — ADR-0004 静态扫描域 S1–S8 可执行子集
|
||
# 规则全集与动机:docs/architecture/adr-0004-test-carrier-and-ci.md §Decision 3
|
||
# 正式工程(core/ 存在)时执行;否则优雅跳过(切片阶段代码在 prototypes/,不受本扫描管辖)。
|
||
# 纪律:新违规案例必须先补本脚本规则再修码(docs/code-conventions.md 缺陷-规范对照表)。
|
||
set -u
|
||
cd "$(dirname "$0")/.."
|
||
|
||
if [ ! -d core ]; then
|
||
echo "[static_scan] core/ 不存在(正式工程未创建)——跳过,退出 0"
|
||
exit 0
|
||
fi
|
||
|
||
fail=0
|
||
|
||
# S1/S2 — 玩法代码禁 randomize()/自建 RandomNumberGenerator/全局随机函数(绕开 RngService 的口子)
|
||
hits=$(grep -rnE '\brandomize[[:space:]]*\(|\bRandomNumberGenerator\b|\brandi[[:space:]]*\(|\brandf[[:space:]]*\(|\brandf_range[[:space:]]*\(' \
|
||
core presentation --include='*.gd' 2>/dev/null | wc -l)
|
||
if [ "$hits" -gt 0 ]; then echo "[static_scan] S1/S2 FAIL: 全局随机/RNG 自建命中 $hits 处"; grep -rnE '\brandomize[[:space:]]*\(|\bRandomNumberGenerator\b|\brandi[[:space:]]*\(|\brandf[[:space:]]*\(|\brandf_range[[:space:]]*\(' core presentation --include='*.gd' 2>/dev/null; fail=1; else echo "[static_scan] S1/S2 ok"; fi
|
||
|
||
# S4 — core/ 禁 extends Control/Node2D、禁 .tscn preload(headless 债)
|
||
hits=$(grep -rnE 'extends[[:space:]]+(Control|Node2D)\b|\.tscn' core --include='*.gd' 2>/dev/null | wc -l)
|
||
if [ "$hits" -gt 0 ]; then echo "[static_scan] S4 FAIL: core 引擎/UI 依赖命中 $hits 处"; grep -rnE 'extends[[:space:]]+(Control|Node2D)\b|\.tscn' core --include='*.gd' 2>/dev/null; fail=1; else echo "[static_scan] S4 ok"; fi
|
||
|
||
# S3 — core/ 禁 ConfigDB 外 data 表加载(schema class_name 直引豁免)
|
||
hits=$(grep -rnE '\b(load|preload)[[:space:]]*\(|ResourceLoader\.load' core --include='*.gd' 2>/dev/null \
|
||
| grep -v 'res://tests/' | wc -l)
|
||
if [ "$hits" -gt 0 ]; then echo "[static_scan] S3 WARNING(人工复核——class_name 直引误报需逐条排除): $hits 处"; grep -rnE '\b(load|preload)[[:space:]]*\(|ResourceLoader\.load' core --include='*.gd' 2>/dev/null; fi
|
||
|
||
# TODO(正式工程落地后精化为扫描配置并升格为硬失败):
|
||
# S5 core/ 禁裸引用 ConfigDB/RngService 全局标识符(--script 模式 parse error;grep 近似误报多,需 AST 级或精确白名单)
|
||
# S6 core↔core 信号连接只许方法 Callable(禁 lambda 捕获 self);发射者禁反向引用
|
||
# S7 B2/B3/B4 API 符号命中文件 ⊆ B1 文件集(编排唯一性)
|
||
# S8 结算路径 await 零命中(B1 结算/编排文件集)
|
||
|
||
exit $fail
|