Megosztás a következőn keresztül:


Figyelmeztetés C26438

Kerülje goto (es.76)

C++ alapvető irányelvek:
ES.76: Kerülje a goto

goto használatát széles körben veszélyes és hibákat okozó gyakorlatnak tekintik. Ez csak generált kódban elfogadható, például nyelvtanból létrehozott elemzőben. A Guidelines Support Library által biztosított modern C++ nyelvi elemekkel és eszközökkel teljesen elkerülhető goto.

Megjegyzések

  • Ez a szabály figyelmeztet minden olyan eseményre goto, amely még akkor is előfordul, ha az halott kódban történik, kivéve a soha nem használt sablonkódot, és ezt a fordító figyelmen kívül hagyja.
  • A figyelmeztetések megszaporodhatnak, ha egy makró tartalmaz goto. A jelenlegi jelentéskészítési mechanizmusok az összes olyan esetre mutatnak, ahol az ilyen makrók kibontásra kerülnek. Gyakran javítható egy helyen a makró módosításával, vagy a fenntarthatóbb mechanizmusok érdekében történő használatának elkerülésével.

Kódelemzés neve: NO_GOTO.

példa

"goto clean-up" a makróban

#define ENSURE(E, L) if (!(E)) goto L;

void poll(connection &c)
{
    ENSURE(c.open(), end);                  // C26438

    while (c.wait())
    {
        connection::header h{};
        connection::signature s{};
        ENSURE(c.read_header(h), end);      // C26438
        ENSURE(c.read_signature(s), end);   // C26438
        // ...
    }

end:
    c.close();
}

"goto clean-up" a makróban lecserélve a következőre: gsl::finally

void poll(connection &c)
{
    auto end = gsl::finally([&c] { c.close(); });

    if (!c.open())
        return;

    while (c.wait())
    {
        connection::header h{};
        connection::signature s{};
        if(!c.read_header(h))
            return;
       if(!c.read_signature(s))
            return;
        // ...
    }
}