경고 C26135
함수 'func'에 주석 '주석'이 없습니다.
경고 C26135는 분석기가 함수가 "잠금 획득" 또는 "잠금 해제" 부작용이 있는 잠금 래퍼 함수임을 유추할 때 발생합니다. 코드가 래퍼 함수로 의도되지 않은 경우 잠금이 누출되거나(인수되는 경우) 잘못 해제됩니다(잠금이 해제되는 경우).
다음 예제는 적절한 부작용 주석이 누락되었기 때문에 경고 C26135를 생성합니다.
typedef struct _DATA
{
CRITICAL_SECTION cs;
} DATA;
void MyEnter(DATA* p)
{
// Warning C26135:
// Missing side effect annotation _Acquires_lock_(&p->cs)
EnterCriticalSection(&p->cs);
}
void MyLeave(DATA* p)
{
// warning C26135:
// Missing side effect annotation _Releases_lock_(&p->cs)
LeaveCriticalSection(&p->cs);
}
경고 C26135는 조건부 잠금 부작용이 검색되었을 때에도 발생합니다. 조건부 효과를 주석 처리하려면 _When_(ConditionExpr, LockAnnotation)
주석을 사용합니다. 여기서 LockAnnotation
은 _Acquires_lock_
또는 _Releases_lock_
이고, 조건자 식 ConditionExpr
은 부울 조건식입니다. 동일한 함수에서 다른 주석의 부작용은 ConditionExpr
이 True로 평가될 때만 발생합니다. ConditionExpr
은 조건을 호출자에게 다시 릴레이하는 데 사용되기 때문에 호출 컨텍스트에서 인식되는 변수를 포함해야 합니다. 여기에는 함수 매개 변수, 전역 또는 클래스 멤버 변수 또는 반환 값이 포함됩니다. 반환 값을 보려면 다음 예에 표시된 것처럼 주석 return
에서 특수한 키워드를 사용합니다.
typedef struct _DATA
{
CRITICAL_SECTION cs;
int state;
} DATA;
_When_(return != 0, _Acquires_lock_(p->cs))
int TryEnter(DATA* p)
{
if (p->state != 0)
{
EnterCriticalSection(&p->cs);
return p->state;
}
return 0;
}
판독기/기록기 잠금으로도 알려진 공유/단독 잠금을 위해서는 다음 주석을 사용해서 잠금 부작용을 표현할 수 있습니다.
_Acquires_shared_lock_(LockExpr)
_Releases_shared_lock_(LockExpr)
_Acquires_exclusive_lock_(LockExpr)
_Releases_exclusive_lock_(LockExpr)