Advertencia C26105

Infracción de orden de bloqueo. La adquisición del bloqueo "lock" con el nivel "level" provoca la inversión del orden.

Actualmente, SAL admite niveles de bloqueo. Para declarar un nivel de bloqueo, que se indica mediante un literal de cadena sin comillas dobles, use _Create_lock_level_. Puede imponer un orden de adquisición entre dos niveles de bloqueo mediante la anotación _Set_lock_level_order_(A,B), que indica que los bloqueos que tienen el nivel A deben adquirirse antes que los bloqueos que tienen el nivel B. Para establecer una jerarquía de orden de bloqueo (un orden parcial entre niveles de bloqueo), use varias anotaciones _Set_lock_level_order_. Para asociar un bloqueo a un nivel de bloqueo, use la anotación _Set_lock_level_ al declarar el bloqueo. La advertencia C26105 se emite cuando se detecta una infracción en el orden de bloqueo.

Ejemplo

En el ejemplo siguiente se genera la advertencia C26105 porque hay una inversión de orden de bloqueo en la función OrderInversion.

_Create_lock_level_(MutexLockLevel);
_Create_lock_level_(TunnelLockLevel);
_Create_lock_level_(ChannelLockLevel);
_Lock_level_order_(MutexLockLevel, TunnelLockLevel);
_Lock_level_order_(TunnelLockLevel, ChannelLockLevel);
_Has_lock_level_(MutexLockLevel) HANDLE gMutex;

struct Tunnel
{
    _Has_lock_level_(TunnelLockLevel) CRITICAL_SECTION cs;
};

struct Channel
{
    _Has_lock_level_(ChannelLockLevel) CRITICAL_SECTION cs;
};

void OrderInversion(Channel* pChannel, Tunnel* pTunnel)
{
    EnterCriticalSection(&pChannel->cs);
    // Warning C26105
    WaitForSingleObject(gMutex, INFINITE);
    EnterCriticalSection(&pTunnel->cs);
    LeaveCriticalSection(&pTunnel->cs);
    LeaveCriticalSection(&pChannel->cs);
}