Megosztás:


Figyelmeztetés C26441

Az őrobjektumokat el kell nevezni (cp.44)

C++ alapvető irányelvek

CP.44: Ne felejtse elnevezni a lock_guard-okat és unique_lock-okat

Megjegyzések

A standard kódtár zárolásokat biztosít az erőforrásokhoz való egyidejű hozzáférés szabályozásához az élettartamuk során. Ha név nélküli zárolási objektumot deklarál, a fordító létrehoz egy ideiglenes objektumot, amely azonnal le lesz bontva, nem pedig egy olyan objektumot, amely a beágyazási hatókör végéig él. Ezért a zárolási objektum változóhoz való hozzárendelésének elmulasztása olyan hiba, amely hatékonyan letiltja a zárolási mechanizmust (mivel az ideiglenes változók átmenetiek). Ez a szabály az ilyen nem szándékos viselkedés egyszerű eseteit rögzíti.

Ez a diagnosztika csak a standard zárolási típusokat std::scoped_lockelemzi, std::unique_lockés std::lock_guard. A C26444 figyelmeztetés más névtelen RAII-típusokat is tartalmaz.

Az elemző csak a konstruktorok egyszerű hívásait elemzi. Az összetettebb inicializáló kifejezések pontatlan eredményekhez vezethetnek kihagyott figyelmeztetések formájában. Az elemző figyelmen kívül hagyja a függvényhívásoknak argumentumként átadott vagy függvényhívásokból visszaadott zárolásokat. Nem lehet meghatározni, hogy ezek a zárolások szándékosan próbálják-e a függvényhívást védeni, vagy az élettartamukat meg kell-e hosszabbítani. Ha hasonló védelmet szeretne biztosítani a függvényhívások által visszaadott típusok számára, jegyzetelje meg őket a következővel [[nodiscard]]: . A konstruktorokat megjegyzésekkel [[nodiscard]] is elláthatja, hogy elkerülje az ilyen típusú névtelen objektumokat:

struct X { [[nodiscard]] X(); };

void f() {
    X{}; // warning C4834
}

Az elemző figyelmen kívül hagyja az ideiglenesként létrehozott, de elnevezett hivatkozásokhoz rendelt zárolásokat az élettartam meghosszabbítása érdekében.

Kódelemzés neve: NO_UNNAMED_GUARDS.

példa

Ebben a példában hiányzik a scope lock neve.

void print_diagnostic(std::string_view text)
{
    auto stream = get_diagnostic_stream();
    if (stream)
    {
        std::lock_guard<std::mutex>{ diagnostic_mutex_ }; // C26441
        write_line(stream, text);
    }
}

A hiba kijavításához adjon nevet a zárolásnak, amely meghosszabbítja az élettartamát.

void print_diagnostic(std::string_view text)
{
    auto stream = get_diagnostic_stream();
    if (stream)
    {
        std::lock_guard<std::mutex> lock{ diagnostic_mutex_ };
        write_line(stream, text);
    }
}

Lásd még

C26444