Condividi tramite


Avviso C26117

Rilascio del blocco non bloccato 'lock' nella funzione 'func'.

L'applicazione di coppie di blocco con ambito sintattico acquisisci e blocca le coppie di rilascio nei programmi C/C++ non viene eseguita dal linguaggio. Una funzione può introdurre un effetto collaterale di blocco apportando una modifica osservabile allo stato di concorrenza. Ad esempio, una funzione wrapper di blocco incrementa il numero di acquisizioni di blocchi o il conteggio dei blocchi per un determinato blocco. È possibile annotare una funzione che ha un effetto collaterale da un blocco acquisire o bloccare il rilascio usando _Acquires_lock_ rispettivamente o _Releases_lock_. Senza tali annotazioni, è previsto che una funzione non modifichi alcun conteggio di blocchi dopo la restituzione. Se le acquisizioni e le versioni non sono bilanciate, vengono considerate orfane. L'avviso C26117 viene generato quando una funzione che non è stata annotata con _Releases_lock_ rilascia un blocco che non contiene, perché la funzione deve essere proprietaria del blocco prima che venga rilasciata.

Esempi

L'esempio seguente genera l'avviso C26117 perché la funzione ReleaseUnheldLock rilascia un blocco che non contiene necessariamente, ovvero lo stato di flag è ambiguo, e non esiste alcuna annotazione che specifica che deve.

typedef struct _DATA
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

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

Il codice seguente risolve il problema garantendo che il blocco rilasciato venga acquisito anche nelle stesse condizioni.

typedef struct _DATA
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

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

Vedi anche