C26135
Aviso C26135: anotação <annotation> ausente na função <func>.
Aviso que c26135 é emitido quando o analisador infere que uma função é uma função de invólucro de bloqueio tem um bloqueio de adquirir ou efeito colateral de liberação de bloqueio.Se o código não se destina a ser uma função de invólucro, o bloqueio está vazando (se o bloqueio está sendo adquirido) ou ele está sendo lançado incorretamente (se o bloqueio está sendo lançado).
Exemplo
O exemplo a seguir gera aviso C26135 porque está falta uma anotação de efeito colateral apropriado.
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 também é emitido quando um efeito colateral bloqueio condicional é detectado.Para anotar um efeito condicional, use o _When_(ConditionExpr, LockAnnotation) anotação, onde LockAnnotation é _Acquires_lock_ ou _Releases_lock_ e a expressão de predicado ConditionExpr é uma expressão booleana condicional.Os efeitos colaterais de outras anotações na mesma função só ocorrem quando ConditionExpr for avaliada como true.Porque ConditionExpr é usado para retransmitir a condição de volta para o chamador, ele deve envolver variáveis que são reconhecidas no contexto de chamada.Eles incluem parâmetros de função globais ou variáveis de membro de classe ou o valor de retorno.Para ver o retorno de valor, 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;
}
Bloqueios compartilhados/exclusivo, também conhecido como bloqueios de leitor/gravador, você pode expressar efeitos colaterais bloqueio usando as seguintes anotações:
_Acquires_shared_lock_(LockExpr)
_Releases_shared_lock_(LockExpr)
_Acquires_exclusive_lock_(LockExpr)
_Releases_exclusive_lock_(LockExpr)