警告 C26448
請考慮使用
gsl::finally
是否打算執行最終動作 (gsl.util)
C++ 核心指導方針: GSL.util:公用程式
指導方針支援程式庫提供方便的公用程式來實 作最終動作 概念。 由於 C++ 語言不支援 try-finally 建構,因此通常會實作自訂清除類型,以在解構時叫用任意動作。 公用 gsl::finally
程式會以這種方式實作,並提供更統一的方式,跨程式碼基底執行最終動作。
也有使用 語句以舊式 C 樣式執行 goto
最終動作的情況(C26438 不鼓勵 NO_GOTO )。 很難在大量使用 goto
的程式碼中偵測出確切的意圖,但一些啟發學習法有助於尋找更好的清除候選項目。
備註
- 此規則為輕量型,並使用標籤名稱猜測使用最終動作物件的機會。
- 可引發警告的標籤名稱包含「end」、「final」、「clean」 等字組。
- 警告會出現在 語句中
goto
。 在某些情況下,您可能會看到詳細資訊輸出,但輸出可能會根據程式碼的複雜度來協助設定程式碼的優先順序。 - 此規則一律會與 C26438 NO_GOTO 配對。 視優先順序而定,可以停用其中一個規則。
程式碼分析名稱: USE_GSL_FINALLY
範例
使用多個 goto 語句清除:
void poll(connection_info info)
{
connection c = {};
if (!c.open(info))
return;
while (c.wait())
{
connection::header h{};
connection::signature s{};
if (!c.read_header(h))
goto end; // C26448 and C26438
if (!c.read_signature(s))
goto end; // C26448 and C26438
// ...
}
end:
c.close();
}
使用 取代多個 goto 語句的 gsl::finally
清除:
void poll(connection_info info)
{
connection c = {};
if (!c.open(info))
return;
auto end = gsl::finally([&c] { c.close(); });
while (c.wait())
{
connection::header h{};
connection::signature s{};
if (!c.read_header(h))
return;
if (!c.read_signature(s))
return;
// ...
}
}