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