Share via


C26117

경고 CC26117: 함수 <func>에서 유지되지 않은 잠금<lock>을 해제합니다.

구문으로 범위가 지정된 취득 잠금 그리고 릴리스 쌍에서 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);
    }
}

참고 항목

참조

C26115