次の方法で共有


警告 C26438

回避 goto (es.76)

C++ Core Guidelines:
ES.76: "goto" は使用しません

goto の使用は、危険でエラーが発生しやすい方法と広く考えられます。 これは、文法から生成されたパーサーなど、生成されたコードでのみ受け入れ可能です。 ガイドライン サポート ライブラリによって提供される最新の C++ の機能とユーティリティを使用すると、goto を完全に回避するのは簡単です。

解説

  • このルール gotoは、使用されたことがないテンプレート コードを除き、デッド コードで発生した場合でも、コンパイラによって無視されます。
  • マクロに goto が含まれている場合、警告が増える可能性があります。 現在のレポート メカニズムは、このようなマクロが展開されるすべてのインスタンスを指します。 多くの場合、マクロを変更するか、保守容易なメカニズムを優先的に使用しないようにして、1 か所で修正できます。

コード分析名: 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 クリーン-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;
        // ...
    }
}