afb0bfd5ff
智能体团队四路并行只读审计(驱动层逐命令 / NET+测试层逐调用点 / Trap 01-12 复核 / Trap 13-25 复核),三源交叉:芯片手册 + WCH 官方 SDK(CH395CMD.c / CH395INC.H / 21 个例程)+ git 历史。本提交只落 "已确认且低风险"的修法,其余发现登记进文末审计章节待逐项决策。 已修(A 类,全部有手册/SDK 出处): A1 测试 TC-203 反核实写成 st_chk[0]==CH395F_TCP_ESTABLISHED——§5.22 byte0 只有 00H/05H,条件恒假,这道 Trap 14 防线自写下起从未生效 且日志无痕(与 Trap 07 同类的 byte0/byte1 语义越界)。改为 byte0==OPEN && byte1==ESTABLISHED。 A2 测试 Phase3/4 把 GET_RECV_LEN 返回值直接当读取长度(本地 rx_buf[300]/[64],芯片 RX 缓冲 2KB)→ 栈溢出;补夹取 + 留痕 (同文件 TC201/202/204 早已 clamp,这两处是漏)。 A3 CH395F_GINT_STAT_DHCPV6 由 0x8000(bit15) 改 0x1000:SDK 是 (1<<12)、§5.16 明确 CH395F 的 [12:15] 保留。全仓零引用。 A4 ch395f.h 命令分组注释字节数错 4 处(GET_GLOB_INT_STATUS_ALL / GET_UNREACH_IPPT 归"1 字节输出"、SET_FUN_PARA 归"1 入 1 出"、 SET_RETRAN_PERIOD 归"3 字节输入"、GET_SOCKET_STATUS_SN 归"1 字节 输出");KeepAlive 参数注释"秒"改"毫秒"(§5.53/5.54 单位 ms); set_retrans_count 删"0=默认值5"(§5.17 默认 12、无 0=默认语义)。 实现全对、注释误导——Trap 25 的 1 字节缓冲栈越界正是这类注释发起。 A5 net_socket.c 六处注释与手册/HEAD 相反:FUN_PARA(SOCKET_CLOSE=0) 实为 bit3=1(正是 closed-with-data accept 的契约依据,写反会诱导 把 0x08 改回去)、"初始化成功后设置 MAC"(§9.2.1 ① 是之前)、 "复用默认缓冲"(net_init 已为 8 Socket 显式分配)、"由 MSS 推导" (固定布局、Trap 21 已解耦)、"等 SEND_OK"(门控是 SENBUF_FREE)、 UDP 头 [0-1] reserved(§9.2.4 是数据长度)。 A6 ch395f.c write_send_buf 超限静默 return(void 无日志),且上限取 DMA 2048 而非发送缓冲 1024;读路径有 OVERSIZE 金丝雀、写路径没有 → 补 [ERR] 留痕 + >1KB 告警,行为不变(分块责任仍在调用方)。 审计确认"不是 bug"的最危险一项:GET_GLOB_INT_STATUS_ALL 拼装方向。 我们"第1字节|第2字节<<8"与官方 CH395CMDGetGlobIntStatus() 逐字相同, glob & (1<<(sock+4)) = §5.16 bit4..bit11 = SDK GINT_STAT_SOCKn,三源 一致。另 55 条命令码、9 处 16 位字节序、14 条读命令字节数、60 个 常量、12 个单位参数点、48 块缓冲布局逐条核对无异常;17 处 get_socket_status 调用点全是 st[2],Trap 25 的 1 字节 bug 无残留。 文档:Trap_Records 加文末「2026-10-11 寄存器/数值口径全量审计」章节 (干净清单计数 + 15 条新发现含已修/待修 + 文档待修清单)。就地修正: Trap 07 定案更正里"全文 RST 仅见于错误码与引脚"的绝对表述(§5.29 / §9.2.6 其实写了芯片发 TCP RESET,只是都与 close 无关)+ 删不可核验的 "11 个悬空提交";Trap 16 的"IP/端口寄存器大端"(端口 §5.25/5.26 明确 低字节在前)+ 注明 §5.8 总括与官方例程自相矛盾;Trap 18 删悬空 "Trap 19"(该条从未存在)、net_socket() 改 net_bind();速查清单 DMA 1500 改 2052;Trap 13 加复核注(最高优先级:其"部分读后 recv_len 归零"与 §5.34 直接相左、与本仓 TC201 注释相反,且同族结论已被 Trap 21 撤回,却仍被 6 处当现行约束引用);Test_Guide 的 TRAP-07 行仍教 "卡 FIN_WAIT_2 / close(RST)"、悬空的 Trap 19 与两处"见风险 #N"。 待修(B 类,登记未动,需逐项决策与实测):B1 产品路径从未启用 Socket KeepAlive(唯一调用点在 client 分支,产品三服务全是 TCP Server, §5.56 要求服务器在 CONNECT 后开,60s/5s/3 参数空转);B2 tcp_connect 返回值丢弃且 CONNECTING 不在对账范围;B3 net_listen_locked 全 8 Socket 读即清会吞别槽事件;B4 全局中断 bit0-3 从不消费、get_unreach_info 零 调用;B5 getsockname 的 s_addr 与本层约定相反致 FTP 日志设备 IP 反序 (PASV 双重反转恰好正确,勿误判);B6 三处判据只看 byte1 未按 byte0 门控;B7 Phase5 单次写 4093B;B8 Phase4 缓冲块与 sock4 交叠;B9 杂项。 验证:产品构建 0 错 0 警、Code=196912(+124B,写路径两条新日志); 测试路径(PHASE2/3/4 打开)单独编译 0/0;内存快照已刷新;doc-links EXIT=0、无 U+FFFD、pre-commit 全绿;@test 闭环 PASS(戳匹配 + 回读无 差异 + 锚点 x1 + 548ms)。
test/ — 测试代码与主机端脚本
测试分两部分,物理隔离在两个子目录:
board/—— 板端测试套件(.c/.h,编入固件由 testTask 执行)host/—— 主机端脚本(.py,PC 侧驱动板子并判读结果)
目录结构
| 目录 | 内容 | README |
|---|---|---|
board/ |
板端测试套件(编入 Keil 工程,占 RAM) | board/README.md |
host/ |
PC 端测试/判读脚本(Python) | host/README.md |
run_all_suites.py |
多套件回归编排(改宏 → 构建 → 烧录 → 采集,try/finally 保证还原开关);--check-build = 只编译不烧录(纯离机) |
本文 §多套件回归 |
运行方式
# @test 一键闭环(推荐)
& '.venv\Scripts\python.exe' .dsh/skills/serial-boot-test/scripts/run_boot_test.py
# 单独校验日志
& '.venv\Scripts\python.exe' .dsh/skills/serial-boot-test/scripts/verify_log.py <日志文件>
# 多套件回归编排(需真机;自动改开关 + 构建 + 烧录 + 采集,结束后还原)
& '.venv\Scripts\python.exe' test/run_all_suites.py
& '.venv\Scripts\python.exe' test/run_all_suites.py --suites STORAGE,GD5F
& '.venv\Scripts\python.exe' test/run_all_suites.py --dry-run # 只看计划
# 只编译不烧录(S6;不需要 MCU / 串口 / ST-LINK,验证 4 套件可编译性)
& '.venv\Scripts\python.exe' test/run_all_suites.py --check-build
退出码约定:0=PASS / 1=FAIL / 2=采集或烧录错误 / 3=用法或预检错误。
多套件回归(run_all_suites.py)
套件互斥(编译期 #error)意味着跑 4 个套件要手工循环 4 轮。本脚本把它编排成一条
命令,并且无条件还原 test_config.h——跑完忘还原 = 测试固件进库,这是它存在的
核心理由(与提交期门禁 test-suite-switch 互为独立防线)。
⚠️ 每轮要真机烧录 + 采集,4 套件约数分钟起;破坏性套件还会改设备持久状态。 仅回归窗口用,绝不挂 pre-commit。
--check-build 则相反:只改宏 + @build,不烧录不采集,无需任何硬件,用于防止
"测试套件长期编不过而无人知"(2026-08~09 CH395F 套件实例)。改动 test/board/ 下测试
代码后建议先跑它——实测 4 套件均 BUILD_OK: 0 errors, 0 warnings。
⚠️ 注意
- 本目录被 pre-commit 门禁排除(测试代码不受 C 规范约束)
board/套件占用 RAM,启用前先核算预算(见docs/内存管理/)- Keil 工程已同步:
board/下 7 个.c编入MDK-ARM/STM32F4-Demo.uvprojx, IncludePath 含../test/board;移动文件须同步改工程文件 - 套件选择开关:
board/test_config.h的TEST_SUITE_*(互斥,一次只启用一个) - 测试缓冲用分 Phase 复用静态缓冲(避免
L6406E溢出)
相关文档
docs/测试说明/测试开发标准流程.md— L0~L3 分层与门禁决策表docs/测试说明/自动化测试流程.md—@test细节与失败模式- 各模块测试指南:
docs/测试说明/*_Test_Guide.md docs/测试说明/链路延迟测试说明.md