Compartilhar via


Aviso C26133

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);
}