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.
O chamador não conseguiu manter o bloqueio "lock 1" antes de chamar a função "nome da função", mas "lock 2" foi mantido. Possível incompatibilidade de anotação.
O aviso C26133 é emitido quando o analisador detecta que o bloqueio necessário para chamar uma função não é mantido quando a função é chamada. No entanto, outro bloqueio que parece estar relacionado foi mantido. É possível que o código seja seguro para threads e as anotações precisem ser atualizadas.
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, C26133 é emitido quando DoTaskWithCustomLock
é chamado.
aviso C26133: O chamador não conseguiu manter o bloqueio "customLock01" antes de chamar a função "DoTaskWithCustomLock", mas "(&customLock01)->cs" foi mantido. Possível incompatibilidade de anotação.
#include <sal.h>
struct CustomLock
{
int cs; // "Critical Section"
};
_Acquires_exclusive_lock_(criticalSection->cs) // notice the `->` indirection
void CustomLockAcquire(CustomLock* criticalSection);
_Releases_lock_(criticalSection->cs) // notice the `->` indirection
void CustomLockRelease(CustomLock* criticalSection);
CustomLock customLock01;
_Requires_lock_held_(customLock01) void DoTaskWithCustomLock();
void DoTask()
{
CustomLockAcquire(&customLock01);
DoTaskWithCustomLock(); // C26133
CustomLockRelease(&customLock01);
}
Neste exemplo, a função DoTask
é 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 _Requires_lock_held_
anotação de customLock01
para customLock01.cs
.
#include <sal.h>
struct CustomLock
{
int cs; // "Critical Section"
};
_Acquires_exclusive_lock_(criticalSection)
void CustomLockAcquire(CustomLock* criticalSection);
_Releases_lock_(criticalSection)
void CustomLockRelease(CustomLock* criticalSection);
CustomLock customLock01;
_Requires_lock_held_(customLock01) void DoTaskWithCustomLock();
void DoTask()
{
CustomLockAcquire(&customLock01);
DoTaskWithCustomLock();
CustomLockRelease(&customLock01);
}