Cppcheck Возможное разыменование нулевого указателя:

я просто использую cppcheck, код работает правильно, просто cppcheck выдает эту ошибку.

void WorkerThread(WorkBuffer* m_buffer)
{
    std::cout << "Thread : " << m_buffer->m_id << ".....Starting" << std::endl;

    if (NULL == m_buffer)
        std::cout << "Thread : " << m_buffer->m_id << "......work buffer is null" << std::endl;


    while(!shut_down_flag)
    {
        int k = 0;
        //Sleep(1);
        SleepSystemUsec(100000);
        std::cout << "Thread : " << m_buffer->m_id << "....in while loop" << std::endl;
    } // of while(!shut_down_flag)

    std::cout << "Thread : " << m_buffer->m_id << ".....Request from main thread so ending working thread ...." << std::endl;
};

error : : Возможное разыменование нулевого указателя: m_buffer - иначе избыточно проверять его на нуль.


person user3521035    schedule 20.04.2015    source источник
comment
Пожалуйста, добавьте больше кода и параметры командной строки CPPCheck.   -  person Ben Crowhurst    schedule 20.04.2015
comment
Вы проверяете, является ли m_buffer NULL после того, что вы уже использовали его. Сообщение указывает (правильно), что если оно может быть NULL (а если нет, то почему вы проверяете?), вы должны узнать прежде чем использовать его в строке выше .   -  person Paul Roub    schedule 20.04.2015
comment
@PaulRoub: Это должен быть ответ, а не комментарий.   -  person Lightness Races in Orbit    schedule 20.04.2015


Ответы (2)


if (NULL == m_buffer) 

убеждается, что m_buffer равно NULL, а затем разыгрываете его с помощью

std::cout << "Thread : " << m_buffer->m_id << "......work buffer is null" << std::endl;
                            ^^^^^^^^^^^^^^^

это допустимо только в том случае, если m_buffer не NULL (точнее, только если оно указывает на правильно построенное WorkBuffer).

Если NULL является возможным входом для вашей функции, вам нужно проверить его перед самым первым разыменованием, а затем либо указать на что-то действительное, либо оставить функцию без разыменования.

person Baum mit Augen    schedule 20.04.2015
comment
мог получить то, что вы сказали. не могли бы вы предоставить некоторые подробности - person user3521035; 20.04.2015
comment
@user3521035 user3521035 Не могли бы вы уточнить, чего вы не понимаете? - person Baum mit Augen; 20.04.2015
comment
На самом деле предупреждение cppcheck за предыдущее m_buffer->m_id << ".....Starting" перед проверкой. Он не определяет эту ошибку. - person Jarod42; 20.04.2015
comment
@Jarod42 Jarod42 Ну, это та же проблема, что и другая (охваченная моей проверкой перед самым первым замечанием о разыменовании ): либо указатель может быть NULL, затем проверьте перед его использованием, либо он не может, то вам никогда не нужно проверять. - person Baum mit Augen; 20.04.2015

Мало того, что ваше состояние обратное:

если m_buffer равно NULL:
делать то, что разыменовывает m_buffer
(а?!)

но у вас нет проверок ни для одного из других операторов вывода.

person Lightness Races in Orbit    schedule 20.04.2015