C26160

 

For the latest documentation on Visual Studio 2017 RC, see Visual Studio 2017 RC Documentation.

warning C26160: Caller possibly failing to hold lock <lock> before calling function <func>.

Warning C26160 resembles warning C26110 except that the confidence level is lower. For example, the function may contain annotation errors.

The following code generates warning 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  
    }  
  
};  

The following code shows a solution to the previous example.

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

Show: