C26117
warning C26117: Rilascio di un blocco <lock> non posseduto nella funzione <func>.
L'imposizione in ambito sintattico di acquisire e rilasciare il blocco in coppie nei programmi C/C++ non viene eseguita dal linguaggio.Una funzione può introdurre un effetto collaterale di blocco apportando una modifica osservabile allo stato della concorrenza.Ad esempio, una funzione wrapper di blocco incrementa il numero delle acquisizioni del blocco, o il conteggio dei blocchi, per un blocco specificato. È possibile annotare una funzione che ha un effetto collaterale da un blocco acquisito o rilasciato usando rispettivamente _Acquires_lock_ o _Releases_lock_.Senza queste annotazioni, una funzione si aspetta di non modificare alcun conteggio dei blocchi dopo che ritorna.Se le acquisizioni e i rilasci non sono equilibrati, sono considerate orfane.L'avviso C26117 viene generato quando una funzione che non è stata annotata con _Releases_lock_ rilascia un blocco che non mantiene, in quanto la funzione deve possedere il blocco prima di rilasciarlo.
Esempio
Nell'esempio seguente viene generato un avviso C26117 in quanto la funzione ReleaseUnheldLock rilascia un blocco che non ha necessariamente mantenuto - lo stato del flag è ambiguo- e non c'è un'annotazione che specifica che deve farlo.
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 per garantire che il blocco rilasciato venga acquisito 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);
}
}