C26116

警告 C26116: <関数> でロック <ロック> の取得または保持に失敗しました。

C/C++ プログラムでは、構文的にスコープが設定されたロックの取得とロックの解放のペアの適用は、言語では実行されません。 関数は、コンカレンシー状態を監視可能な方法で変更することにより、ロックの副作用が発生することがあります。 たとえば、ロック ラッパー関数は、指定されたロックについて、ロックの取得数 (ロック数) をインクリメントします。ロックの取得やロックの解除による副作用がある関数には、それぞれ _Acquires_lock_ または _Requires_lock_held を使用して注釈を付けることができます。 このような注釈がない場合、返されたロック数が関数によって変更されないようにする必要があります。 取得と解放のバランスが取れていない場合は、孤立していると見なされます。 警告 C26116 が発行されるのは、関数に _Acquires_lock_ の注釈が付けられているが、ロックを取得しない場合、または関数に _Requires_lock_held の注釈が付けられ、ロックを解除している場合です。

次の例では、関数 DoesNotLock_Acquires_lock_ の注釈が付けられていますが、それを取得しないため、警告 C26116 が生成されます。 関数 DoesNotHoldLock は、_Requires_lock_held の注釈が付けられていますが、それを保持しないため、警告が生成されます。

typedef struct _DATA
{
    CRITICAL_SECTION cs;
} DATA;

_Acquires_lock_(p->cs) void DoesLock(DATA* p)
{
    EnterCriticalSection(&p->cs); // OK
}

_Acquires_lock_(p->cs) void DoesNotLock(DATA* p)
{
    // Warning C26116
}

_Requires_lock_held_(p->cs) void DoesNotHoldLock(DATA* p)
{
    LeaveCriticalSection(&p->cs); // Warning C26116
}

関連項目