簡體   English   中英

指向局部變量的指針存儲在此變量范圍之外

[英]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;
    }
------------

關於指向聲明其范圍之外的局部變量的問題,如果我理解正確,則應使用mallocfree進行重構。 我的問題是是否還有其他適當的重構方法。 例如使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM