C26117
警告 C26117: 関数 func でロック < が解除 >< されました > 。
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);
}
}