Aracılığıyla paylaş


Uyarı C26100

Yarış durumu. 'var' değişkeni 'lock' kilidiyle korunmalıdır.

Açıklamalar

Koddaki _Guarded_by_ ek açıklama, paylaşılan değişkeni korumak için kullanılacak kilidi belirtir. Koruma sözleşmesi ihlal edildiğinde C26100 uyarısı oluşturulur.

Kod analizi adı: RACE_CONDITION

Örnekler

Aşağıdaki örnek, sözleşmenin ihlali olduğundan C26100 uyarısını _Guarded_by_ oluşturur.

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

sözleşme ihlali, işlevinde Unsafeyanlış bir kilit kullanıldığından oluşur. Bu durumda, gCS kullanılacak doğru kilittir.

Bazen paylaşılan bir değişkenin yalnızca yazma erişimi için korunması gerekir, ancak okuma erişimi için korunmamalıdır. Bu durumda, aşağıdaki örnekte gösterildiği gibi ek açıklamayı kullanın _Write_guarded_by_ .

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

Bu örnek, işlevinde Unsafe2yanlış bir kilit kullandığından C26100 uyarısını da oluşturur.