C26117
警告 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);
}
}