共用方式為


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