C26100

Note

This article applies to Visual Studio 2015. If you're looking for the latest Visual Studio documentation, see Visual Studio documentation. We recommend upgrading to the latest version of Visual Studio. Download it here

warning C26100: Race condition. Variable <var> should be protected by lock <lock>.

The _Guarded_by_ annotation in the code specifies the lock to use to guard a shared variable. Warning C26100 is generated when the guard contract is violated.

Example

The following example generates warning C26100 because there is a violation of the _Guarded_by_ contract.

CRITICAL_SECTION gCS;

_Guarded_by_(gCS) int gData;

typedef struct _DATA {
    _Guarded_by_(cs) int data;
    CRITICAL_SECTION cs;
} DATA;

void Safe(DATA* p) {
    EnterCriticalSection(&p->cs);
    p->data = 1; // OK
    LeaveCriticalSection(&p->cs);
    EnterCriticalSection(&gCS);
    gData = 1; // OK
    LeaveCriticalSection(&gCS);
}

void Unsafe(DATA* p) {
    EnterCriticalSection(&p->cs);
    gData = 1; // Warning C26100 (wrong lock)
    LeaveCriticalSection(&p->cs);
}

The contract violation occurs because an incorrect lock is used in the function Unsafe. In this case, gCS is the correct lock to use.

Example

Occasionally a shared variable only has to be guarded for write access but not for read access. In that case, use the _Write_guarded_by_ annotation, as shown in the following example.


CRITICAL_SECTION gCS;

_Guarded_by_(gCS) int gData;

typedef struct _DATA2 {
    _Write_guarded_by_(cs) int data;
    CRITICAL_SECTION cs;
} DATA2;

int Safe2(DATA2* p) {
    // OK: read does not have to be guarded
    int result = p->data;
    return result;
}

void Unsafe2(DATA2* p) {
    EnterCriticalSection(&gCS);
    // Warning C26100 (write has to be guarded by p->cs)
    p->data = 1;
    LeaveCriticalSection(&gCS);
}

This example also generates warning C26100 because it uses an incorrect lock in the function Unsafe2.