Peringatan C26117
Merilis 'kunci' kunci yang tidak dipantau dalam fungsi 'func'.
Penegakan kunci yang dicakup secara sintetis memperoleh dan mengunci pasangan rilis dalam program C/C++ tidak dilakukan oleh bahasa. Fungsi dapat menimbulkan efek samping penguncian dengan membuat modifikasi yang dapat diamati pada status konkurensi. Misalnya, fungsi pembungkus kunci menaikkan jumlah akuisisi kunci, atau jumlah kunci, untuk kunci tertentu. Anda dapat membuat anotasi fungsi yang memiliki efek samping dari kunci memperoleh atau mengunci pelepasan dengan menggunakan _Acquires_lock_
atau _Releases_lock_
, masing-masing. Tanpa anotasi seperti itu, fungsi diharapkan tidak mengubah jumlah kunci apa pun setelah kembali. Jika akuisisi dan rilis tidak seimbang, mereka dianggap yatim piatu. Peringatan C26117 dikeluarkan ketika fungsi yang belum diannotasi dengan _Releases_lock_
melepaskan kunci yang tidak ditahannya, karena fungsi harus memiliki kunci sebelum melepaskannya.
Contoh
Contoh berikut menghasilkan peringatan C26117 karena fungsi ReleaseUnheldLock
melepaskan kunci yang tidak selalu ditahan—status flag
ambigu—dan tidak ada anotasi yang menentukan bahwa itu harus.
typedef struct _DATA
{
CRITICAL_SECTION cs;
} DATA;
int flag;
void ReleaseUnheldLock(DATA* p)
{
if (flag)
EnterCriticalSection(&p->cs);
// code ...
LeaveCriticalSection(&p->cs);
}
Kode berikut memperbaiki masalah dengan menjamin bahwa kunci yang dirilis juga diperoleh dalam kondisi yang sama.
typedef struct _DATA
{
CRITICAL_SECTION cs;
} DATA;
int flag;
void ReleaseUnheldLock(DATA* p)
{
if (flag)
{
EnterCriticalSection(&p->cs);
// code ...
LeaveCriticalSection(&p->cs);
}
}