test(NET/lftpd): P1 增补 lftpd_io 模块(33 条),登记 FTP 域一处潜伏缺陷
新增 test/host/lftpd_io/:一个 TU 同时纳入生产源 lftpd_io.c 与 lftpd_string.c (两者静态符号不冲突,省一套桩),33 条断言全部 MSVC 编译通过并 PASS。 钉住的契约(都是真机上偶发、日志看不出根因的那类): - 路径规范化:**".." 上跳过头仍被钳在根内**("/a" + "../../x" = "/x")——FTP 客户端 可发任意路径,这是安全属性;绝对名忽略 base、"." 丢弃、段间多余斜杠折叠、 NULL 入参容忍、全空结果归 "/"。 - 分配失败:这个函数返回 pvPortMalloc 出来的指针(历史上正是它落在 C 库 malloc 上, RAM 方案 §4.2.1)。用**可注入失败的假堆**跑两条分支:首块失败 → NULL;结果缓冲 失败 → NULL **且第一块已 vPortFree**(不泄漏堆)。模拟器宿主 CRT 永不失败,这条 只有假堆能构造。 - 卷锁时机:open 成功**故意不释放**(整个传输期独占卷,由 close 释放),失败必须 释放并留 ERROR;单文件槽守卫 s_file_open 命中时**不碰卷锁也不碰 FatFs**。 - 等卷锁循环每轮喂看门狗(lftpd_task_wd_beat):defaultTask 与 FTP 争卷时这里可能 空转上百毫秒,漏喂就是整机复位。脚本化 vol_lock_wait 的返回序列直接构造 2 轮空等。 - lftpd_string_trim:行首空白由**返回指针**跳过、原缓冲不搬移(调用点 lftpd.c 用的 正是返回值);全空白串返回空串。 **本批照出一处,未改语义、只登记**:lftpd_string_trim 的尾部循环写成 for (i = strlen(p); i >= 0 && isspace(p[i]); i--),i 起步那格是 NUL、isspace(0) 为假 → 循环一次都不执行,**尾部空白与 CRLF 从未被裁掉**。今天不发作是因为 CRLF 在 lftpd_inet_read_line 里已用 strstr 截断、且唯一调用点只关心行首;风险在于"以后有人 拿它去尾部空白"不会生效。修法只要一行(i 从 strlen(p)-1 起),但那会改变 FTP 参数 (含空格的文件名/口令)的可见行为,需要 FTP 域一起过,**留给用户裁定**;当前用 TC-LFTSTR-005 把现状钉成"改了会响"(明确标注是现状桩、不是期望行为)。 未覆盖也写在文件头:lftpd_io_read/write/close/stat/unlink/opendir/readdir/closedir 要先把假 FIL/FILINFO 的字段语义(fptr、obj.objsize、fname 等)做实,否则断言会落在 假件自己写的规则上;这 8 个 f_* 只给了可链接的 FR_INT_ERR 实现,走进即失败不静默。 覆盖率:套件 20 → 21 全绿;files_tested 23 → 25;未触及 .c 43 → 41;分母 3,163 → 3,332 行;lftpd_io.c 85/159(53.5%)、lftpd_string.c 8/10。总体 line_rate 88.9% → 87.2% —— **这是摊薄不是回退**(新进来的文件只测了一半,分母涨得比分子快),已按 §5 口径写进口径文档 §9 的落地进度表;恒等式更新为 41 = 7(P1 剩) + 5(P2) + 29(P3)。 编号:按 B 层口径补建 2 族 TC-HOST-LFTPIO(游标 037)与 TC-HOST-LFTSTR(005), TC-HOST 族现共 **15** 族;id_registry.json 仍只做增量插入(无重排)。 自查:test-cppcheck Passed;coding-standard Passed;check_ids --strict 通过(无台账外 新账);check_doc_links --all = 35 处(= 存量,本分支贡献 0);新增/改动文件 BOM/CR/ U+FFFD/行尾卫生逐项净。**本增量零生产代码改动**(只加测试、注册表与文档),故未跑 @build。pre-commit --all-files 仍只有三条失败且与本分支无关:mem-numbers / mem-budget (本 worktree 上次 @build 生成的 .map 与受管快照漂移,增量 ER_IROM1 +12B、RW_IRAM1 +8B、CCM 0,按并行分支约定不在分支里 --write,等 Lead 合并后统一回填)与 ui-golden (simulator/tests/ref/*.bin 在 .gitignore 内,新 worktree 天生没有黄金参考)。
This commit is contained in:
@@ -168,6 +168,22 @@
|
||||
"lines_covered": 37,
|
||||
"lines_valid": 38
|
||||
},
|
||||
"Drivers/BSP/NET/lftpd/lftpd_io.c": {
|
||||
"func_rate": 0.3846,
|
||||
"funcs_covered": 5,
|
||||
"funcs_valid": 13,
|
||||
"line_rate": 0.5346,
|
||||
"lines_covered": 85,
|
||||
"lines_valid": 159
|
||||
},
|
||||
"Drivers/BSP/NET/lftpd/lftpd_string.c": {
|
||||
"func_rate": 1.0,
|
||||
"funcs_covered": 1,
|
||||
"funcs_valid": 1,
|
||||
"line_rate": 0.8,
|
||||
"lines_covered": 8,
|
||||
"lines_valid": 10
|
||||
},
|
||||
"Drivers/BSP/NETCFG/ftp_cfg.c": {
|
||||
"func_rate": 1.0,
|
||||
"funcs_covered": 4,
|
||||
@@ -246,6 +262,14 @@
|
||||
"lines_total": 1193,
|
||||
"ok": true
|
||||
},
|
||||
"lftpd_io": {
|
||||
"files": {
|
||||
"Drivers/BSP/NET/lftpd/lftpd_io.c": 159,
|
||||
"Drivers/BSP/NET/lftpd/lftpd_string.c": 10
|
||||
},
|
||||
"lines_total": 169,
|
||||
"ok": true
|
||||
},
|
||||
"nand_port": {
|
||||
"files": {
|
||||
"Drivers/BSP/GD5F2GQ5UE/nand_ftl.c": 253
|
||||
@@ -369,21 +393,23 @@
|
||||
"App/util/task_watchdog.c",
|
||||
"Drivers/BSP/GD5F2GQ5UE/nand_ftl.c",
|
||||
"Drivers/BSP/NET/lftpd/lftpd_auth.c",
|
||||
"Drivers/BSP/NET/lftpd/lftpd_io.c",
|
||||
"Drivers/BSP/NET/lftpd/lftpd_string.c",
|
||||
"Drivers/BSP/NETCFG/ftp_cfg.c",
|
||||
"Drivers/BSP/NETCFG/net_cfg.c"
|
||||
],
|
||||
"totals": {
|
||||
"files_generated_excluded": 5,
|
||||
"files_tested": 23,
|
||||
"files_untested": 121,
|
||||
"func_rate": 0.9375,
|
||||
"funcs_covered": 225,
|
||||
"funcs_valid": 240,
|
||||
"line_rate": 0.8887,
|
||||
"lines_covered": 2811,
|
||||
"lines_valid": 3163,
|
||||
"modules_ok": 20,
|
||||
"modules_total": 20
|
||||
"files_tested": 25,
|
||||
"files_untested": 119,
|
||||
"func_rate": 0.9094,
|
||||
"funcs_covered": 231,
|
||||
"funcs_valid": 254,
|
||||
"line_rate": 0.8715,
|
||||
"lines_covered": 2904,
|
||||
"lines_valid": 3332,
|
||||
"modules_ok": 21,
|
||||
"modules_total": 21
|
||||
},
|
||||
"untested_sources": [
|
||||
{
|
||||
@@ -438,10 +464,6 @@
|
||||
"code_lines": 263,
|
||||
"path": "Drivers/BSP/NET/net_events.c"
|
||||
},
|
||||
{
|
||||
"code_lines": 207,
|
||||
"path": "Drivers/BSP/NET/lftpd/lftpd_io.c"
|
||||
},
|
||||
{
|
||||
"code_lines": 206,
|
||||
"path": "Drivers/BSP/CH395F/ch395f.h"
|
||||
@@ -790,10 +812,6 @@
|
||||
"code_lines": 11,
|
||||
"path": "App/task/ui_task.h"
|
||||
},
|
||||
{
|
||||
"code_lines": 11,
|
||||
"path": "Drivers/BSP/NET/lftpd/lftpd_string.c"
|
||||
},
|
||||
{
|
||||
"code_lines": 11,
|
||||
"path": "Drivers/BSP/NET/lftpd/private/lftpd_inet.h"
|
||||
|
||||
Reference in New Issue
Block a user