警告 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 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;
// ...
}
}