共用方式為


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

另請參閱