Advertencia C26117

Liberar el bloqueo no retenido 'lock' en la función 'func'.

El lenguaje no realiza el cumplimiento de pares de adquisición y liberación de bloqueos de bloqueo sintáctica en programas de C/C++. Una función puede introducir un efecto secundario de bloqueo realizando una modificación observable en el estado de simultaneidad. Por ejemplo, una función contenedora de bloqueo incrementa el número de adquisiciones de bloqueos o recuento de bloqueos para un bloqueo determinado. Puede anotar una función que tenga un efecto secundario de una adquisición de bloqueo o de una liberación de bloqueo mediante _Acquires_lock_ o _Releases_lock_, respectivamente. Sin estas anotaciones, se espera que una función no cambie ningún recuento de bloqueos después de que devuelva resultados. Si las adquisicións y las versiones no están equilibradas, se consideran huérfanas. Advertencia C26117 se emite cuando una función que no se ha anotado con _Releases_lock_ libera un bloqueo que no contiene, ya que la función debe poseer el bloqueo antes de liberarlo.

Ejemplos

En el ejemplo siguiente se genera la advertencia C26117 porque la función ReleaseUnheldLock libera un bloqueo que no tiene necesariamente, el estado de flag es ambiguo y no hay ninguna anotación que especifique que debería.

typedef struct _DATA
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

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

El código siguiente corrige el problema al garantizar que el bloqueo liberado también se adquiere en las mismas condiciones.

typedef struct _DATA
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

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

Consulte también