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 durch Ändern des Makros behoben werden oder die Verwendung zugunsten von mehr Standard nachhaltigen Mechanismen vermieden werden.

Codeanalysename: NO_GOTO

Beispiel

"Gehe zu sauber-Up" 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();
}

"Goto sauber-up" im Makro ersetzt durchgsl::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;
        // ...
    }
}