C26117
警告 C26117:解除未持有的锁 <lock>(在函数 <func> 中)。
语法范围的强制 获取 锁和 发布 锁对在 C/C++ 程序语言中不会执行。函数通过对并发状态做一个可观察的修改可能会介绍一个锁的副作用。例如,对于给定的锁,锁包装函数增加了锁获取的数量或锁计数。您可以通过使用 _Acquires_lock_ 或 _Releases_lock_ 来注释由于锁获取或锁释放而产生副作用的函数。如果没有此类批注,函数在返回之后,期望不更改任何锁计数。如果获取并释放不平衡,它们被认为是 孤儿(orphaned)。发出 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);
}
}