From 742f97c23938cca1b8b8ddd9703cd17dbc936874 Mon Sep 17 00:00:00 2001 From: zjk <1553836110@qq.com> Date: Wed, 19 Aug 2026 14:31:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9ApushMsgToQueue=20?= =?UTF-8?q?=E7=BC=BA=E5=B0=91=E8=BF=94=E5=9B=9E=E5=80=BC=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=20CCU=20=E7=8A=B6=E6=80=81=E4=B8=8D=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit pushMsgToQueue 声明返回 bool,但成功路径 push 后仅 break, 函数末尾无 return,属未定义行为(返回值是垃圾寄存器值)。 导致 listenThreadFunc 中 if(pushMsgToQueue(Buff)) 判 false, updatePoweSystemStates() 从不执行,CCU 状态消息入队后从不 处理(界面不显示)。 在函数末尾补 return true,并将各接收队列的 size() 检查 移入 lock_guard 内,消除与主线程 clear/pop 的 TOCTOU 竞争。 --- src/pPowerManger/udpcomm/udpComm.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/pPowerManger/udpcomm/udpComm.cpp b/src/pPowerManger/udpcomm/udpComm.cpp index f269b24..1d0bb0d 100644 --- a/src/pPowerManger/udpcomm/udpComm.cpp +++ b/src/pPowerManger/udpcomm/udpComm.cpp @@ -60,7 +60,6 @@ bool udpComm::getMsgFromBuff(char *m, msg_CcuStateFbMsg &s) { msg_CcuStateFbMsg *p; p = reinterpret_cast(m); sum = calculateChecksum((unsigned char*)m, sizeof(msg_CcuStateFbMsg)); - if (sum != p->checkCode) { sError.push_back("CcuStat Msg Check error"); return false; @@ -175,10 +174,10 @@ bool udpComm::pushMsgToQueue(unsigned char *m) msg_CcuStateFbMsg s; if(getMsgFromBuff((char *)Buff,s)) { + std::lock_guard lock(m_mutexCcuState); if(m_qReceiveCcuStateBuffer.size() lock(m_mutexCcuState); m_qReceiveCcuStateBuffer.push(std::make_pair(time, s)); } else @@ -199,10 +198,10 @@ bool udpComm::pushMsgToQueue(unsigned char *m) msg_CcuSetParmFbMsg s; if(getMsgFromBuff((char *)Buff,s)) { + std::lock_guard lock(m_mutexCcuSetParm); if(m_qReceiveCcuSetParmBuffer.size() lock(m_mutexCcuSetParm); m_qReceiveCcuSetParmBuffer.push(std::make_pair(time, s)); } else @@ -223,10 +222,10 @@ bool udpComm::pushMsgToQueue(unsigned char *m) msg_disHighVolBusFbMsg s; if(getMsgFromBuff((char *)Buff,s)) { + std::lock_guard lock(m_mutexDisHighVolBus); if(m_qReceiveDisHighVolBusBuffer.size() lock(m_mutexDisHighVolBus); m_qReceiveDisHighVolBusBuffer.push(std::make_pair(time, s)); } else @@ -247,10 +246,10 @@ bool udpComm::pushMsgToQueue(unsigned char *m) msg_disHighAVolBusFbMsg s; if(getMsgFromBuff((char *)Buff,s)) { + std::lock_guard lock(m_mutexDisHighAVolBus); if(m_qReceiveDisHighAVolBusBuffer.size() lock(m_mutexDisHighAVolBus); m_qReceiveDisHighAVolBusBuffer.push(std::make_pair(time, s)); } else @@ -271,10 +270,10 @@ bool udpComm::pushMsgToQueue(unsigned char *m) msg_disLowMainBusFbMsg s; if(getMsgFromBuff((char *)Buff,s)) { + std::lock_guard lock(m_mutexDisHighBVolBus); if(m_qReceiveDisHighBVolBusBuffer.size() lock(m_mutexDisHighBVolBus); m_qReceiveDisHighBVolBusBuffer.push(std::make_pair(time, s)); } else @@ -295,10 +294,10 @@ bool udpComm::pushMsgToQueue(unsigned char *m) msg_disLowBusFbMsg s; if(getMsgFromBuff((char *)Buff,s)) { + std::lock_guard lock(m_mutexDisLowBus); if(m_qReceiveDisLowBusBuffer.size() lock(m_mutexDisLowBus); m_qReceiveDisLowBusBuffer.push(std::make_pair(time, s)); } else @@ -316,7 +315,8 @@ bool udpComm::pushMsgToQueue(unsigned char *m) } default: break; - } + } + return true; } bool udpComm::clearMsgQueue()