Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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();
// ...
}
}