Megosztás:


Figyelmeztetés C26429

A szimbólumot soha nem teszteli null értékre, de megjelölhető .gsl::not_null

C++ alapvető irányelvek: F.23: A not_null<T> "null" nem érvényes érték

Gyakori gyakorlat az állítások használata a mutatóértékek érvényességével kapcsolatos feltételezések kikényszerítésére. A probléma az, hogy az állítások nem teszik elérhetővé a feltételezéseket az interfészen keresztül (például a visszatérési típusok vagy paraméterek esetében). Az állításokat nehezebb karbantartani és szinkronban tartani más kódmódosításokkal. A javaslat az gsl::not_null Irányelvek támogatási kódtára alapján jelölje meg azokat az erőforrásokat, amelyeknek soha nem kell null értékűnek lennie. A szabály USE_NOTNULL segít azonosítani azokat a helyeket, amelyek nem ellenőrzik a null értéket, ezért frissíthetők a használatra gsl::not_null.

Megjegyzések

A szabály logikája megköveteli, hogy a kód egy mutatóváltozót halasztson el, hogy a null értékű ellenőrzés (vagy a nem null érték érvényesítése) indokolt legyen. Ezért a figyelmeztetések csak akkor lesznek kibocsátva, ha a mutatók hareferensek, és soha nem tesztelik null értékre.

A jelenlegi implementáció csak egyszerű mutatókat (vagy aliasokat) kezel, és nem észleli az intelligens mutatókat, annak ellenére gsl::not_null , hogy az intelligens mutatókra is alkalmazható.

A változók akkor vannak bejelölve null értékre, ha a következő környezetekben használják:

  • egy ágfeltétel szimbólumkifejezéseként, például if (p) { ... };
  • nem bitenkénti logikai műveletek;
  • összehasonlító műveletek, ahol az egyik operandus egy állandó kifejezés, amely nullára értékel.

A szabály nem rendelkezik teljes adatfolyam-nyomkövetéssel. Helytelen eredményeket eredményezhet olyan esetekben, amikor közvetett ellenőrzéseket használnak (például ha egy köztes változó null értéket tartalmaz, és később összehasonlításban használják).

Kódelemzés neve: USE_NOTNULL.

példa

Rejtett várakozás:

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

Rejtett várakozás tisztázva a következővel 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();
        // ...
    }
}