Sdílet prostřednictvím


Upozornění C26438

Vyhněte se goto (es.76)

Pokyny pro C++ Core:
ES.76: Vyhněte se goto

Použití goto je široce považováno za nebezpečnou a náchylnou k chybám. Je přijatelné pouze ve vygenerovaném kódu, například v analyzátoru vygenerovaném z gramatiky. Díky moderním funkcím a nástrojům jazyka C++, které poskytuje knihovna podpory pokynů, by mělo být snadné se úplně vyhnout goto .

Poznámky

  • Toto pravidlo upozorní na jakýkoli výskyt goto, i když dojde v mrtvém kódu, s výjimkou kódu šablony, který se nikdy nepoužívá, a tak je ignorován kompilátorem.
  • Upozornění se můžou násobit, když makro obsahuje goto. Aktuální mechanismy vytváření sestav odkazují na všechny instance, ve kterých se takové makro rozbalí. Často se dá opravit na jednom místě změnou makra nebo se vyhnout jeho použití ve prospěch více udržovatelných mechanismů.

Název analýzy kódu: NO_GOTO

Příklad

"goto clean-up" v makru

#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" v makru, nahrazeno 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;
        // ...
    }
}