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