Aracılığıyla paylaş


Uyarı C26117

'func' işlevinde rafsız kilit 'lock' serbest bırakıyoruz.

Açıklamalar

C/C++ programlarında sağlam kapsamlı kilit alma ve kilitleme yayın çiftlerinin uygulanması dil tarafından gerçekleştirilmiyor. İşlev, eşzamanlılık durumunda gözlemlenebilir bir değişiklik yaparak kilitleme yan etkisine neden olabilir. Örneğin, bir kilit sarmalayıcı işlevi belirli bir kilit için kilit alma sayısını veya kilit sayısını artırır. Sırasıyla veya _Acquires_lock_kullanarak _Releases_lock_ kilit alma veya kilitleme yayınından yan etkisi olan bir işleve açıklama ekleyebilirsiniz. Bu tür ek açıklamalar olmadan, işlevin döndürdüğü kilit sayısını değiştirmemesi beklenir. Almalar ve sürümler dengeli değilse, yalnız bırakılmış olarak kabul edilir. Uyarı C26117, açıklama eklenmemiş _Releases_lock_ bir işlev tutmadığı bir kilit bıraktığında verilir, çünkü işlevin kilidi yayınlamadan önce sahip olması gerekir.

Örnekler

Aşağıdaki örnek C26117 uyarısını oluşturur çünkü işlev ReleaseUnheldLock tutmaması gereken bir kilit serbest bırakır(durumu flag belirsizdir) ve olması gerektiğini belirten bir ek açıklama yoktur.

typedef struct _DATA
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

void ReleaseUnheldLock(DATA* p)
{
    if (flag)
        EnterCriticalSection(&p->cs);
    // code ...
    LeaveCriticalSection(&p->cs);
}

Aşağıdaki kod, serbest bırakılan kilidin de aynı koşullar altında alındığını garanti ederek sorunu düzeltir.

typedef struct _DATA
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

void ReleaseUnheldLock(DATA* p)
{
    if (flag)
    {
        EnterCriticalSection(&p->cs);
        // code ...
        LeaveCriticalSection(&p->cs);
    }
}

Ayrıca bkz.