C26135
Ostrzeżenie C26135: Brak adnotacji <annotation>. w funkcji <func>.
Ostrzeżenie C26135 jest wydane, gdy analizator ustali, że jest funkcja otoki blokady, który jest zablokowany nabycia lub zablokować efekt uboczny wydania.Jeżeli kod nie jest przeznaczony do funkcją otoki, następnie blokada jest wyciek (Jeśli blokada jest pozyskana) albo wydano niepoprawnie (Jeśli blokada jest zwalniana).
Przykład
Poniższy przykład generuje ostrzeżenie C26135, ponieważ brakuje adnotacji odpowiedni efekt uboczny.
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);
}
Ostrzeżenie C26135 jest również wydanych po wykryciu warunkowe efekt uboczny blokowania.Aby umieścić adnotację warunkowe efekt, użyj _When_(ConditionExpr, LockAnnotation) adnotacji, gdzie LockAnnotation jest albo _Acquires_lock_ lub _Releases_lock_ i predykatu wyrażenie ConditionExpr jest logiczną wyrażenia warunkowego.Efekty uboczne innych adnotacji na tej samej funkcji tylko wówczas, gdy ConditionExpr ma wartość true.Ponieważ ConditionExpr jest używana do przekazywania warunek z powrotem do wywołującego, musi on obejmować zmiennych, które są rozpoznawane w kontekście wywołującego.Należą do parametrów funkcji globalnych lub zmienne składowe klasy lub zwracanej wartości.Aby zobaczyć zwrotu wartości, należy użyć specjalnego słowo kluczowe w adnotacji, return, jak pokazano w następującym przykładzie.
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;
}
Udostępnione wyłączności blokad, znany również jako Czytnik/zapisywarka blokad, można wyrazić blokowania efektów ubocznych przy użyciu następujących adnotacji:
_Acquires_shared_lock_(LockExpr)
_Releases_shared_lock_(LockExpr)
_Acquires_exclusive_lock_(LockExpr)
_Releases_exclusive_lock_(LockExpr)