nullpointerexception — Странные проблемы Klocwork, сообщаемые для проекта C ++

Я нахожу некоторые из проблем, о которых сообщает Klocwork, очень странными. Например —

if(NULL == m_pMutex.get())
{
Log("found unexpected sharedPtr m_pMutex");
return -1;
}

Time_Critical_Section cs(*m_pMutex);

Для приведенного выше кода Klocwork сообщает о разыменовании нулевого указателя. Но я не думаю, что это актуальная проблема. Как если бы указатель был нулевым, он бы вернулся из функции и не имел бы доступа к указателю. Но все еще Klocwork сообщил об этом как о проблеме.

Другая проблема —

 char buf[1000];
sprintf(buf,"%s",name);

для вышеупомянутого кода Klocwork говорит, что вышеупомянутая часть кода может вызвать переполнение буфера, индекс массива ‘buf’ может быть вне границ. Но мы подтверждаем, что имя переменной не будет больше 1000 байтов. Но все же Klocwork сообщил об этом как о проблеме.

Мы должны сделать наш код без ошибок, и окончательный код не должен содержать никаких проблем для Klocwork. Может ли кто-нибудь предложить эффективный способ преодоления вышеуказанных проблем?

0

Решение

Найдена основная причина разыменования нулевого указателя. Давайте объясним, почему этот код получает разыменование нулевого указателя.

if(NULL == m_pMutex.get())
{
Log("found unexpected sharedPtr m_pMutex");
return -1;
}

Time_Critical_Section cs(*m_pMutex);

Поскольку Klocwork является статическим анализатором кода, когда дело доходит до проверки указателя в «Time_Critical_Section cs (* m_pMutex);» он находит его в открытом блоке, хотя он был проверен ранее, и если указатель равен нулю, мы вернулись из функции со значением -1. Когда Klocwork выполняет статический анализ кода, ему неизвестно, что он ранее проверил указатель в качестве кода доступа указателя в открытом блоке. Мы можем решить эту проблему, изменив код следующим образом —

if(NULL == m_pMutex.get())
{
Log("found unexpected sharedPtr m_pMutex");
return -1;
}
else
{

Time_Critical_Section cs(*m_pMutex);
//Do some operations
return 0;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]