C26117
警告 C26117: 関数 <func> で保持されていないロック <ロック> を解放します
構文上のスコープ ロックは適用 し、 C/C++ プログラムのロック リリース ペアは言語によって実行されません。関数は同時実行状態への観察可能な変更によってロックの副作用が生じることがあります。たとえば、ロックのラッパー関数はロックの数、または特定のロックのロック カウントをインクリメントします。ロックの副作用が _Acquires_lock_ または _Releases_lock_を使用してリリースを取得またはロックするのを伴う関数を個別に指定できます。このような注釈を指定せずにロック カウントを変更せずに、返された後関数が想定されます。取得し、リリースの数が一致していない場合は、デタッチされたと見なされます。警告 C26117 は _Releases_lock_ が指定されていない関数でロックを解放する前に関数が保持する必要があるので、格納されないロックを解放する場合に発生します。
使用例
次の例では flag の保持の状態はあいまいとなるように指定するコメントがないこと ReleaseUnheldLock 関数がロックを解放するため C26117 警告を生成します。
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);
}
}