C26135
Aviso C26135: Anotação ausente <anotação> na função <func>.
C26135 de aviso é emitido quando o analisador infere que uma função é uma função de wrapper de bloqueio que tem um bloqueio adquirir ou bloquear o efeito colateral de versão.Se o código não deve ser uma função de wrapper, então ou o bloqueio está substituição (se o bloqueio está sendo adquirido) ou está sendo liberado incorretamente (se o bloqueio está sendo liberado).
Exemplo
O exemplo a seguir gerenciar C26135 de aviso como uma anotação apropriado do efeito colateral está ausente.
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 de aviso é emitido quando um efeito colateral condicional de bloqueio é detectado.Para anotar um efeito condicional, use a anotação de _When_(ConditionExpr, LockAnnotation) , onde é LockAnnotation ou _Acquires_lock_ ou _Releases_lock_ e a expressão de predicado ConditionExpr é uma expressão condicional booliano.Os efeitos colaterais de outras anotações na mesma função só acontecem quando ConditionExpr avalia para retificar.Como ConditionExpr é usado para retransmitir a condição de volta para o chamador, deve incluir as variáveis que são reconhecidos no contexto de chamada.Esses incluem os parâmetros de função, ou variáveis globais classificação do membro, ou o valor de retorno.Para ver o valor de retorno, use uma palavra-chave especial na anotação, return, conforme mostrado no exemplo a seguir.
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;
}
Para compartilhado/bloqueios exclusivos, também conhecido como o leitor/gravador bloqueie, você pode expressar efeitos colaterais de bloqueio usando as anotações a seguir:
_Acquires_shared_lock_(LockExpr)
_Releases_shared_lock_(LockExpr)
_Acquires_exclusive_lock_(LockExpr)
_Releases_exclusive_lock_(LockExpr)