【问题标题】:Cppcheck Possible null pointer dereference:Cppcheck 可能的空指针取消引用:
【发布时间】:2015-04-20 14:20:46
【问题描述】:

我只是使用 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;
};

错误: : 可能的空指针取消引用:m_buffer - 否则检查它是否为空是多余的。

【问题讨论】:

  • 请提供更多代码并提供 CPPCheck 命令行选项。
  • 您正在检查m_buffer 是否是NULL 您已经使用它之后。该消息指出(正确地)如果它可能NULL(如果不是,你为什么要检查?)你应该找出before在上一行。
  • @PaulRoub:这应该是答案而不是评论

标签: c++ cppcheck


【解决方案1】:
if (NULL == m_buffer) 

确保m_bufferNULL,然后用

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

this,仅当m_buffer 不为 NULL 时才合法(更准确地说,仅当它指向正确构造的WorkBuffer 时)。

如果NULL 是您的函数的一个可能输入,您需要在第一次取消引用之前检查它,然后让它指向有效的东西或离开函数而不取消引用。

【讨论】:

  • 可以得到你所说的。你能提供一些细节吗
  • @user3521035 你能不能更具体一点你没有得到什么?
  • 其实cppcheck警告是针对check前的m_buffer-&gt;m_id &lt;&lt; ".....Starting"。它没有发现这个错误。
  • @Jarod42 这与另一个问题相同(我的 “在第一次取消引用之前检查它” 备注):指针可以是 @ 987654330@,那就在使用前检查一下,否则就不用检查了。
【解决方案2】:

不仅你的情况倒退了:

如果m_bufferNULL:
做取消引用m_buffer的事情
(嗯?!)

但您没有检查任何其他输出语句。

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 2015-11-05
    • 1970-01-01
    相关资源
    最近更新 更多