C26117

警告 C26117: 関数 func でロック < が解除 >< されました > 。

C/C++ プログラムでの構文スコープロックの取得とロック解放のペアの適用は、言語では実行されません。 関数は、コンカレンシー状態を監視可能な変更を行って、ロックの副作用を引き出す可能性があります。 たとえば、ロック ラッパー関数は、特定のロックのロック取得数 (ロック数) をインクリメントします。または をそれぞれ使用して、ロックの取得またはロック解除による副作用を持つ関数に注釈 _Acquires_lock__Releases_lock_ を付けできます。 このような注釈がない場合、関数は、戻った後にロック数を変更しない必要があります。 取得とリリースのバランスが取れた場合、それらは孤立したと 見なされます。 警告 C26117 は、注釈が付かされていない関数が、ロックを解放する前にロックを所有する必要があるという理由で、保持されていないロックを解放すると発行されます。 _Releases_lock_

次の例では、警告 C26117 が生成されます。関数は、必ずしも の状態を保持しないロックを解放します。また、その必要を指定する注釈はありません。 ReleaseUnheldLockflag


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

関連項目