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 Unsafe
yanlış 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 Unsafe2
yanlış bir kilit kullandığından C26100 uyarısını da oluşturur.