Bagikan melalui


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.