Dela via


Varning C26117

Frigör ofäst lås "lås" i funktionen "func".

Anmärkningar

Tillämpning av syntaktiskt scope-baserade lås acquire och lås släpper par i C/C++-program utförs inte av språket. En funktion kan introducera en låsnings sidoeffekt genom att göra en observerbar ändring av samtidighetstillståndet. En låsomslutningsfunktion ökar till exempel antalet låsförvärv, eller antalet lås, för ett visst lås. Du kan annotera en funktion som har en sidoeffekt från en låsaktivering eller låssläpp genom att använda _Acquires_lock_ respektive _Releases_lock_. Utan sådana anteckningar förväntas en funktion inte ändra något låsantal när den har returnerats. Om tilldelningar och frigörelser inte balanseras anses de vara utan samband. Varning C26117 utfärdas när en funktion som inte har kommenterats med _Releases_lock_ frigör ett lås som inte finns, eftersom funktionen måste äga låset innan det släpps.

Examples

I följande exempel genereras varning C26117 eftersom funktionen ReleaseUnheldLock frigör ett lås som den inte nödvändigtvis har – tillståndet flag för är tvetydigt – och det finns ingen anteckning som anger att den ska.

typedef struct _DATA
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

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

Följande kod åtgärdar problemet genom att garantera att det frisläppta låset också hämtas under samma villkor.

typedef struct _DATA
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

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

Se även