C26160
Ostrzeżenie C26160: prawdopodobnie wywołujący nie był w stanie wstrzymać blokady <lock> przed wywołaniem funkcji <func>.
Ostrzeżenie C26160 przypomina ostrzeżenie C26110, z wyjątkiem tego, że poziom ufności jest niższy.Na przykład, funkcja może zawierać błędy adnotacji.
Przykład
Poniższy kod generuje ostrzeżenie C26160.
struct Account
{
_Guarded_by_(cs) int balance;
CRITICAL_SECTION cs;
_No_competing_thread_ void Init()
{
balance = 0; // OK
}
_Requires_lock_held_(this->cs) void FuncNeedsLock();
_No_competing_thread_ void FuncInitCallOk()
// this annotation requires this function is called
// single-threaded, therefore we don't need to worry
// about the lock
{
FuncNeedsLock(); // OK, single threaded
}
void FuncInitCallBad() // No annotation provided, analyzer generates warning
{
FuncNeedsLock(); // Warning C26160
}
};
Poniższy kod przedstawia rozwiązanie dla poprzedniego przykładu.
struct Account
{
_Guarded_by_(cs) int balance;
CRITICAL_SECTION cs;
_No_competing_thread_ void Init()
{
balance = 0; // OK
}
_Requires_lock_held_(this->cs) void FuncNeedsLock();
_No_competing_thread_ void FuncInitCallOk()
// this annotation requires this function is called
// single-threaded, therefore we don't need to worry
// about the lock
{
FuncNeedsLock(); // OK, single threaded
}
void FuncInitCallBadFixed() // this function now properly acquires (and releases) the lock
{
EnterCriticalSection(&this->cs);
FuncNeedsLock();
LeaveCriticalSection(&this->cs);
}
};