共用方式為


警告 C26429

符號永遠不會測試 Null,它可以標示為 gsl::not_null

C++ 核心指導方針 F.23 :使用 not_null<T> 來指出 「null」 不是有效的值

使用判斷提示來強制執行指標值有效性的假設是常見的做法。 問題是,判斷提示不會透過 介面公開假設(例如在傳回型別或參數中)。 判斷提示也較難維持並與其他程式碼變更保持同步。 建議從指導方針支援程式庫使用 gsl::not_null ,以標記不應該有 Null 值的資源。 此規則 USE_NOTNULL 有助於識別省略 Null 檢查的位置,因此可以更新為使用 gsl::not_null

備註

規則的邏輯需要程式碼來取值指標變數,讓 Null 檢查(或強制執行非 Null 值)是合理的。 因此,只有在指標被取值且永遠不會測試 Null 時,才會發出警告。

目前的實作只會處理純文字指標(或其別名),而且不會偵測智慧型指標,即使 gsl::not_null 也可以套用至智慧型指標。

變數在下列內容中使用時,會標示為已核取 null:

  • 做為分支條件中的符號運算式,例如 ; if (p) { ... }
  • 非位邏輯作業;
  • 比較作業,其中一個運算元是評估為零的常數運算式。

規則沒有完整的資料流程追蹤。 在使用間接檢查的情況下,可能會產生不正確的結果(例如,當中繼變數保留 Null 值,稍後用於比較時)。

程式碼分析名稱: USE_NOTNULL

範例

隱藏的期望:

using client_collection = gsl::span<client*>;
// ...
void keep_alive(const connection *connection)   // C26429
{
    const client_collection clients = connection->get_clients();
    for (ptrdiff_t i = 0; i < clients.size(); i++)
    {
        auto client = clients[i];               // C26429
        client->send_heartbeat();
        // ...
    }
}

所厘清的 gsl::not_null 隱藏期望:

using client_collection = gsl::span<gsl::not_null<client*>>;
// ...
void keep_alive(gsl::not_null<const connection*> connection)
{
    const client_collection clients = connection->get_clients();
    for (ptrdiff_t i = 0; i < clients.size(); i++)
    {
        auto client = clients[i];
        client->send_heartbeat();
        // ...
    }
}