Megosztás:


C26117 figyelmeztetés

A "func" függvény nem felügyelt zárolásának feloldása.

Megjegyzések

A C/C++ programokban a szintaktikai hatókörű zárolási és zárolási kiadási párok kényszerítése nem a nyelv által történik. A függvény zárolási mellékhatást okozhat azáltal, hogy megfigyelhető módosítást végez az egyidejűségi állapoton. A zár burkoló függvény például növeli egy adott zár megszerzéseinek számát, vagy zárszámot. A zárolás megszerzése vagy feloldása által okozott mellékhatással rendelkező függvényeket megjegyzésekkel láthatja el _Acquires_lock_ illetve _Releases_lock_ használatával. Ilyen megjelölések nélkül elvárt, hogy a függvény ne módosítsa a zárolások számát a visszatérés után. Ha a beszerzések és kiadások nem kiegyensúlyozottak, árvanak minősülnek. A C26117 figyelmeztetést akkor adják ki, ha egy olyan függvény, amely nincs annotálva _Releases_lock_, kienged egy zárolást, amelyet nem birtokol, mert a függvénynek rendelkeznie kell a zárolással, mielőtt kiengedné.

Példák

Az alábbi példa a C26117 figyelmeztetést generálja, mert a függvény ReleaseUnheldLock felold egy zárolást, amelyet nem feltétlenül tart vissza – az állapot flag nem egyértelmű –, és nincs olyan széljegyzet, amely jelzi, hogy kellene.

typedef struct _DATA
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

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

Az alábbi kód úgy oldja meg a problémát, hogy garantálja, hogy a feloldott zárolást is ugyanazokkal a feltételekkel szerezték be.

typedef struct _DATA
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

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

Lásd még