警告 C26117

在函数“func”中释放未持有的锁“lock”。

在 C/C++ 程序中,语法范围的锁获取和锁释放对的强制执行不由编程语言来执行。 通过对并发状态进行显著的修改,函数可能会造成锁定副作用。 例如,锁包装器函数会增加给定锁的锁获取数或锁计数。 通过分别使用 _Acquires_lock__Releases_lock_,可批注由于锁获取或锁释放而产生副作用的函数。 如果没有此类批注,函数在返回之后,预计不会更改任何锁计数。 如果获取和释放不平衡,就会将其视为孤立的。 当未使用 _Releases_lock_ 注释的函数释放它不持有的锁时,会发出警告 C26117,因为该函数在释放它之前必须拥有该锁。

示例

以下示例生成警告 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);
    }
}

另请参阅