From 97e4da3df7d037c21be75673c2696cb7b3db14b3 Mon Sep 17 00:00:00 2001 From: lnk Date: Thu, 13 Mar 2025 16:35:19 +0800 Subject: [PATCH] fix ledger update --- cfg_parse/cfg_parser.cpp | 34 +++++++++++++++----- json/create_json.cpp | 68 +++++++++++++++++++++++++++++++++------- mms/mms_process.c | 24 ++++++++++++-- 3 files changed, 104 insertions(+), 22 deletions(-) diff --git a/cfg_parse/cfg_parser.cpp b/cfg_parse/cfg_parser.cpp index 41e14f9..ead3fb7 100644 --- a/cfg_parse/cfg_parser.cpp +++ b/cfg_parse/cfg_parser.cpp @@ -3935,6 +3935,7 @@ int parse_rpt_log_ini() LD_info = &(ied_usr->LD_info[cpuno]); char str[256]; //256大小 char* tmp = Get_IED(ied_usr->dev_type); + if(tmp == NULL){std::cerr << "front read ied config error!" << std::endl;continue;} qDebug() << tmp << endl; apr_snprintf(str, sizeof(str), tmp, cpuno + 1); @@ -3966,6 +3967,7 @@ int parse_rpt_log_ini() for (int i = 0; i < log_cfg_strlists[type]->size(); ++i) { apr_snprintf(buf, sizeof(buf), "%s", log_cfg_strlists[type]->at(i).toAscii().constData()); char* tmp = Get_LDevice(ied_usr->dev_type); + if(tmp == NULL){std::cerr << "front read monitor config error!" << std::endl;continue;} fill_logctrl_by_cfg(LD_info, i, buf, tmp); delete[] tmp; } @@ -11758,13 +11760,29 @@ void printLedgerinshell(const ied_usr_t& ied_usr, QIODevice* outputDevice) { //recall outputDevice->write("\r\x1B[K");outputDevice->write(" |-- autorecallflag: " + QByteArray::number(ied_usr.LD_info[i].autorecallflag) + "\n"); outputDevice->write("\r\x1B[K");outputDevice->write(" |-- autorecallcount: " + QByteArray::number(ied_usr.LD_info[i].autorecallcount) + "\n"); - for (int j = 0; j < ied_usr.LD_info[i].autorecallcount && ied_usr.LD_info->autorecall[j] != NULL; j++){ - outputDevice->write("\r\x1B[K");outputDevice->write(" |-- autorecall_t[" + QByteArray::number(j) + "]:\n"); - outputDevice->write("\r\x1B[K");outputDevice->write(" |-- start_time: " + QByteArray::number(ied_usr.LD_info->autorecall[j]->start) + "\n"); - outputDevice->write("\r\x1B[K");outputDevice->write(" |-- end_time: " + QByteArray::number(ied_usr.LD_info->autorecall[j]->end) + "\n"); - outputDevice->write("\r\x1B[K");outputDevice->write(" |-- need_steady: " + QByteArray::number(ied_usr.LD_info->autorecall[j]->need_steady) + "\n"); - outputDevice->write("\r\x1B[K");outputDevice->write(" |-- need_voltage: " + QByteArray::number(ied_usr.LD_info->autorecall[j]->need_voltage) + "\n"); - } + for (int j = 0; + j < ied_usr.LD_info[i].autorecallcount && + ied_usr.LD_info[i].autorecall != NULL && // 保护 LD_info->autorecall 本身 + ied_usr.LD_info[i].autorecall[j] != NULL; + j++) + { + outputDevice->write("\r\x1B[K"); + outputDevice->write(" |-- autorecall_t[" + QByteArray::number(j) + "]:\n"); + + if (ied_usr.LD_info[i].autorecall[j] == NULL) { + outputDevice->write(" |-- [Error] autorecall[j] is NULL\n"); + continue; // 避免访问 NULL 指针 + } + + outputDevice->write("\r\x1B[K"); + outputDevice->write(" |-- start_time: " + QByteArray::number(ied_usr.LD_info[i].autorecall[j]->start) + "\n"); + outputDevice->write("\r\x1B[K"); + outputDevice->write(" |-- end_time: " + QByteArray::number(ied_usr.LD_info[i].autorecall[j]->end) + "\n"); + outputDevice->write("\r\x1B[K"); + outputDevice->write(" |-- need_steady: " + QByteArray::number(ied_usr.LD_info[i].autorecall[j]->need_steady) + "\n"); + outputDevice->write("\r\x1B[K"); + outputDevice->write(" |-- need_voltage: " + QByteArray::number(ied_usr.LD_info[i].autorecall[j]->need_voltage) + "\n"); + } // rpt outputDevice->write("\r\x1B[K");outputDevice->write(" |-- rptRecvFlag: " + QByteArray::number(ied_usr.LD_info[i].rptRecvFlag) + "\n"); outputDevice->write("\r\x1B[K");outputDevice->write(" |-- rptRecvCheckFlag: " + QByteArray::number(ied_usr.LD_info[i].rptRecvCheckFlag) + "\n"); @@ -14746,6 +14764,7 @@ int parse_rpt_log_ini_one(ied_t* ied) //这些可能是已有的内存,经过判断才能从g_init_pool中分配内存,lnk20250122 char str[256]; char* tmp = Get_IED(ied_usr->dev_type); + if(tmp == NULL){std::cerr << "front read ied config error!" << std::endl;continue;} qDebug() << tmp << endl; apr_snprintf(str, sizeof(str), tmp, cpuno + 1); //ied_usr->LD_info[cpuno].LD_name = apr_pstrdup(g_init_pool, str);//lnk20250122 @@ -14801,6 +14820,7 @@ int parse_rpt_log_ini_one(ied_t* ied) for (int i = 0; i < log_cfg_strlists[type]->size(); ++i) { apr_snprintf(buf, sizeof(buf), "%s", log_cfg_strlists[type]->at(i).toAscii().constData()); char* tmp = Get_LDevice(ied_usr->dev_type); + if(tmp == NULL){std::cerr << "front read monitor config error!" << std::endl;continue;} fill_logctrl_by_cfg(LD_info, i, buf, tmp); delete[] tmp; } diff --git a/json/create_json.cpp b/json/create_json.cpp index 8dba3f0..89487f1 100644 --- a/json/create_json.cpp +++ b/json/create_json.cpp @@ -3820,9 +3820,13 @@ char* Get_xmlpath(char* devtype) //调试用lnk20241125 std::cout << type.toStdString() << std::endl; - if (xmlinfo_list.contains(type)) { + if (xmlinfo_list.contains(devtype) && + xmlinfo_list[devtype] != NULL && // 先检查指针是否为空 + !xmlinfo_list[devtype]->xmlbase.MODEL_ID.isNull() && // 确保 QString 不是 NULL + !xmlinfo_list[devtype]->xmlbase.MODEL_ID.isEmpty() && // 确保字符串不为空 + xmlinfo_list[devtype]->xmlbase.MODEL_ID.trimmed().length() >= 4) { //确保modelid存在lnk20250313 cout << "!!!!!!!!!! xmlinfo_list.contains(devtype) == 1 !!!!!!!!!!!" << endl; - QByteArray byteArray = xmlinfo_list[devtype]->xmlbase.MODEL_ID.toLocal8Bit(); + QByteArray byteArray = xmlinfo_list[devtype]->xmlbase.MODEL_ID.toLocal8Bit();//易崩溃点,一定要确保modelid存在lnk20250313 char* charArray = new char[byteArray.size()+1];//分配内存时+1防止内存泄漏lnk20250305 memcpy(charArray, byteArray.data(), byteArray.size()); charArray[byteArray.size()] = '\0'; @@ -3838,18 +3842,39 @@ char* Get_IED(char* devtype) { QString type; type.append(devtype); - if (xmlinfo_list.contains(type)) { + if (xmlinfo_list.contains(type) && xmlinfo_list[type] != NULL) { cout << "!!!!!!!!!! Get_IED xmlinfo_list.contains(devtype) == 1 !!!!!!!!!!!" << endl; + + // 确保 xmlcfg 及其成员非空 + if (xmlinfo_list[type]->xmlcfg.IEDname.isNull() || xmlinfo_list[type]->xmlcfg.LDevicePrefix.isNull()) { + cout << "Error: IEDname or LDevicePrefix is NULL in Get_IED!" << endl; + return NULL; + } + QString ied; - ied.append(xmlinfo_list[devtype]->xmlcfg.IEDname);//PQMonitor - ied.append(xmlinfo_list[devtype]->xmlcfg.LDevicePrefix); + ied.append(xmlinfo_list[type]->xmlcfg.IEDname); // PQMonitor + ied.append(xmlinfo_list[type]->xmlcfg.LDevicePrefix); ied.append("%d"); + QByteArray byteArray = ied.toLocal8Bit(); - char* charArray = new char[byteArray.size()+1];//分配内存时+1防止内存泄漏lnk20250305 + + if (byteArray.isEmpty()) { + cout << "Error: Generated QByteArray is empty!" << endl; + return NULL; + } + + // 分配内存,确保足够大小并安全拷贝 + char* charArray = new char[byteArray.size() + 1]; + if (!charArray) { + cout << "Error: Memory allocation failed!" << endl; + return NULL; + } + memcpy(charArray, byteArray.data(), byteArray.size()); - charArray[byteArray.size()] = '\0'; + charArray[byteArray.size()] = '\0'; // 确保字符串以 '\0' 结尾 + return charArray; - } + } else { cout << "!!!!!!!!!! Get_IED xmlinfo_list.contains(devtype) == 0 !!!!!!!!!!!" << endl; //cout << "ttttttttttttttt" << topicList.size() << endl; @@ -3869,14 +3894,33 @@ char* Get_LDevice(char* devtype) { QString type; type.append(devtype); - if (xmlinfo_list.contains(type)) {//解析列表中包含终端类型 + if (xmlinfo_list.contains(type) && xmlinfo_list[type] != NULL) { // 确保类型存在且不为空 + if (xmlinfo_list[type]->xmlcfg.LDevicePrefix.isNull() || xmlinfo_list[type]->xmlcfg.LDevicePrefix.isEmpty()) { + cout << "Error: LDevicePrefix is NULL or empty in Get_IED!" << endl; + return NULL; + } + QString ied; - ied.append(xmlinfo_list[devtype]->xmlcfg.LDevicePrefix);//使用解析列表的终端前缀 + ied.append(xmlinfo_list[type]->xmlcfg.LDevicePrefix); // 使用解析列表的终端前缀 ied.append("%d"); + QByteArray byteArray = ied.toLocal8Bit(); - char* charArray = new char[byteArray.size()+1];//分配内存时+1防止内存泄漏lnk20250305 + + if (byteArray.isEmpty()) { + cout << "Error: Generated QByteArray is empty!" << endl; + return NULL; + } + + // 分配内存,确保足够大小 + char* charArray = new char[byteArray.size() + 1]; + if (!charArray) { + cout << "Error: Memory allocation failed!" << endl; + return NULL; + } + memcpy(charArray, byteArray.data(), byteArray.size()); - charArray[byteArray.size()] = '\0'; + charArray[byteArray.size()] = '\0'; // 确保字符串以 '\0' 结尾 + return charArray; } else { diff --git a/mms/mms_process.c b/mms/mms_process.c index 4f1cb98..75f8232 100644 --- a/mms/mms_process.c +++ b/mms/mms_process.c @@ -832,6 +832,23 @@ void check_3s_config() } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //lnk20250114参照实时数据方法处理台账信息 +int isValidModelId(const char* model_id) { + size_t i; + + if (model_id == NULL) return 0; // NULL 无效 + + size_t len = strlen(model_id); + if (len < 4) return 0; // 长度 < 4 无效 + + // 检查是否全是空格 + for (i = 0; i < len; i++) { + if (!isspace((unsigned char)model_id[i])) { + return 1; // 只要包含非空格字符,就是合法的 + } + } + return 0; // 仅包含空格,无效 +} + void process_ledger_update(trigger_update_xml_t *ledger_update_xml) { int i,j; @@ -969,17 +986,18 @@ void process_ledger_update(trigger_update_xml_t *ledger_update_xml) //3-写入台账内容/////////////////////////////////// //4-配置映射文件////////////////////////////// - char model[64] = {0}; + char model[64]; // 获取模型ID,检查是否返回 NULL char* model_id = parse_model_cfg_web_one(ied);//存储在/FeProject/dat/ - if (model_id != NULL) { + if (isValidModelId(model_id)) { //lnk20250313防止拿不到映射文件 // 安全拷贝字符串到 model 数组 strncpy(model, model_id, sizeof(model) - 1); model[sizeof(model) - 1] = '\0'; // 确保以 null 结尾 printf("ledger Model ID: %s\n", model); } else { - printf("ledger No model ID found.\n"); + printf("ledger No model ID found.quit\n"); + return ; } char full_path[128]; snprintf(full_path, sizeof(full_path), "/FeProject/dat/%s.xml", model); // 拼接路径