Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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->cs
relacionado.
#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);
}