From c1e7e8c42c2d3642e9beeab7b719fc0c70d49e73 Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Tue, 27 Oct 2026 10:34:39 +0800 Subject: [PATCH] =?UTF-8?q?fix(104):=20=E6=8B=86=E6=8E=89=E5=9B=9B?= =?UTF-8?q?=E5=A4=84=E6=81=92=E5=81=87=E7=9A=84=E4=B8=8A=E7=95=8C=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E2=80=94=E2=80=94=E5=90=88=E6=B3=95=E5=B8=A6=E5=8F=AA?= =?UTF-8?q?=E6=94=B9=E5=88=A4=E4=B8=8B=E7=95=8C=EF=BC=8C=E5=8F=A3=E5=BE=84?= =?UTF-8?q?=E4=B8=8D=E5=8F=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit L0 的 cppcheck 在 --all-files 下恒红四处,全在同一文件: App/protocol/iec104/iec104_comm.c 的 80 / 94 / 107 / 121 行,诊断为 compareValueOutOfTypeRangeError —— 拿 unsigned short 与 65535 比较, Condition is always false。根因是 IEC104_COMM_CA_MAX 与 PORT_MAX 都等于 65535u,而被比较的量是 uint16_t:那个上界判断在类型上就不可能成立。 这四处随上游 iec104_comm 落地进来,本地提交只跑暂存文件所以没人看见, CI 跑 --all-files 就每轮都红(同族盲区:暂存面与全量面不等价)。 处置走「语义不动」那一支(用户裁定 2026-10-27:A):只删恒假的半边、 改判 if (v < MIN),合法带口径一字未改(仍照 iec104_comm.h 的常量注释: ca 1..65535、port 1024..65535),只在第一处写清为何不再写上界、其余三处 短引用。没有把 MAX 改成 65534(按 60870-5-104 的 65535 = 未编址),因为 test/host/iec104/iec104_test.c:1521 明确断言 ca 设成 IEC104_COMM_CA_MAX 必须被接受——那会同时打断这条断言并改变现场设备行为(配 65535 的站会 突然回退工厂默认),属协议决定,不在本次范围;要改请单独裁。 验证:单文件 cppcheck 原样复刻钩子参数 → RC=0;cppcheck --all-files 由 红转绿;iec104-unit-test Passed(即 65535 那条合同照过);@build 0 错误 0 警告(Code 231732→231720,减 12 B,RO/RW/ZI 不变);凭证与两份台账 随之重盖(ER_IROM1 257,292→257,280、Flash 合计 258,812→258,800); 本次触发的 13 根钩子全 Passed,含 test-coverage(删掉 4 行已覆盖代码 未被判成回退)。 --- App/protocol/iec104/iec104_comm.c | 12 ++++++++---- docs/内存管理/RAM使用分析与优化方案.md | 4 ++-- docs/内存管理/RAM预算台账.md | 2 +- scripts/ram_baseline.tsv | 2 +- scripts/size_attestation.json | 12 ++++++------ 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/App/protocol/iec104/iec104_comm.c b/App/protocol/iec104/iec104_comm.c index a8f9e52e..8afd15a5 100644 --- a/App/protocol/iec104/iec104_comm.c +++ b/App/protocol/iec104/iec104_comm.c @@ -77,7 +77,11 @@ int iec104_comm_init(void) { uint16_t iec104_comm_ca(void) { uint16_t v = s_comm.ca; - if ((v < IEC104_COMM_CA_MIN) || (v > IEC104_COMM_CA_MAX)) { + /* 只判下界。上界 IEC104_COMM_CA_MAX 就是 uint16_t 的最大值,写成 + * 「v > 65535」对 uint16_t 恒假(cppcheck compareValueOutOfTypeRangeError), + * 留着只会让下一个读代码的人以为上界真被守过。合法带口径不变, + * 仍照 iec104_comm.h 的常量注释(ca 1..65535 / port 1024..65535)。 */ + if (v < IEC104_COMM_CA_MIN) { return IEC104_COMM_DEF_CA; } return v; @@ -91,7 +95,7 @@ uint16_t iec104_comm_ca(void) { uint16_t iec104_comm_port(void) { uint16_t v = s_comm.port; - if ((v < IEC104_COMM_PORT_MIN) || (v > IEC104_COMM_PORT_MAX)) { + if (v < IEC104_COMM_PORT_MIN) { /* 上界恒假,同 iec104_comm_ca 处注释 */ return IEC104_COMM_DEF_PORT; } return v; @@ -104,7 +108,7 @@ uint16_t iec104_comm_port(void) { * 限定条件:UI 保存交接路(task-9);落盘走 SYS_EVT_CFG_SAVE 整档外科 save */ int iec104_comm_ca_set(uint16_t ca) { - if ((ca < IEC104_COMM_CA_MIN) || (ca > IEC104_COMM_CA_MAX)) { + if (ca < IEC104_COMM_CA_MIN) { /* 上界恒假,同 iec104_comm_ca 处注释 */ return -1; } s_comm.ca = ca; @@ -118,7 +122,7 @@ int iec104_comm_ca_set(uint16_t ca) { * 限定条件:同 iec104_comm_ca_set */ int iec104_comm_port_set(uint16_t port) { - if ((port < IEC104_COMM_PORT_MIN) || (port > IEC104_COMM_PORT_MAX)) { + if (port < IEC104_COMM_PORT_MIN) { /* 上界恒假,同 iec104_comm_ca 处注释 */ return -1; } s_comm.port = port; diff --git a/docs/内存管理/RAM使用分析与优化方案.md b/docs/内存管理/RAM使用分析与优化方案.md index c606c3a5..1f50e287 100644 --- a/docs/内存管理/RAM使用分析与优化方案.md +++ b/docs/内存管理/RAM使用分析与优化方案.md @@ -47,10 +47,10 @@ dhara 失败类 +84;RO 另 +208,全是该失败类名表)→ `ER_IROM1` | 区域 | 用量 | 容量 | 占比 | |---|---|---|---| -| ER_IROM1 | 257,292 B (251.26 KB) | 1,048,576 B (1024 KB) | 24.5% | +| ER_IROM1 | 257,280 B (251.25 KB) | 1,048,576 B (1024 KB) | 24.5% | | RW_IRAM1 | 80,312 B (78.43 KB) | 131,072 B (128 KB) | 61.3% | | RW_CCM | 57,376 B (56.03 KB) | 65,280 B (64 KB) | 87.9% | -| **Flash (ROM 合计)** | **258,812 B (252.7 KB)** | 1,048,576 B (1024 KB) | **24.7%** | +| **Flash (ROM 合计)** | **258,800 B (252.7 KB)** | 1,048,576 B (1024 KB) | **24.7%** | 各区的容量与常量来源: diff --git a/docs/内存管理/RAM预算台账.md b/docs/内存管理/RAM预算台账.md index e4cd5e76..edbbd871 100644 --- a/docs/内存管理/RAM预算台账.md +++ b/docs/内存管理/RAM预算台账.md @@ -15,7 +15,7 @@ | 区域 | 用量 | 容量 | 占比 | 门禁(≤92%) | |---|---|---|---|---| -| ER_IROM1 (Flash) | 257,292 B | 1,048,576 B | 24.5% | 参考 | +| ER_IROM1 (Flash) | 257,280 B | 1,048,576 B | 24.5% | 参考 | | RW_CCM | 57,376 B | 65,280 B | 87.9% | PASS | | UNINIT_CCM | 48 B | 256 B | 18.8% | 参考 | | RW_IRAM1 | 80,312 B | 131,072 B | 61.3% | PASS | diff --git a/scripts/ram_baseline.tsv b/scripts/ram_baseline.tsv index 67f802bf..7663c981 100644 --- a/scripts/ram_baseline.tsv +++ b/scripts/ram_baseline.tsv @@ -9,4 +9,4 @@ date code ro rw zi er_irom1 er_pct iram1 iram1_pct ccm ccm_pct top_rwzi 2026-10-24 213780 18860 1204 131852 232640 22.2 75632 57.7 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6766;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4128;sys_log_mcu.o=3944;default_task.o=2736 2026-10-25 224860 24640 1332 135100 249500 23.8 79008 60.3 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6770;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4128;sys_log_mcu.o=3944;default_task.o=2736 2026-10-26 231712 25560 1520 136216 257272 24.5 80312 61.3 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6770;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4132;sys_log_mcu.o=4003;default_task.o=2736 -2026-10-27 231732 25560 1520 136216 257292 24.5 80312 61.3 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6770;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4132;sys_log_mcu.o=4003;default_task.o=2736 +2026-10-27 231720 25560 1520 136216 257280 24.5 80312 61.3 57376 87.9 heap_4.o=57376;lv_mem_core_builtin.o=16384;lftpd.o=7884;ui_net_sink.o=6770;ui_port.o=6420;nand_ftl.o=6216;ch395f.o=4162;console_log.o=4132;sys_log_mcu.o=4003;default_task.o=2736 diff --git a/scripts/size_attestation.json b/scripts/size_attestation.json index b14b31d1..57a497ee 100644 --- a/scripts/size_attestation.json +++ b/scripts/size_attestation.json @@ -1,15 +1,15 @@ { - "built_at": "2026-10-27T04:22:20+08:00", - "fingerprint": "5ab1da8af5fdc79575db4a1f7d9838660a23d953a533e3b78c6dd681c5d7bb22", + "built_at": "2026-10-27T10:17:30+08:00", + "fingerprint": "1204cb60a4a9a44c3a3435166e07d7d0a54f32c98768951e79c85d6de422a447", "fingerprint_files": 1430, "fingerprint_source": "git-index", "gated_regions": [ "RW_IRAM1", "RW_CCM" ], - "git_head": "b24b2b5f3113fafc086e5562941c9504d3990619", + "git_head": "51ecd36192982fec4bfd1f50fbfba3555c571c4c", "map": "MDK-ARM/STM32F407-Demo/STM32F407-Demo.map", - "map_mtime": 1793046012, + "map_mtime": 1793067428, "pct": { "ER_IROM1": 24.54, "RW_CCM": 87.89, @@ -19,7 +19,7 @@ "regions": { "ER_IROM1": { "max": 1048576, - "size": 257292 + "size": 257280 }, "RW_CCM": { "max": 65280, @@ -37,7 +37,7 @@ "schema": 2, "scope_note": "\u540c\u7801\u51ed\u8bc1\uff1a\u6307\u7eb9\u8986\u76d6\u56fa\u4ef6\u4f53\u79ef\u76f8\u5173\u6e90\u7801\uff0c\u53e3\u5f84\u89c1\u672c\u811a\u672c docstring", "sizes": { - "code": 231732, + "code": 231720, "ro_data": 25560, "rw_data": 1520, "zi_data": 136216