Freigeben über


Warnung C26438

Vermeiden goto (es.76)

C++-Kernrichtlinien:
ES.76: Vermeiden von Goto

Die Verwendung von goto wird häufig als gefährliche und fehleranfällige Praxis angesehen. Es ist nur in generiertem Code zulässig, z. B. in einem Parser, der aus einer Grammatik generiert wurde. Mit modernen C++-Features und Dienstprogrammen, die von der Richtlinien-Supportbibliothek bereitgestellt werden, sollte es einfach sein, ganz zu vermeiden goto .

Hinweise

  • Diese Regel warnt bei jedem Vorkommen von goto, auch wenn dies im inaktiven Code geschieht, mit Ausnahme von Vorlagencode, der niemals verwendet wird und daher vom Compiler ignoriert wird.
  • Warnungen können sich multiplizieren, wenn ein Makro enthält goto. Aktuelle Berichtsmechanismen verweisen auf alle Instanzen, in denen ein solches Makro erweitert wird. Es kann häufig an einer Stelle behoben werden, indem das Makro geändert wird, oder die Verwendung zugunsten von besser verwendbaren Mechanismen vermieden wird.

Name der Codeanalyse: NO_GOTO

Beispiel

"Gehe zum Bereinigen" im Makro

#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();
}

"Gehe zum Aufräumen" im Makro, ersetzt durch 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;
        // ...
    }
}