建議使用 Visual Studio 2017

C26117

 

如需 Visual Studio 2017 的最新文件請參閱 Visual Studio 2017 文件

警告 C26117: 釋放在函式 <func>的未保留的鎖定 <lock> 。

在語法上是範圍鎖定的執行緒 取得 和鎖定 C/C++ 程式的發行沒有由語言執行。 函式可以藉由對並行狀態的可預見值的變更產生新的鎖定副作用。 例如,鎖定包裝函式將鎖定獲取數目或鎖定計數遞增,並使用指定的鎖定。您可以使用 _Acquires_lock__Releases_lock_,您也可以分別註記從鎖定的副作用 (Side Effect) 取得或鎖定版本的函式。 如果沒有這種附註,在這種情況下,在它傳回之後,函式預期不會變更任何鎖定計數。 如果取得與釋放不平痕,它們會變為孤立。 警告 C26117 發行,發生未加註 _Releases_lock_ 的函式釋放一個它不會保留的鎖定,因為函式在釋放物件之前必須擁有鎖定。

下列範例會產生警告 C26117,因為函式 ReleaseUnheldLock 釋放鎖定它不一定具有這個 flag 狀態,是模稜兩可而不是應該指定的附註。

  
typedef struct _DATA   
{  
    CRITICAL_SECTION cs;  
} DATA;  
  
int flag;  
  
void ReleaseUnheldLock(DATA* p)  
{  
    if (flag)  
        EnterCriticalSection(&p->cs);  
    // code ...  
    LeaveCriticalSection(&p->cs);  
}  

下列程式碼會在同樣的狀況下釋放以及取得鎖定,以確保修正這個問題。

  
typedef struct _DATA   
{  
    CRITICAL_SECTION cs;  
} DATA;  
  
int flag;  
  
void ReleaseUnheldLock(DATA* p)  
{  
    if (flag)  
    {  
        EnterCriticalSection(&p->cs);  
        // code ...  
        LeaveCriticalSection(&p->cs);  
    }  
}  

C26115

顯示: