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