fix(104): 消掉 cppcheck 两根常驻红——回显不再传未初始化缓冲、blen 收作用域

L0 静态门禁(pre-commit)历史 36 次启动里 28 红 / 7 绿 / 1 取消,最后一次绿是
10-12 19:17 的 run 23;此后连续全红。恒定的一根就是 cppcheck:本机(与 runner
同机、同一 Machine 级 Cppcheck 2.21.0)以钩子原样参数复现,诊断与 runner 日志
task-54/58/60/62/64、以及 master 上那条「Failing after 6m49s」的归档 run 26
逐字一致——不是版本漂移,也不是抑制文件缺失。

两条诊断与处置:
- s_cmd_con:body 仅在 n>0 时写入,n==0(回显超长退化为空信息体)时把未初始
  化缓冲连同长度 0 一起传给 s_send_asdu。现实现内 len>0 才 memcpy,故无运行时
  缺陷,但契约脆弱、门禁照拦。改为把 body 声明收进真要回显的分支,空信息体
  分支显式传 NULL。
- s_spont_step:blen 只在 pend_yx 分支使用,声明移入该分支。

验证(基线 b24b2b5):cppcheck 原样复刻钩子 args → RC=0 零输出;@build 0 错误
0 警告(Code 231712→231732,+20 B);ram_baseline.py --update 重盖体积同码凭证、
--write 同步受管区台账,check_mem_numbers.py --write 同步 RAM 快照表。本次触发的
14 根钩子全 Passed(含 test-coverage)。

环境与遗留(非本笔引入):这台 runner 原本只有 VS2019/MSVC 14.29,没有
Microsoft.CodeCoverage.Console.exe,test-coverage 恒 [ENV] exit 2;今日已装
VS2026 BuildTools 18.11.12324.101(E 盘,含 mscoverage 18.11 与 MSVC
14.44/14.51/14.52),本笔按 14.51.36231 跑通覆盖率总闸 40/40 套、相对基线零
回退——与量基线那台同版本,故分母可比。CI 侧仍差两步:① 机器级 DTU_MSVC_CL
还指 C 盘 14.29,需改指 E 盘这套并重启 runner 守护进程(SYSTEM 只在进程启动
时读机器变量);② ci_runner_bootstrap.ps1 的 Find-MsvcCl 只扫 %ProgramFiles%
派生的 C 盘根且取首个命中(2019 在前),重跑 -SetEnv 会把对齐抹掉,应改用
vswhere + 版本降序。
This commit is contained in:
2026-10-27 04:27:11 +08:00
parent b24b2b5f31
commit 5869c0307b
5 changed files with 22 additions and 15 deletions
+12 -6
View File
@@ -161,18 +161,23 @@ static int s_send_asdu(iec104_link_t *lk, uint8_t type, uint8_t vsq,
*/
static void s_cmd_con(iec104_link_t *lk, uint8_t type, const uint8_t *obj,
uint16_t obj_len, uint8_t cot, uint8_t pn) {
uint8_t body[BODY_MAX];
uint16_t n = obj_len;
if (n > BODY_MAX) {
n = 0u;
n = 0u; /* 超长回显退化为空信息体 */
}
if (n > 0u) {
uint8_t body[BODY_MAX]; /* 作用域收进真要回显的分支,不把未初始化缓冲传下去 */
(void)memcpy(body, obj, n);
(void)s_send_asdu(lk, type, 1u, cot,
(pn != 0u) ? IEC104_COT_BIT_PN : 0u,
0u, 0u, body, n, 0u);
} else {
(void)s_send_asdu(lk, type, 1u, cot,
(pn != 0u) ? IEC104_COT_BIT_PN : 0u,
0u, 0u, NULL, 0u, 0u);
}
(void)s_send_asdu(lk, type, 1u, cot,
(pn != 0u) ? IEC104_COT_BIT_PN : 0u,
0u, 0u, body, n, 0u);
}
/* ---------------- 数据上送 ---------------- */
@@ -280,12 +285,13 @@ static void s_spont_step(iec104_link_t *lk, uint8_t *budget) {
uint8_t body[8]; /* 最大 = SIQ + CP56(7)(M_SP_TB_1) */
uint8_t i;
uint8_t d;
uint8_t blen;
uint8_t type;
int rc;
while ((*budget > 0u) && ((lk->pend_yx != 0u) || (lk->pend_yc != 0u))) {
if (lk->pend_yx != 0u) {
uint8_t blen;
i = 0u;
while (i < 33u) {
if ((lk->pend_yx & (1uLL << i)) != 0u) {