指向本地变量的指针存储在此变量范围之外

Pointer to local variable is stored outside the scope of this variable

本文关键字:变量 范围 存储 指针      更新时间:2023-10-16

对于以下代码段,这是libgearman的一部分

gearman_job_st *gearman_worker_grab_job(gearman_worker_st *worker_shell,
                                        gearman_job_st *job,
                                        gearman_return_t *ret_ptr)
{
    if (worker_shell and worker_shell->impl())
    {
        ...
        gearman_return_t unused;
        if (ret_ptr == NULL)
        {
            ret_ptr= &unused;
        }
        ...
    }
    assert(*ret_ptr != GEARMAN_MAX_RETURN);
    return NULL;
}

PVS-Studio报告:

Viva64-EM
full
671
/nfs/home/xxx/src/gearmand/libgearman/worker.cc
error
V506
Pointer to local variable 'unused' is stored outside the scope of this variable. Such a pointer will become invalid.
false
2
    {
      ret_ptr= &unused;
    }
------------

关于在声明范围之外向本地变量指向的问题指针,如果我正确理解,应使用mallocfree进行重构。我的问题是是否还有其他适当的重构替代方案。例如使用std :: unique_ptr:

ret_ptr = std::make_unique<gearman_return_t>();

所讨论函数的 ret_ptr参数预计将指向调用函数中的变量。然后,该指针将用于读取和编写此外部变量。

if (ret_ptr == NULL)块检查呼叫者是否在某些变量的地址中实际通过。如果没有,则将此指针指向局部变量unused,以便在代码后期仍可以安全地将指针放置。但是,由于ret_ptr现在指向局部,因此在功能之外看不到使用它进行的更改。这很好,因为呼叫者通过NULL通过ret_ptr传递。同样,由于ret_ptr是一个参数,因此在功能之外看不到任何更改。

这里没有重构。该代码根据ret_ptr的意图工作。这是PVS-Studio的假阳性。

编辑:

这是不是一个误报。unused变量定义在比ret_ptr较低的范围下,即功能中第一个if块的范围。在if块之后,然后将ret_ptr删除。如果指向ununsed,则该变量现在不超出范围,并提出ret_ptr调用不确定的行为。

要解决此问题,必须将unused声明并分配给if块上方:

gearman_job_st *gearman_worker_grab_job(gearman_worker_st *worker_shell,
                                        gearman_job_st *job,
                                        gearman_return_t *ret_ptr)
{
    gearman_return_t unused;
    if (ret_ptr == NULL)
    {
        ret_ptr= &unused;
    }
    if (worker_shell and worker_shell->impl())
    {
        ...
    }
    assert(*ret_ptr != GEARMAN_MAX_RETURN);
    return NULL;
}