다음을 통해 공유


경고 C26117

함수 'func'에서 보류되지 않은 잠금 'lock'을 해제합니다.

C/C++ 프로그램에서 구문적으로 범위가 지정된 잠금 획득 및 잠금 릴리스 쌍의 적용은 언어에 의해 수행되지 않습니다. 함수가 현재 상태를 크게 수정함으로써 잠금 부작용이 발생할 수 있습니다. 예를 들어 잠금 래퍼 함수는 지정된 잠금에 대해 잠금 획득 횟수 또는 잠금 수를 증분합니다. _Acquires_lock_ 또는 _Releases_lock_을 사용하면 각각 잠금 획득 또는 잠금 해제로 인한 부작용이 있는 함수를 주석 처리할 수 있습니다. 이러한 주석 없이는 함수가 반환 후 잠금 수를 변경하지 않을 것으로 예상됩니다. 획득 및 릴리스가 균형이 맞지 않으면 분리된 것으로 간주됩니다. 경고 C26117은 주석 _Releases_lock_ 이 추가되지 않은 함수가 잠금을 해제하기 전에 해당 함수가 잠금을 소유해야 하므로 잠금이 유지되지 않는 잠금을 해제할 때 발생합니다.

예제

다음 예제에서는 함수 ReleaseUnheldLock 가 반드시 보유하지 않는 잠금(상태가 flag 모호함)을 해제하고 이를 지정하는 주석이 없기 때문에 경고 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);
    }
}

참고 항목