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