fix(104): 拆掉四处恒假的上界判断——合法带只改判下界,口径不变
CI / L0 静态门禁 (pre-commit) (push) Failing after 3s
CI / L0.5 主机侧单测 (MSVC) (push) Failing after 2s

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 行已覆盖代码
未被判成回退)。
This commit is contained in:
2026-10-27 10:34:39 +08:00
parent 51ecd36192
commit c1e7e8c42c
5 changed files with 18 additions and 14 deletions
+8 -4
View File
@@ -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;