Sdílet prostřednictvím


Upozornění C26133

Volající nedrží zámek lock 1 před voláním funkce název funkce, ale místo toho je držen zámek 2. Možná neshoda poznámek.

Upozornění C26133 je vydáno, když analyzátor zjistí, že zámek potřebný k volání funkce se při volání funkce neudrží. Další zámek, který vypadá související, je však držen. Je možné, že kód je bezpečný pro vlákna a poznámky je potřeba aktualizovat.

Tato diagnostika obvykle neznamená chybu v kódu, ale spíše neshodu mezi poznámkami a skutečným chováním uzamčení. Pokud ano, měla by se diagnostika vyřešit, protože kvůli nekonzistentním poznámkám se nehlásí jiné problémy se statickou analýzou.

Příklady

V následujícím příkladu je při zavolání DoTaskWithCustomLock vygenerován C26133.

upozornění C26133: Volající nedrží zámek 'customLock01' před voláním funkce 'DoTaskWithCustomLock', ale místo toho je držen '(&customLock01)->cs'. Možná neshoda poznámek.

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

V tomto příkladu je funkce DoTask bezpečná pro přístup z více vláken a funguje podle návrhu, ale tento návrh není správně uveden v poznámkách SAL souběžnosti. Oprava úpravou poznámek u vlastních zamykacích funkcí tak, aby se používal criticalSection namísto criticalSection->cs. Upozornění lze také opravit změnou poznámky _Requires_lock_held_ z customLock01 na 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);
}