Compartilhar via


Aviso C26132

A variável "nome da variável" deve ser protegida por "bloqueio 1", mas "bloqueio 2" está em uso. Possível incompatibilidade de anotação.

O analisador emite o Aviso C26132 quando detecta que um bloqueio, que é anotado para proteger um valor, não é mantido ao acessar o valor. No entanto, é mantido um bloqueio relacionado. O código pode ser thread-safe, então talvez seja necessário atualizar as anotações.

Esse diagnóstico geralmente não indica um bug no código, mas sim uma incompatibilidade entre as anotações e o comportamento real de bloqueio. Nesse caso, o diagnóstico deve ser resolvido, pois pode haver outros problemas de análise estática que não estão sendo relatados devido às anotações inconsistentes.

Exemplos

No exemplo a seguir, C26132 é emitido quando data é usado.

A anotação especifica que customLock01 deve proteger a variável data, mas CustomLockAcquire é responsável por adquirir o bloqueio customLock01->csrelacionado.

#include <sal.h>
struct CustomLock 
{
    int cs; // "Critical Section" lock
};

_Acquires_exclusive_lock_(criticalSection->cs) // notice the `->` indirection
void CustomLockAcquire(CustomLock* criticalSection);

_Releases_lock_(criticalSection->cs) // notice the `->` indirection
void CustomLockRelease(CustomLock* criticalSection);

// global lock
CustomLock customLock01;

void Initialize(_Guarded_by_(customLock01) int* data)
{
    CustomLockAcquire(&customLock01);
    *data = 1; // C26132
    CustomLockRelease(&customLock01);
}

Neste exemplo, a função Initialize é thread-safe e se comporta como projetada, mas esse design não é refletido corretamente nas anotações SAL de concorrência. Corrigir ajustando as anotações nas funções de bloqueio personalizadas para usar criticalSection em vez de criticalSection->cs. O aviso também pode ser corrigido alterando a _Guarded_by_ anotação de customLock01 para customLock01.cs.

#include <sal.h>
struct CustomLock 
{
    int cs; // "Critical Section" lock
};

_Acquires_exclusive_lock_(criticalSection)
void CustomLockAcquire(CustomLock* criticalSection);

_Releases_lock_(criticalSection)
void CustomLockRelease(CustomLock* criticalSection);

// global lock
CustomLock customLock01;

void Initialize(_Guarded_by_(customLock01) int* data)
{
    CustomLockAcquire(&customLock01);
    *data = 1;
    CustomLockRelease(&customLock01);
}