Peringatan C26100
Kondisi balapan. Variabel 'var' harus dilindungi oleh kunci 'kunci'.
Keterangan
Anotasi _Guarded_by_
dalam kode menentukan kunci yang akan digunakan untuk menjaga variabel bersama. Peringatan C26100 dihasilkan ketika kontrak penjaga dilanggar.
Nama analisis kode: RACE_CONDITION
Contoh
Contoh berikut menghasilkan peringatan C26100 karena ada pelanggaran _Guarded_by_
kontrak.
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);
}
Pelanggaran kontrak terjadi karena kunci yang salah digunakan dalam fungsi Unsafe
. Dalam hal ini, gCS
adalah kunci yang benar untuk digunakan.
Terkadang variabel bersama hanya harus dijaga untuk akses tulis tetapi tidak untuk akses baca. Dalam hal ini, gunakan _Write_guarded_by_
anotasi, seperti yang ditunjukkan dalam contoh berikut.
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);
}
Contoh ini juga menghasilkan peringatan C26100 karena menggunakan kunci yang salah dalam fungsi Unsafe2
.