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.
Fontolja meg a végleges művelet használatát
gsl::finally(gsl.util)
C++ alapvető irányelvek: GSL.util: Segédprogramok
Az irányelvek támogatási kódtára kényelmes segédprogramot biztosít a végleges műveleti koncepció implementálásához. Mivel a C++ nyelv nem támogatja a végrepróbálkozható szerkezeteket, általánossá vált az egyéni törlési típusok implementálása, amelyek tetszőleges műveleteket indítanának el a megsemmisítés során. A gsl::finally segédprogram ily módon van implementálva, és egységesebb módot biztosít a végleges műveletek végrehajtására egy kódbázison.
Vannak olyan esetek is, amikor a végleges műveleteket régimódi C-stílusban hajtják végre utasítások használatával goto (ezt a C26438 NO_GOTO is elriasztja). Nehéz felismerni a szigorúan használt gotokód pontos szándékát, de néhány heurisztika segíthet megtalálni a jobb jelölteket a tisztításhoz.
Megjegyzések
- Ez a szabály egyszerű, és címkenevek használatával kitalálja a végleges műveleti objektumok használatának lehetőségeit.
- A figyelmeztetést generáló címkenevek olyan szavakat tartalmaznak, mint a "end", a "final", a "clean", és így tovább.
- Az utasításoknál
gotofigyelmeztetések jelennek meg. Előfordulhat, hogy egyes esetekben részletes kimenet jelenik meg, de a kimenet segíthet a kód rangsorolásában, annak összetettségétől függően. - Ez a szabály mindig a C26438 NO_GOTO párosul. A prioritásoktól függően ezen szabályok egyikét le lehet tiltani.
Kódelemzés neve: USE_GSL_FINALLY.
példa
Törlés több goto utasítással:
void poll(connection_info info)
{
connection c = {};
if (!c.open(info))
return;
while (c.wait())
{
connection::header h{};
connection::signature s{};
if (!c.read_header(h))
goto end; // C26448 and C26438
if (!c.read_signature(s))
goto end; // C26448 and C26438
// ...
}
end:
c.close();
}
Törlés több goto utasítással a következő helyett gsl::finally:
void poll(connection_info info)
{
connection c = {};
if (!c.open(info))
return;
auto end = gsl::finally([&c] { c.close(); });
while (c.wait())
{
connection::header h{};
connection::signature s{};
if (!c.read_header(h))
return;
if (!c.read_signature(s))
return;
// ...
}
}