[英]Pointer to local variable is stored outside the scope of this variable
对于以下代码段,这是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;
}
------------
关于指向声明其范围之外的局部变量的问题,如果我理解正确,则应使用malloc
和free
进行重构。 我的问题是是否还有其他适当的重构方法。 例如使用std :: unique_ptr :
ret_ptr = std::make_unique<gearman_return_t>();
该函数的ret_ptr
参数应指向调用函数中的变量。 然后,为读取和写入此外部变量而取消引用该指针。
if (ret_ptr == NULL)
块检查调用方是否实际传递了某个变量的地址。 如果不是,则使该指针指向unused
的局部变量,以便以后仍可以在代码中安全地取消引用该指针。 但是由于ret_ptr
现在指向本地,因此在函数外部看不到通过取消引用该本地所做的更改。 这很好,因为调用方为ret_ptr
传递了NULL
。 同样,由于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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.