共用方式為


警告 C26438

避免 goto (es.76)

C++ 核心指導方針
ES.76 :避免移至

的使用 goto 被廣泛認為是危險且容易出錯的做法。 它只能在產生的程式碼中接受,例如在從文法產生的剖析器中。 使用指導方針支援程式庫所提供的新式 C++ 功能和公用程式,應該很容易避免 goto

備註

  • 即使此規則發生在無效程式碼中,此規則也會在任何出現的 goto 時發出警告,但編譯器不會使用範本程式碼,因此會予以忽略。
  • 當宏包含 goto 時,警告可能會相乘。 目前的報告機制會指向這類宏展開的所有實例。 它通常可以藉由變更宏來修正,或避免其使用有利於更可維護的機制。

程式碼分析名稱: NO_GOTO

範例

宏中的 'goto clean-up'

#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' ,取代為 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;
        // ...
    }
}