Advertencia C26133

El autor de la llamada no consigue mantener el bloqueo 'bloqueo 1' antes de llamar a la función 'nombre de la función', pero se mantiene 'bloqueo 2' en su lugar. Posible desajuste de anotación.

Advertencia C26133 se emite cuando el analizador detecta que el bloqueo necesario para llamar a una función no se mantiene cuando se llama a la función. Sin embargo, se mantiene otro bloqueo que parece estar relacionado. Es posible que el código sea seguro para subprocesos y que sea preciso actualizar las anotaciones.

Este diagnóstico normalmente no indica un error en el código, sino un error de coincidencia entre las anotaciones y el comportamiento de bloqueo real. Si es así, el diagnóstico debe resolverse ya que puede haber otros problemas de análisis estáticos que no se notifican debido a las anotaciones incoherentes.

Ejemplos

En el ejemplo siguiente, se emite C26133 cuando se llama a DoTaskWithCustomLock.

Advertencia C26133: El autor de la llamada no consigue mantener el bloqueo 'customLock01' antes de llamar a la función 'DoTaskWithCustomLock', pero se mantiene '(&customLock01)->cs' en su lugar. Posible desajuste de anotación.

#include <sal.h>

struct CustomLock
{
    int cs; // "Critical Section"
};

_Acquires_exclusive_lock_(criticalSection->cs) // notice the `->` indirection
void CustomLockAcquire(CustomLock* criticalSection);

_Releases_lock_(criticalSection->cs) // notice the `->` indirection
void CustomLockRelease(CustomLock* criticalSection);

CustomLock customLock01;

_Requires_lock_held_(customLock01) void DoTaskWithCustomLock();

void DoTask()
{
    CustomLockAcquire(&customLock01);
    DoTaskWithCustomLock(); // C26133
    CustomLockRelease(&customLock01);
}

En este ejemplo, la función DoTask es segura para subprocesos y se comporta según lo previsto, pero el diseño no se refleja correctamente en las anotaciones SAL de simultaneidad. Corrija ajustando las anotaciones de las funciones de bloqueo personalizadas para usar criticalSection en lugar de criticalSection->cs. La advertencia también se puede corregir cambiando la _Requires_lock_held_ anotación de customLock01 a customLock01.cs.

#include <sal.h>

struct CustomLock
{
    int cs; // "Critical Section"
};

_Acquires_exclusive_lock_(criticalSection)
void CustomLockAcquire(CustomLock* criticalSection);

_Releases_lock_(criticalSection)
void CustomLockRelease(CustomLock* criticalSection);

CustomLock customLock01;

_Requires_lock_held_(customLock01) void DoTaskWithCustomLock();

void DoTask()
{
    CustomLockAcquire(&customLock01);
    DoTaskWithCustomLock();
    CustomLockRelease(&customLock01);
}