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