错误 #5335
logWriter 删除超出序号之外的文件挂死
0%
历史记录
由 席 振斌 更新于 大约 7 小时 之前
【问题原因】
代码逻辑有问题,当要删除的文件集合的map中的文件都被删除时,当 map 变空时,logFiles.rbegin() 返回的迭代器等同于 rend(),此时 while 条件中的 rit->first 会解引用一个无效的迭代器,导致未定义行为
std::map<uint16_t, std::string>::reverse_iterator rit = logFiles.rbegin();
while (rit->first > MAX_LOG_FILE_ID)
{
if (std::remove(rit->second.c_str()) != 0)
{
LOG_ERROR2("Deleting file failed, file: ", rit->second.c_str());
}
logFiles.erase(rit->first);
rit = logFiles.rbegin();
}
【修改方案】
进入while循环的判决条件修改为非空,如果列表为空时不进行删除;
while (!logFiles.empty())
{
std::map<uint16_t, std::string>::reverse_iterator rit = logFiles.rbegin();
if (rit->first <= MAX_LOG_FILE_ID)
{
break;
}
if (std::remove(rit->second.c_str()) != 0)
{
LOG_ERROR2("Deleting file failed, file: ", rit->second.c_str());
}
logFiles.erase(rit->first);
}
【回归方法和注意事项】
可以将某个模块的日志文件的序号手动改为>999的,后续此文件被删除,但是logwriter无挂死即可
合入版本:Rel_3.2.1_Pre3T2_20260527和下一个3.2.2版本