test(host): 断言字面量统一纯 ASCII,30 文件 1535 行
用户裁定「统一」。口径就是 AGENTS 铁律:字符串字面量必须纯 ASCII (无 BOM 文件里奇数个汉字会吞掉结束引号,偶数才侥幸通过),中文只写注释。 四名队友按目录分四组并行、写范围互斥:net_socket 418 行(6 文件)、 console_log/sys_log_mcu/soe_store/cfg_file_store_mcu 268 行(4 文件)、 11 个存量套件 404 行 + adc_input 89 行、iec104 与 lftpd 与 NET 四套等 356 行 (9 文件)。runner 的 .py 文档串不在口径内(Python 源不经 ARMCC 代码页)。 两套口径必须分清:粗口径(按行切引号)普查 = 34 文件 / 1,552 行;严格口径 (状态机剥掉块/行注释与字符常量后再取字符串字面量)= 30 文件 / 1,535 行。 差值那 4 个文件的命中全在注释里(ns_peers.c、net_socket/stub/ns_rtos.h、 common/ch395f_fake.h、common/fatfs_fake.c)——按口径一处都不该改,改了等于 把中文从注释里搬走、正好违背口径。粗口径绝不能当交付判据,否则要么白改 注释、要么留下「这行为什么没改」的悬案。 Lead 独立终检(不采信自报)五条硬判据,结果 30 文件漂移 0:① 每文件 TC 号 集合与 HEAD 逐字相同 ② 断言宏调用点数不变 ③ 行数与 HEAD 完全相等(专抓 整文件回写把尾部含 main() 吃掉的截断,第 1 轮真发生过两次)④ 剥注释后代码区 非 ASCII 字符 = 0 ⑤ 字节卫生(BOM 与 HEAD 一致、无 CR、无 U+FFFD、单尾换行)。 另用「逐行把字面量整体替换成空串后与 HEAD 必须逐行相等」机械证明只改了字面量; 各套 --module 覆盖率与断言数逐字不变(net_socket 887/889·53/53、console_log 199/200·16/16、sys_log_mcu 324/326·13/13、adc_input 103/103、sys_clock 100/100) → 生产码零改动,基线不需重登。 闸拦下一处真实回归(我的验收器没抓到):ns_s6_edges.c 翻译时把一个上一轮 已整改成平实描述的编号又写回了 CHECK 标签。原因很清楚:「只改字面量」并不 等于「只改无害内容」,标签里完全可以带进未登记族的编号形态;而 Lead 的自动 验收器只比对了 TC 形 id 集合,未覆盖 L/E/N/S/TRAP 等族。教训:批量改标签的 守卫必须加一条「新串不得出现任何已登记前缀族之外的编号形态」,且结构不变式 只覆盖自己想到的维度时不能替代真闸。 Lead 自查另清掉 126 处写坏的反斜杠(JS→Python 转义层数翻倍,把 markdown 反引号写成反斜杠+反引号),恰好发生在记录这条教训的那一节里。 文档:docs/测试说明/主机单测覆盖率口径.md §9 新增「第 2 轮」小节(两套口径对照 表、五条终检判据、六条手法含「转换说明符序列必须逐位相同」取代「禁止裸 %」、 三条协作纪律含先改板再派工与临时文件带组前缀、后续项 3 条)+ 变更记录一行。 后续项(本轮不做):把剥注释词法扫描器收进 scripts 当门禁(需用户点头并先定 test/ 是否纳入 coding-standard);iec104 的简写编号归族(牵 id_registry, 不能顺手做);替换器加「编号形态白名单」校验。 gate: pre-commit run --all-files -> 39 hooks, 37 Passed; failed = mem-numbers + mem-budget(受管快照与本树 .map 的漂移,属第 1 轮生产码改动的遗留,非本批 增量)。本批只碰 test/host/**,不进 Keil 编译面也不进模拟器 CMake,**RAM/Flash 增量 = 0**;实测水位 RW_IRAM1 57.4%、RW_CCM 87.9%,均低于 92% 红线。 id-check 0 台账外新账(可判定 84.63% > 基线 82.6%);test-coverage 33/33 全绿; cppcheck / coding-standard / bsp-err / layer-deps / doc-links 全 Passed。 按仓内分支约定 --no-verify 提交,台账 --write 回填留待主工作树合并后。
This commit is contained in:
@@ -260,7 +260,7 @@ static void tc_read(void)
|
||||
size_t n = 999u;
|
||||
int ok;
|
||||
|
||||
printf("-- TC-CFGFST-001..007 读 --\n");
|
||||
printf("-- TC-CFGFST-001..007 read path --\n");
|
||||
|
||||
/* 001 成功 + 只读模式 */
|
||||
reset_all();
|
||||
@@ -269,14 +269,14 @@ static void tc_read(void)
|
||||
&& (memcmp(buf, "net ip=192.168.1.100\n", 20u) == 0)
|
||||
&& (g_ff_obs.last_open_mode == (BYTE)FA_READ)
|
||||
&& (s_lock_waits == 1) && (s_lock_releases == 1) && (s_lock_seq_err == 0);
|
||||
CHECK(ok, "TC-CFGFST-001 读成功:内容与长度正确,打开模式就是 FA_READ(不带写位)");
|
||||
CHECK(ok, "TC-CFGFST-001 read ok: content and length correct, opened with FA_READ only (no write bit)");
|
||||
|
||||
/* 002 空指针守卫在取锁之前 */
|
||||
reset_all();
|
||||
ok = (cfg_store_read(P_CFG, NULL, sizeof(buf), &n) == -1)
|
||||
&& (cfg_store_read(P_CFG, buf, sizeof(buf), NULL) == -1);
|
||||
CHECK(ok && (s_lock_waits == 0) && (g_ff_obs.calls[FF_FAKE_OP_OPEN] == 0),
|
||||
"TC-CFGFST-002 空指针 -> -1 且不取卷锁(守卫顺序正确)");
|
||||
"TC-CFGFST-002 NULL pointer -> -1 and no volume lock taken (guard order correct)");
|
||||
|
||||
/* 003 卷忙 */
|
||||
reset_all();
|
||||
@@ -284,13 +284,13 @@ static void tc_read(void)
|
||||
ok = (cfg_store_read(P_CFG, buf, sizeof(buf), &n) == -1);
|
||||
CHECK(ok && (g_ff_obs.calls[FF_FAKE_OP_OPEN] == 0) && (s_lock_releases == 0)
|
||||
&& (s_lock_seq_err == 0),
|
||||
"TC-CFGFST-003 卷忙 -> -1:零 FatFs、不 release(没拿到锁不放锁)");
|
||||
"TC-CFGFST-003 volume busy -> -1: zero FatFs calls, no release (never release a lock we do not hold)");
|
||||
|
||||
/* 004 文件缺失:必须已放锁 */
|
||||
reset_all();
|
||||
ok = (cfg_store_read(P_CFG, buf, sizeof(buf), &n) == -1);
|
||||
CHECK(ok && (s_lock_releases == 1) && (s_lock_seq_err == 0),
|
||||
"TC-CFGFST-004 文件缺失 -> -1 **且已释放卷锁**(漏放 = 之后所有卷操作全瘫)");
|
||||
"TC-CFGFST-004 missing file -> -1 **and the volume lock is released** (leaking it paralyses every later volume call)");
|
||||
|
||||
/* 005 cap > 文件大小 */
|
||||
reset_all();
|
||||
@@ -298,7 +298,7 @@ static void tc_read(void)
|
||||
n = 999u;
|
||||
ok = (cfg_store_read(P_CFG, buf, sizeof(buf), &n) == 0) && (n == 3u)
|
||||
&& (g_ff_obs.last_read_btr == 64u) && (g_ff_obs.last_read_br == 3u);
|
||||
CHECK(ok, "TC-CFGFST-005 要 64 只给 3 -> nread=3 且仍算成功(短读不是错误)");
|
||||
CHECK(ok, "TC-CFGFST-005 asked 64 got 3 -> nread=3 and still success (a short read is not an error)");
|
||||
|
||||
/* 006 f_read 失败 */
|
||||
reset_all();
|
||||
@@ -307,7 +307,7 @@ static void tc_read(void)
|
||||
ok = (cfg_store_read(P_CFG, buf, sizeof(buf), &n) == -1);
|
||||
CHECK(ok && (g_ff_obs.calls[FF_FAKE_OP_CLOSE] == 1)
|
||||
&& (s_lock_releases == 1) && (s_lock_seq_err == 0),
|
||||
"TC-CFGFST-006 读失败 -> -1 + close 已配对 + 放锁");
|
||||
"TC-CFGFST-006 read failure -> -1, close paired, lock released");
|
||||
|
||||
/* 007 介质短读:现状是"返回 0 + nread 如实变小",调用方靠 nread 定长度 */
|
||||
reset_all();
|
||||
@@ -315,7 +315,7 @@ static void tc_read(void)
|
||||
ff_fake_inject_read_short(P_CFG, 4u, 1);
|
||||
n = 999u;
|
||||
ok = (cfg_store_read(P_CFG, buf, sizeof(buf), &n) == 0) && (n == 4u);
|
||||
CHECK(ok, "TC-CFGFST-007 注入短读 -> 返回 0、nread=4(上层按 nread 截断使用)");
|
||||
CHECK(ok, "TC-CFGFST-007 injected short read -> returns 0 with nread=4 (caller truncates by nread)");
|
||||
}
|
||||
|
||||
/* ===================== 原子写 ===================== */
|
||||
@@ -326,7 +326,7 @@ static void tc_write_atomic(void)
|
||||
size_t n;
|
||||
int ok;
|
||||
|
||||
printf("-- TC-CFGFST-010..020 原子写(E-01 核心)--\n");
|
||||
printf("-- TC-CFGFST-010..020 atomic write (core of E-01) --\n");
|
||||
|
||||
/* 010 首启写(目标不存在) */
|
||||
reset_all();
|
||||
@@ -337,7 +337,7 @@ static void tc_write_atomic(void)
|
||||
&& (strcmp(g_ff_obs.last_rename_old, "/CONFIG.TMP") == 0)
|
||||
&& (strcmp(g_ff_obs.last_rename_new, "/CONFIG.INI") == 0)
|
||||
&& (s_lock_releases == 1) && (s_lock_seq_err == 0),
|
||||
"TC-CFGFST-010 首启写:TMP -> rename -> 目标 2 字节、TMP 不留痕");
|
||||
"TC-CFGFST-010 first write: TMP -> rename -> target 2 bytes, no TMP left behind");
|
||||
|
||||
/* 011 覆盖写:假卷的 f_rename 对已存在目标返回 FR_EXIST —— 这就是 E-01 */
|
||||
reset_all();
|
||||
@@ -349,7 +349,7 @@ static void tc_write_atomic(void)
|
||||
&& (ff_fake_fetch(P_CFG, buf, 0u, sizeof(buf)) == 3u)
|
||||
&& (memcmp(buf, "new", 3u) == 0)
|
||||
&& (g_ff_obs.calls[FF_FAKE_OP_UNLINK] == unlinks_before + 1),
|
||||
"TC-CFGFST-011 覆盖写:unlink 目标恰一次再 rename -> 新内容落地(E-01)");
|
||||
"TC-CFGFST-011 overwrite: unlink target exactly once then rename -> new content lands (E-01)");
|
||||
}
|
||||
/* 同一条的"反面":直接 rename 到已存在目标必败(证明上一步的 unlink 不是多余的) */
|
||||
{
|
||||
@@ -359,7 +359,7 @@ static void tc_write_atomic(void)
|
||||
(void)ff_fake_mkfile(P_TMP, (const uint8_t *)"x", 1u);
|
||||
fr = f_rename(P_TMP, P_CFG);
|
||||
CHECK(fr == FR_EXIST,
|
||||
"TC-CFGFST-011b 假件保真:目标已存在时 f_rename 返回 FR_EXIST、不覆盖");
|
||||
"TC-CFGFST-011b fake fidelity: f_rename returns FR_EXIST when the target exists, no overwrite");
|
||||
if (fr == FR_OK) {
|
||||
(void)f_close(&probe);
|
||||
}
|
||||
@@ -374,7 +374,7 @@ static void tc_write_atomic(void)
|
||||
* TMP 一定被清掉、锁一定释放、绝不留半成品 */
|
||||
CHECK(ok && (ff_fake_exists(P_TMP) == 0) && (ff_fake_exists(P_CFG) == 0)
|
||||
&& (s_lock_releases == 2) && (s_lock_seq_err == 0),
|
||||
"TC-CFGFST-012 rename 失败 -> -1 + TMP 清理 + 放锁( unlink→rename 窗口如实存在)");
|
||||
"TC-CFGFST-012 rename failure -> -1, TMP cleaned, lock released (the unlink->rename window really exists)");
|
||||
|
||||
/* 013 TMP 打不开 */
|
||||
reset_all();
|
||||
@@ -384,7 +384,7 @@ static void tc_write_atomic(void)
|
||||
CHECK(ok && (ff_fake_size(P_CFG) == 4u) && (g_ff_obs.calls[FF_FAKE_OP_WRITE] == 0)
|
||||
&& (g_ff_obs.calls[FF_FAKE_OP_RENAME] == 0)
|
||||
&& (s_lock_releases == 1) && (s_lock_seq_err == 0),
|
||||
"TC-CFGFST-013 TMP 打开失败 -> -1 且**目标原内容一个字节没动**");
|
||||
"TC-CFGFST-013 TMP open failure -> -1 and **not one byte of the target changed**");
|
||||
|
||||
/* 014 短写 = 失败:TMP 被删、目标不动、不 rename */
|
||||
reset_all();
|
||||
@@ -398,7 +398,7 @@ static void tc_write_atomic(void)
|
||||
&& (ff_fake_fetch(P_CFG, buf, 0u, sizeof(buf)) == 11u)
|
||||
&& (memcmp(buf, "good-config", 11u) == 0)
|
||||
&& (s_lock_seq_err == 0),
|
||||
"TC-CFGFST-014 TMP 短写判失败 -> 删 TMP、不 rename、目标仍是旧内容");
|
||||
"TC-CFGFST-014 TMP short write is a failure -> TMP deleted, no rename, target keeps old content");
|
||||
|
||||
/* 015 len = 0 合法(清空配置) */
|
||||
reset_all();
|
||||
@@ -407,7 +407,7 @@ static void tc_write_atomic(void)
|
||||
n = 999u;
|
||||
CHECK(ok && (ff_fake_size(P_CFG) == 0u)
|
||||
&& (cfg_store_read(P_CFG, buf, sizeof(buf), &n) == 0) && (n == 0u),
|
||||
"TC-CFGFST-015 写 0 字节成功(清空配置),回读 nread=0");
|
||||
"TC-CFGFST-015 writing 0 bytes succeeds (config cleared), read-back gives nread=0");
|
||||
|
||||
/* 016 卷忙:整条链零 I/O */
|
||||
reset_all();
|
||||
@@ -418,13 +418,13 @@ static void tc_write_atomic(void)
|
||||
&& (g_ff_obs.calls[FF_FAKE_OP_RENAME] == 0)
|
||||
&& (g_ff_obs.calls[FF_FAKE_OP_UNLINK] == 0)
|
||||
&& (ff_fake_size(P_CFG) == 4u) && (s_lock_releases == 0),
|
||||
"TC-CFGFST-016 卷忙 -> -1:不建 TMP、不动目标、不 release");
|
||||
"TC-CFGFST-016 volume busy -> -1: no TMP created, target untouched, no release");
|
||||
|
||||
/* 017 p_buf NULL */
|
||||
reset_all();
|
||||
ok = (cfg_store_write_atomic(P_CFG, NULL, 3u) == -1);
|
||||
CHECK(ok && (s_lock_waits == 0) && (g_ff_obs.calls[FF_FAKE_OP_OPEN] == 0),
|
||||
"TC-CFGFST-017 p_buf NULL -> -1 且不取锁");
|
||||
"TC-CFGFST-017 p_buf NULL -> -1 and no lock taken");
|
||||
|
||||
/* 017b 目标路径本身是 NULL:s_build_tmp_path 的空指针分支(读函数有守卫,
|
||||
* 写函数**没有** p_path 的显式守卫,全靠推导函数把它挡在取锁之前) */
|
||||
@@ -433,7 +433,7 @@ static void tc_write_atomic(void)
|
||||
ok = (cfg_store_write_atomic(NULL, (const uint8_t *)"x", 1u) == -1);
|
||||
CHECK(ok && (s_lock_waits == 0) && (g_ff_obs.calls[FF_FAKE_OP_OPEN] == 0)
|
||||
&& (ff_fake_size(P_CFG) == 4u),
|
||||
"TC-CFGFST-017b p_path NULL -> -1:不取锁、不开文件、目标不动");
|
||||
"TC-CFGFST-017b p_path NULL -> -1: no lock, no file open, target untouched");
|
||||
|
||||
/* 018 临时名由目标推导(同目录) */
|
||||
reset_all();
|
||||
@@ -443,22 +443,22 @@ static void tc_write_atomic(void)
|
||||
&& (ff_fake_exists("/cfg/config.TMP") == 0) /* 已被 rename 走,不是留档 */
|
||||
&& (strcmp(g_ff_obs.last_rename_new, "/CFG/A.INI") == 0)
|
||||
&& (ff_fake_size("/cfg/a.ini") == 1u),
|
||||
"TC-CFGFST-018 目标是 /cfg/a.ini -> 临时文件落在同目录 /cfg/config.TMP");
|
||||
"TC-CFGFST-018 target /cfg/a.ini -> temp file lands in the same directory /cfg/config.TMP");
|
||||
CHECK(strcmp(cfg_store_tmp_path(), P_TMP) == 0,
|
||||
"TC-CFGFST-018b getter 仍是卷根 /config.TMP(与 s_path_tmp 同源)");
|
||||
"TC-CFGFST-018b getter still reports the volume root /config.TMP (same source as s_path_tmp)");
|
||||
|
||||
/* 019 目录太长 -> 推导失败,且发生在取锁之前 */
|
||||
reset_all();
|
||||
ok = (cfg_store_write_atomic("/this/is/a/very/deep/dir/name/x.ini",
|
||||
(const uint8_t *)"y", 1u) == -1);
|
||||
CHECK(ok && (s_lock_waits == 0) && (g_ff_obs.calls[FF_FAKE_OP_OPEN] == 0),
|
||||
"TC-CFGFST-019 临时名缓冲放不下 -> -1 且不取锁(不拿半截路径去开文件)");
|
||||
"TC-CFGFST-019 temp name does not fit the buffer -> -1, no lock (never open a file with a truncated path)");
|
||||
|
||||
/* 020 陷阱一在本模块同样成立 */
|
||||
reset_all();
|
||||
(void)cfg_store_write_atomic(P_CFG, (const uint8_t *)"m", 1u);
|
||||
CHECK((g_ff_obs.last_open_mode & FA_WRITE) != 0u,
|
||||
"TC-CFGFST-020 写 TMP 的句柄必带 FA_WRITE(这里用 CREATE_ALWAYS,不是 APPEND)");
|
||||
"TC-CFGFST-020 the TMP handle must carry FA_WRITE (CREATE_ALWAYS here, not APPEND)");
|
||||
reset_all();
|
||||
{
|
||||
static FIL probe;
|
||||
@@ -470,7 +470,7 @@ static void tc_write_atomic(void)
|
||||
fr2 = f_write(&probe, "abc", 3u, &bw);
|
||||
(void)f_close(&probe);
|
||||
CHECK((fr1 == FR_OK) && (fr2 == FR_DENIED) && (bw == 0u),
|
||||
"TC-CFGFST-020b 只给 FA_CREATE_ALWAYS -> 打开成功但 f_write 恒 FR_DENIED");
|
||||
"TC-CFGFST-020b FA_CREATE_ALWAYS alone -> open succeeds but f_write is always FR_DENIED");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -484,7 +484,7 @@ static void tc_stat_remove(void)
|
||||
int rel;
|
||||
int ok;
|
||||
|
||||
printf("-- TC-CFGFST-030..033 状态令牌与删除 --\n");
|
||||
printf("-- TC-CFGFST-030..033 stat token and remove --\n");
|
||||
|
||||
/* 030 size + 令牌 */
|
||||
reset_all();
|
||||
@@ -498,7 +498,7 @@ static void tc_stat_remove(void)
|
||||
ok = ok && (cfg_store_stat(P_CFG, &st) == 0) && (st.mtime == tok2)
|
||||
&& (tok1 != tok2);
|
||||
CHECK(ok && (s_lock_seq_err == 0) && (s_lock_releases == s_lock_waits),
|
||||
"TC-CFGFST-030 令牌 = (fdate<<16)|ftime,日期进位一定换令牌");
|
||||
"TC-CFGFST-030 token = (fdate<<16)|ftime, a date rollover must change the token");
|
||||
|
||||
/* 031 盲区:同一分钟、同长度重写 -> 令牌不变 */
|
||||
reset_all();
|
||||
@@ -510,7 +510,7 @@ static void tc_stat_remove(void)
|
||||
(void)cfg_store_write_atomic(P_CFG, (const uint8_t *)"bbbb", 4u);
|
||||
(void)cfg_store_stat(P_CFG, &st);
|
||||
CHECK(ok && (st.size == 4u) && (st.mtime == before),
|
||||
"TC-CFGFST-031 同分钟同长度重写 -> 令牌不变(poll 检不出,设计已接受)");
|
||||
"TC-CFGFST-031 rewrite in the same minute with the same length -> token unchanged (poll cannot see it, accepted by design)");
|
||||
}
|
||||
|
||||
/* 032 stat 三种 -1 */
|
||||
@@ -526,7 +526,7 @@ static void tc_stat_remove(void)
|
||||
ff_fake_inject_rc(P_CFG, FF_FAKE_OP_STAT, FR_DISK_ERR, 1);
|
||||
ok = ok && (cfg_store_stat(P_CFG, &st) == -1) && (s_lock_releases == rel + 1)
|
||||
&& (s_lock_seq_err == 0);
|
||||
CHECK(ok, "TC-CFGFST-032 stat:NULL 守卫/缺失/卷忙/读错误四种出口的放锁配对");
|
||||
CHECK(ok, "TC-CFGFST-032 stat: lock pairing on all four exits (NULL guard / missing / busy / read error)");
|
||||
|
||||
/* 033 remove */
|
||||
reset_all();
|
||||
@@ -539,7 +539,7 @@ static void tc_stat_remove(void)
|
||||
lock_busy_next(1);
|
||||
ok = ok && (cfg_store_remove(P_CFG) == -1) && (s_lock_releases == rel + 2)
|
||||
&& (s_lock_seq_err == 0);
|
||||
CHECK(ok, "TC-CFGFST-033 remove:成功 / 已不存在的 -1 / 卷忙的 -1 与放锁配对");
|
||||
CHECK(ok, "TC-CFGFST-033 remove: success / -1 when already gone / -1 when busy, each with lock pairing");
|
||||
}
|
||||
|
||||
/* ===================== 路径与 8.3(陷阱二) ===================== */
|
||||
@@ -559,7 +559,7 @@ static void tc_names(void)
|
||||
FRESULT fr_colon;
|
||||
int ok;
|
||||
|
||||
printf("-- TC-CFGFST-040..042 路径合规与「名字错不升级成卷操作」 --\n");
|
||||
printf("-- TC-CFGFST-040..042 path legality, name errors never escalate to volume ops --\n");
|
||||
|
||||
/* 040 生产路径真的可用(改名即静默失败的第一道防线) */
|
||||
reset_all();
|
||||
@@ -568,7 +568,7 @@ static void tc_names(void)
|
||||
&& (f_close(&probe) == FR_OK)
|
||||
&& (f_open(&probe, cfg_store_tmp_path(), FA_WRITE | FA_CREATE_ALWAYS) == FR_OK)
|
||||
&& (f_close(&probe) == FR_OK);
|
||||
CHECK(ok, "TC-CFGFST-040 /config.ini 与 /config.TMP 都是合法 8.3,真能在卷上建出来");
|
||||
CHECK(ok, "TC-CFGFST-040 /config.ini and /config.TMP are valid 8.3 names and really get created on the volume");
|
||||
|
||||
/* 041 短名违规分档 */
|
||||
reset_all();
|
||||
@@ -585,7 +585,7 @@ static void tc_names(void)
|
||||
CHECK((fr_body == FR_INVALID_NAME) && (fr_ext == FR_INVALID_NAME)
|
||||
&& (fr_bad == FR_INVALID_NAME) && (fr_dot == FR_INVALID_NAME)
|
||||
&& (fr_colon == FR_INVALID_DRIVE),
|
||||
"TC-CFGFST-041 分档:体>8 / 扩展>3 / 非法字符 / 点开头 -> FR_INVALID_NAME;':' -> FR_INVALID_DRIVE");
|
||||
"TC-CFGFST-041 classes: body>8 / ext>3 / bad char / leading dot -> FR_INVALID_NAME; ':' -> FR_INVALID_DRIVE");
|
||||
|
||||
/* 042 名字类错误码绝不升级成卷操作:非法目标名走一遍原子写 */
|
||||
reset_all();
|
||||
@@ -599,7 +599,7 @@ static void tc_names(void)
|
||||
CHECK(ok && ((uint32_t)ff_fake_count_entries() == ents_before)
|
||||
&& (ff_fake_size(P_CFG) == 4u) && (s_lock_seq_err == 0)
|
||||
&& (s_lock_releases == rel + 3),
|
||||
"TC-CFGFST-042 非法名只让本次调用失败:条目数不变、已有配置不动、锁把把放过");
|
||||
"TC-CFGFST-042 an illegal name fails only this call: entry count unchanged, existing config intact, lock always released");
|
||||
/* 非法目标名进原子写:推导出的 TMP 也非法 -> 第一步开文件就失败,
|
||||
* 绝不能把已经存在的目标删掉 */
|
||||
reset_all();
|
||||
@@ -608,7 +608,7 @@ static void tc_names(void)
|
||||
ok = (cfg_store_write_atomic("/badname-tooooo-long.ini", (const uint8_t *)"x", 1u) == -1);
|
||||
CHECK(ok && (ff_fake_size(P_CFG) == 4u)
|
||||
&& ((uint32_t)ff_fake_count_entries() == ents_before),
|
||||
"TC-CFGFST-042b 非法目标名的原子写整条失败,**不碰已有配置文件**");
|
||||
"TC-CFGFST-042b an atomic write to an illegal target fails whole, **never touching the live config file**");
|
||||
}
|
||||
|
||||
/* ===================== 堆 ===================== */
|
||||
@@ -618,7 +618,7 @@ static void tc_heap(void)
|
||||
void *p;
|
||||
void *q;
|
||||
|
||||
printf("-- TC-CFGFST-050..053 分配后端(优化调研 P0 第 1 条)--\n");
|
||||
printf("-- TC-CFGFST-050..053 allocation backend (P0 item 1 of the optimisation study) --\n");
|
||||
|
||||
/* 050 成对归还 */
|
||||
reset_all();
|
||||
@@ -626,7 +626,7 @@ static void tc_heap(void)
|
||||
(void)cfg_store_free(p);
|
||||
CHECK((p != NULL) && (s_heap_alloc_calls == 1) && (s_heap_free_calls == 1)
|
||||
&& (s_heap_used == 0u) && (s_heap_free_err == 0),
|
||||
"TC-CFGFST-050 alloc/free 走 FreeRTOS 堆且成对归还(借多少还多少)");
|
||||
"TC-CFGFST-050 alloc/free go through the FreeRTOS heap and return in pairs (give back what was taken)");
|
||||
|
||||
/* 051 分配失败如实返回 NULL */
|
||||
reset_all();
|
||||
@@ -635,19 +635,19 @@ static void tc_heap(void)
|
||||
q = cfg_store_alloc(8u);
|
||||
cfg_store_free(p); /* NULL 必须安全 */
|
||||
CHECK((p == NULL) && (q == NULL) && (s_heap_free_calls == 0),
|
||||
"TC-CFGFST-051 堆见底 -> cfg_store_alloc 返回 NULL(MicroLIB 512B 的真形态)");
|
||||
"TC-CFGFST-051 heap exhausted -> cfg_store_alloc returns NULL (the real MicroLIB 512B shape)");
|
||||
|
||||
/* 052 free(NULL) 安全 + 不计数 */
|
||||
reset_all();
|
||||
cfg_store_free(NULL);
|
||||
CHECK((s_heap_free_calls == 0) && (s_heap_free_err == 0),
|
||||
"TC-CFGFST-052 cfg_store_free(NULL) 不触碰分配器");
|
||||
"TC-CFGFST-052 cfg_store_free(NULL) does not touch the allocator");
|
||||
|
||||
/* 053 heap_free 转发 */
|
||||
reset_all();
|
||||
(void)cfg_store_alloc(100u);
|
||||
CHECK(cfg_store_heap_free() == (FAKE_HEAP_CAP - 100u),
|
||||
"TC-CFGFST-053 cfg_store_heap_free 原样转发 xPortGetFreeHeapSize");
|
||||
"TC-CFGFST-053 cfg_store_heap_free forwards xPortGetFreeHeapSize verbatim");
|
||||
}
|
||||
|
||||
/* ===================== 入口 ===================== */
|
||||
|
||||
Reference in New Issue
Block a user