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

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

вот часть кода, в которой я получил ошибку

#ifdef DEBUG_LEVEL_MID
    std::clog << "STARTING FUNCTION int ConfigurationType::ExecuteMessageType()" << std::endl;
    std::clog << "message with code : " << message_to_execute->code << "will be tried o executed" << std::endl;
    #endif    

    if(!message_to_execute)
    {
        #ifdef DEBUG_LEVEL_ERROR
        std::cerr << "message_to_execute is null at: int ConfigurationType::ExecuteMessageType()" << std::endl;
        #endif    
        #ifdef DEBUG_LEVEL_MID
        std::clog << "message_to_execute is NULL at int ConfigurationType::ExecuteMessageType()" << std::endl;
        std::clog << "ENDING FUNCTION (0): int ConfigurationType::ExecuteMessageType()" << std::endl;
        #endif    
        return 0;
    }

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


person user3521035    schedule 20.04.2015    source источник
comment
У вас уже есть правильный ответ, но этот материал DEBUG_LEVEL кажется слишком сложным и подверженным ошибкам.   -  person Daniel Daranas    schedule 20.04.2015


Ответы (2)


Вы разыменовываете message_to_execute здесь: std::clog << "message with code : " << message_to_execute->code.

Это означает, что if (!message_to_execute) позже является избыточным, потому что вам не разрешено разыменовывать нулевой указатель, поэтому компилятору разрешено предположить, что message_to_execute не равно нулю, и удалить тест.

person MrZebra    schedule 20.04.2015

Вы уже обращаетесь к указателю до того, как проверите, действителен ли он: message_to_execute->code. Переместите это в оператор if, и предупреждение исчезнет.

CPPCheck прав, если это nullptr, это будет разыменование nullptr, а если нет, вы будете проверять, так ли это?

person Floris Velleman    schedule 20.04.2015
comment
спасибо, я решил это, но есть что-то подобное, с чем я имею дело, я опубликую это и буду признателен за ваши мысли, если не смогу удалить ошибку - person user3521035; 20.04.2015
comment
@ user3521035, пожалуйста, отметьте этот ответ как принятый ответ, а затем опубликуйте новый вопрос, содержащий этот конкретный сценарий (поскольку это, вероятно, другой вопрос). :) - person Floris Velleman; 20.04.2015