Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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);
}
}