Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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);
}