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:
@@ -106,7 +106,7 @@ void osDelay(uint32_t ticks)
|
||||
/* 保险:本模块每条用例都必须在有限轮内退出(要么就绪、要么超时、要么由
|
||||
* g_release_after 造事件)。跑飞就说明用例或实现出了问题——直接退出,
|
||||
* 绝不能把挂死留给 pre-commit / CI(上一次就是这么卡住 exe 文件名的)。 */
|
||||
printf(" ABORT 轮询跑飞(>500 轮未退出)\n");
|
||||
printf(" ABORT poll runaway (>500 rounds without exit)\n");
|
||||
fflush(stdout);
|
||||
exit(2);
|
||||
}
|
||||
@@ -147,9 +147,9 @@ static void tc_bounds(void)
|
||||
reset_all();
|
||||
NET_FD_ZERO(&r);
|
||||
CHECK(net_select(0, &r, NULL, NULL, NULL) == -1, "TC-NETSEL-001 nfds=0 -> -1");
|
||||
CHECK(net_select(-1, &r, NULL, NULL, NULL) == -1, "TC-NETSEL-002 nfds 为负 -> -1");
|
||||
CHECK(net_select(-1, &r, NULL, NULL, NULL) == -1, "TC-NETSEL-002 negative nfds -> -1");
|
||||
CHECK(net_select(NET_MAX_SOCKETS + 1, &r, NULL, NULL, NULL) == -1,
|
||||
"TC-NETSEL-003 nfds 越界 -> -1(不许扫出表外)");
|
||||
"TC-NETSEL-003 nfds out of range -> -1 (must not scan past the table)");
|
||||
}
|
||||
|
||||
/* ===================== 就绪位与集合回写 ===================== */
|
||||
@@ -169,14 +169,14 @@ static void tc_ready_sets(void)
|
||||
NET_FD_SET(1, &r);
|
||||
rc = net_select(4, &r, NULL, NULL, NULL);
|
||||
CHECK((rc == 1) && NET_FD_ISSET(1, &r) && !NET_FD_ISSET(0, &r),
|
||||
"TC-NETSEL-004 回写只保留就绪位,未就绪的 fd0 被清掉");
|
||||
"TC-NETSEL-004 write-back keeps only the ready bits; not-ready fd0 is cleared");
|
||||
|
||||
reset_all();
|
||||
make_sock(2, NET_SOCK_STATE_ESTABLISHED, 1u, 0u);
|
||||
NET_FD_ZERO(&r);
|
||||
NET_FD_SET(2, &r);
|
||||
rc = net_select(3, &r, NULL, NULL, NULL); /* write/except 传 NULL */
|
||||
CHECK((rc == 1) && (NET_FD_ISSET(2, &r)), "TC-NETSEL-005 其余集合可为 NULL");
|
||||
CHECK((rc == 1) && (NET_FD_ISSET(2, &r)), "TC-NETSEL-005 the other sets may be NULL");
|
||||
|
||||
/* 注意:timeout 传 NULL 时本函数会一直等到有事件(见 008 的现状说明),
|
||||
* 所以这类用例必须让被请求的 fd 真的就绪,否则就是用例自己写死的死循环。 */
|
||||
@@ -187,7 +187,7 @@ static void tc_ready_sets(void)
|
||||
NET_FD_SET(2, &w);
|
||||
rc = net_select(3, NULL, &w, NULL, NULL);
|
||||
CHECK((rc == 1) && NET_FD_ISSET(2, &w) && (r.fd_bits == 0u),
|
||||
"TC-NETSEL-005b 只回写调用方真正请求过的集合");
|
||||
"TC-NETSEL-005b only the sets the caller actually requested get written back");
|
||||
}
|
||||
|
||||
/* ===================== 超时算术 ===================== */
|
||||
@@ -205,7 +205,7 @@ static void tc_timeout(void)
|
||||
NET_FD_SET(0, &r);
|
||||
rc = net_select(1, &r, NULL, NULL, NULL); /* timeout = NULL:无限等 */
|
||||
CHECK((rc == 1) && (g_delay_calls == 3) && NET_FD_ISSET(0, &r),
|
||||
"TC-NETSEL-006 无限等被对端事件唤醒(第 3 轮)");
|
||||
"TC-NETSEL-006 infinite wait wakes on a peer event (round 3)");
|
||||
|
||||
reset_all();
|
||||
make_sock(0, NET_SOCK_STATE_ESTABLISHED, 0u, 0u);
|
||||
@@ -215,7 +215,7 @@ static void tc_timeout(void)
|
||||
tv.tv_usec = 1999; /* 应为 1ms,不是 2ms */
|
||||
rc = net_select(1, &r, NULL, NULL, &tv);
|
||||
CHECK((rc == 0) && (g_delay_calls == 0),
|
||||
"TC-NETSEL-007 tv_usec 整除截断:1999us 当 1ms,首轮即退");
|
||||
"TC-NETSEL-007 tv_usec integer truncation: 1999us counts as 1ms, exits on the first round");
|
||||
|
||||
/* 已修(2026-10-23):原来这里写的是 (timeout_ms > 0) && (已用时 >= timeout_ms),
|
||||
* timeout = {0,0} 换算出 0 后**永不超时**,只能干等事件——而 POSIX 语义是
|
||||
@@ -229,7 +229,7 @@ static void tc_timeout(void)
|
||||
tv.tv_usec = 0;
|
||||
rc = net_select(1, &r, NULL, NULL, &tv);
|
||||
CHECK((rc == 0) && (g_delay_calls == 0) && !NET_FD_ISSET(0, &r),
|
||||
"TC-NETSEL-008 timeout={0,0} 只查一轮立即返回(与 poll 的 0 对齐)");
|
||||
"TC-NETSEL-008 timeout={0,0} checks one round and returns at once (aligned with poll timeout 0)");
|
||||
}
|
||||
|
||||
/* ===================== 状态准入 ===================== */
|
||||
@@ -250,7 +250,7 @@ static void tc_state_admission(void)
|
||||
tv.tv_usec = 1000;
|
||||
rc = net_select(1, &r, NULL, NULL, &tv);
|
||||
CHECK((rc == 0) && !NET_FD_ISSET(0, &r),
|
||||
"TC-NETSEL-009 监听态不可读(accept 语义不在 select 这层)");
|
||||
"TC-NETSEL-009 listen state is not readable (accept semantics are not in the select layer)");
|
||||
|
||||
reset_all();
|
||||
make_sock(0, NET_SOCK_STATE_ESTABLISHED, 0u, 1u);
|
||||
@@ -258,7 +258,7 @@ static void tc_state_admission(void)
|
||||
NET_FD_SET(0, &w);
|
||||
rc = net_select(1, NULL, &w, NULL, &tv);
|
||||
CHECK((rc == 1) && NET_FD_ISSET(0, &w),
|
||||
"TC-NETSEL-010 已建立 + send_ready 才可写");
|
||||
"TC-NETSEL-010 established + send_ready is what makes it writable");
|
||||
|
||||
reset_all();
|
||||
make_sock(0, NET_SOCK_STATE_CONNECTING, 0u, 1u);
|
||||
@@ -266,7 +266,7 @@ static void tc_state_admission(void)
|
||||
NET_FD_SET(0, &w);
|
||||
rc = net_select(1, NULL, &w, NULL, &tv);
|
||||
CHECK((rc == 0) && !NET_FD_ISSET(0, &w),
|
||||
"TC-NETSEL-011 连接中不可写(send_ready 不作数)");
|
||||
"TC-NETSEL-011 connecting state is not writable (send_ready does not count)");
|
||||
|
||||
/* 已修(2026-10-23):异常判定原先排在 p_sock == NULL → continue 之后,而
|
||||
* check_socket_error() 只有"表项为空 / fd 越界"才返回 1、越界的 i 又不在本循环
|
||||
@@ -279,14 +279,14 @@ static void tc_state_admission(void)
|
||||
NET_FD_SET(0, &r);
|
||||
rc = net_select(1, NULL, NULL, &r, &tv);
|
||||
CHECK((rc == 1) && NET_FD_ISSET(0, &r),
|
||||
"TC-NETSEL-012 表项不存在的 fd 计入异常集合");
|
||||
"TC-NETSEL-012 an fd with no table entry counts into the exception set");
|
||||
reset_all();
|
||||
g_sock_valid[0] = 0u;
|
||||
NET_FD_ZERO(&r);
|
||||
NET_FD_SET(0, &r); /* 只请求可读 */
|
||||
rc = net_select(1, &r, NULL, NULL, &tv);
|
||||
CHECK((rc == 0) && !NET_FD_ISSET(0, &r) && (g_delay_calls == 0),
|
||||
"TC-NETSEL-012b 未请求异常集时不因缺失 fd 计数(不误伤只查可读的调用方)");
|
||||
"TC-NETSEL-012b a missing fd is not counted when the exception set was not requested");
|
||||
reset_all();
|
||||
g_sock_valid[0] = 0u;
|
||||
NET_FD_ZERO(&r);
|
||||
@@ -295,7 +295,7 @@ static void tc_state_admission(void)
|
||||
NET_FD_SET(0, &w); /* 请求异常:应该置位 */
|
||||
rc = net_select(1, &r, NULL, &w, &tv);
|
||||
CHECK((rc == 1) && NET_FD_ISSET(0, &w) && !NET_FD_ISSET(0, &r),
|
||||
"TC-NETSEL-012c 异常位只落到被请求的那个集合,不污染可读集合");
|
||||
"TC-NETSEL-012c the exception bit lands only in the requested set, never polluting the read set");
|
||||
}
|
||||
|
||||
/* ===================== poll 语义 ===================== */
|
||||
@@ -308,7 +308,7 @@ static void tc_poll(void)
|
||||
printf("-- TC-NETSEL-013..019 poll --\n");
|
||||
reset_all();
|
||||
CHECK((net_poll_events(NULL, 1, 0) == -1) && (net_poll_events(p, 0, 0) == -1),
|
||||
"TC-NETSEL-013 poll 参数非法 -> -1");
|
||||
"TC-NETSEL-013 invalid poll arguments -> -1");
|
||||
|
||||
reset_all();
|
||||
(void)memset(p, 0, sizeof(p));
|
||||
@@ -319,7 +319,7 @@ static void tc_poll(void)
|
||||
rc = net_poll_events(p, 2, 0);
|
||||
CHECK((rc == 2) && ((p[0].revents & NET_POLLNVAL) != 0) &&
|
||||
((p[1].revents & NET_POLLNVAL) != 0),
|
||||
"TC-NETSEL-014 负 fd 与越界 fd 都置 POLLNVAL 并计入 ready");
|
||||
"TC-NETSEL-014 negative and out-of-range fd both set POLLNVAL and count as ready");
|
||||
|
||||
reset_all();
|
||||
make_sock(0, NET_SOCK_STATE_CLOSED, 0u, 0u);
|
||||
@@ -328,7 +328,7 @@ static void tc_poll(void)
|
||||
p[0].events = NET_POLLIN;
|
||||
rc = net_poll_events(p, 1, 0);
|
||||
CHECK((rc == 1) && ((p[0].revents & NET_POLLHUP) != 0),
|
||||
"TC-NETSEL-015 CLOSED 置 POLLHUP");
|
||||
"TC-NETSEL-015 CLOSED sets POLLHUP");
|
||||
|
||||
reset_all();
|
||||
make_sock(0, NET_SOCK_STATE_ESTABLISHED, 1u, 0u);
|
||||
@@ -338,7 +338,7 @@ static void tc_poll(void)
|
||||
rc = net_poll_events(p, 1, 0);
|
||||
CHECK((rc == 1) && ((p[0].revents & NET_POLLIN) != 0) &&
|
||||
((p[0].revents & NET_POLLHUP) == 0),
|
||||
"TC-NETSEL-016 可读置 POLLIN 且不误置 HUP");
|
||||
"TC-NETSEL-016 readable sets POLLIN without falsely setting HUP");
|
||||
|
||||
reset_all();
|
||||
make_sock(0, NET_SOCK_STATE_ESTABLISHED, 1u, 1u);
|
||||
@@ -347,7 +347,7 @@ static void tc_poll(void)
|
||||
p[0].events = 0; /* 什么都不请求 */
|
||||
(void)net_poll_events(p, 1, 0);
|
||||
CHECK((p[0].revents & NET_POLLERR) == 0,
|
||||
"TC-NETSEL-017 现状:POLLERR 实际永不为真(表项为空已被 POLLNVAL 抢先)");
|
||||
"TC-NETSEL-017 current state: POLLERR is never true (an empty entry is caught earlier by POLLNVAL)");
|
||||
|
||||
reset_all();
|
||||
make_sock(0, NET_SOCK_STATE_ESTABLISHED, 0u, 0u);
|
||||
@@ -356,7 +356,7 @@ static void tc_poll(void)
|
||||
p[0].events = NET_POLLIN;
|
||||
rc = net_poll_events(p, 1, 0); /* timeout = 0 */
|
||||
CHECK((rc == 0) && (g_delay_calls == 0),
|
||||
"TC-NETSEL-018 poll 的 timeout=0 立即返回(与 select 那条形成对照)");
|
||||
"TC-NETSEL-018 poll timeout=0 returns at once (contrast with the matching select case)");
|
||||
|
||||
reset_all();
|
||||
make_sock(0, NET_SOCK_STATE_ESTABLISHED, 1u, 0u);
|
||||
@@ -365,7 +365,7 @@ static void tc_poll(void)
|
||||
p[0].events = NET_POLLIN;
|
||||
p[0].revents = NET_POLLOUT; /* 脏的上一轮残留 */
|
||||
(void)net_poll_events(p, 1, 0);
|
||||
CHECK((p[0].revents & NET_POLLOUT) == 0, "TC-NETSEL-019 每轮先清 revents");
|
||||
CHECK((p[0].revents & NET_POLLOUT) == 0, "TC-NETSEL-019 revents is cleared at the start of every round");
|
||||
}
|
||||
|
||||
/* ===================== 入口 ===================== */
|
||||
|
||||
Reference in New Issue
Block a user