Delen via


Waarschuwing C26117

Een niet-gehouden vergrendeling vrijgeven in functie func.

Opmerkingen

Het afdwingen van syntactisch omgeven acquireren en loslaten van koppels in C/C++-programma's wordt niet uitgevoerd door de taal. Een functie kan een neveneffect van de vergrendeling veroorzaken door een waarneembare wijziging aan te brengen in de gelijktijdigheidsstatus. Met een vergrendelingswikkelfunctie wordt bijvoorbeeld het aantal overnames van vergrendelingen of het aantal vergrendelingen voor een bepaalde vergrendeling verhoogd. U kunt aantekeningen maken voor een functie die een neveneffect heeft van een vergrendeling of vergrendelingsvrijgave door _Acquires_lock_ of _Releases_lock_ te gebruiken, respectievelijk. Zonder dergelijke aantekeningen wordt verwacht dat een functie geen vergrendelingsaantal wijzigt na terugkeer. Als verkrijgingen en releases niet in balans zijn, worden ze beschouwd als verweesd. Waarschuwing C26117 wordt uitgegeven wanneer een functie die niet is geannoteerd met _Releases_lock_ een vergrendeling vrijgeeft die het niet vasthoudt, omdat de functie de vergrendeling moet bezitten voordat het deze vrijgeeft.

Voorbeelden

In het volgende voorbeeld wordt een waarschuwing C26117 gegenereerd omdat de functie ReleaseUnheldLock een vergrendeling vrijgeeft die niet noodzakelijkerwijs wordt vastgehouden (de staat van flag is dubbelzinnig) en er is geen annotatie die aangeeft dat dit zou moeten.

typedef struct _DATA
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

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

Met de volgende code wordt het probleem opgelost door te garanderen dat de vrijgegeven vergrendeling ook onder dezelfde voorwaarden wordt verkregen.

typedef struct _DATA
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

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

Zie ook