警告 C26117
釋放函式 『func』 中的未鎖定 『lock』。
在 C/C++ 程式中強制執行語法範圍鎖定 取得 和鎖定 發行 組,不是由語言執行。 函式可能會藉由對並行狀態進行可觀察的修改來引入鎖定副作用。 例如,鎖定包裝函式會遞增給定鎖定的鎖定擷取數或鎖定計數。 您可以分別使用 _Acquires_lock_
或 _Releases_lock_
來標註具有鎖定取得或鎖定釋放副作用的函式。 如果沒有這類註釋,函式在傳回之後不會變更任何鎖定計數。 如果取得和發行不平衡,則會被視為 孤立專案。 警告 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);
}
}