我正在我的代码上运行 MSVC 的静态分析器,并且收到无法解决的警告。我不确定这是否是误报,希望您能帮助我解决这个问题。我正在使用 MSVC17。
void GetParam_MEASLIST(Message* pMsgReturn)
{
pMsgReturn->u8MessageType = MESSAGE_FAILED;
uint32_t u32ChannelCount = 0;
u32ChannelCount = ChannelHandler_getChannelCount();
if (u32ChannelCount == 0)
{
return;
}
char** szStringList = (char**)malloc(u32ChannelCount * sizeof(char*));
if (NULL == szStringList)
{
return;
}
for (uint32_t i = 0; i < u32ChannelCount; ++i)
{
ChannelInfo_t tmp = { 0 };
if (!ChannelHandler_getChannelInfo(i, &tmp))
{
LOG_ERROR("Failed to get channel info for channel %i", mg_strLogCat, 10);
}
else
{
size_t nSize = strlen(tmp.ChannelDeviceInfo.szMeasType) + 1;
if (nSize > 1)
{
szStringList[i] = (char*)malloc(nSize);
if (szStringList[i] != NULL)
{
memset(szStringList[i], 0, nSize);
memcpy(szStringList[i], tmp.ChannelDeviceInfo.szMeasType, nSize);
}
}
else
{
szStringList[i] = NULL;
}
}
}
size_t nSizeOfList = sizeofStringList((const char**)szStringList, u32ChannelCount);
pMsgReturn->pData = malloc(nSizeOfList);
if (pMsgReturn->pData != NULL)
{
pMsgReturn->nDataSize = serializeStringList(pMsgReturn->pData, (const char**)szStringList, u32ChannelCount);
pMsgReturn->bFreeDataAfterSend = true;
pMsgReturn->u8MessageType = MESSAGE_SUCCESS;
}
for (uint32_t i = 0; i < u32ChannelCount; i++)
{
if (NULL != szStringList[i]) //< error szStringList is uninitialised
{
free(szStringList[i]);
}
}
free(szStringList);
}
Run Code Online (Sandbox Code Playgroud)
我收到变量未初始化的错误szStringList,但我不明白为什么。你能帮我解决这个问题吗?
编辑:
根据要求完整错误
警告 C6001:使用了未初始化的内存“*szStringList”。行:219、221、222、223、228、229、234、236、237、243、244、246、247、249、250、234、236、237 , 243, 244, 255, 234, 259, 260, 261, 267, 271, 273, 267, 271
如果执行这段代码:
if (!ChannelHandler_getChannelInfo(i, &tmp))
{
LOG_ERROR("Failed to get channel info for channel %i", mg_strLogCat, 10);
}
Run Code Online (Sandbox Code Playgroud)
szStringList[i]从未设置。
以后的所有使用szStringList[i]很可能都引用未初始化的值。