指向本地变量的指针存储在此变量范围之外
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
现在指向局部,因此在功能之外看不到使用它进行的更改。这很好,因为呼叫者通过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;
}
相关文章:
- 在 c++ 中确定堆栈上的变量范围
- C++中静态方法的局部变量范围
- 功能原型变量范围C
- C 公共变量范围混乱
- 指向本地变量的指针存储在此变量范围之外
- C 变量范围
- 在函数的参数列表中初始初始化的变量范围
- 由于变量范围导致的段故障
- 友元运算符中的变量范围
- CMake <PROJECT-NAME>_SOURCE_DIR 变量范围
- switch 语句中的奇数变量范围
- C++ try 中的变量范围
- C++ 引用变量范围问题
- 更改静态变量范围
- C++向量、常量字符*、变量范围和生存期
- 对变量范围感到困惑 - 析构函数意外调用
- 限制变量范围的利弊
- 我的C++变量(范围相关)有什么问题?
- c++中变量范围嵌套不当
- Qt5、lambda和变量范围