Aracılığıyla paylaş


Uyarı C26429

Sembol hiçbir zaman null olup olmadığını test etmez, olarak gsl::not_nullişaretlenebilir.

C++ Temel Yönergeleri: F.23: "null" değerinin geçerli bir değer olmadığını belirtmek için bir kullanın not_null<T>

İşaretçi değerlerinin geçerliliği hakkındaki varsayımları zorlamak için onayları kullanmak yaygın bir uygulamadır. Sorun şu ki, onaylar arabirim aracılığıyla varsayımları (dönüş türleri veya parametreler gibi) kullanıma sunmaz. Onayları korumak ve diğer kod değişiklikleriyle eşitlenmiş durumda tutmak da zordur. Öneri, hiçbir zaman null değeri olmayan kaynakları işaretlemek için Yönergeler Destek Kitaplığı'ndan kullanılmasıdır gsl::not_null . Kural USE_NOTNULL , null olup olmadığını denetleyebilen yerleri belirlemeye yardımcı olur ve bu nedenle kullanmak gsl::not_nullüzere güncelleştirilebilir.

Açıklamalar

Kuralın mantığı, null denetimin (veya null olmayan bir değerin zorunlu kılınması) iki yana yaslanması için bir işaretçi değişkeninin başvurularını kaldırma kodunu gerektirir. Bu nedenle, uyarılar yalnızca işaretçilerin başvurulmaması ve null için hiçbir zaman test edilmemiş olması durumunda gönderilir.

Geçerli uygulama yalnızca düz işaretçileri (veya diğer adlarını) işler ve akıllı işaretçilere gsl::not_null de uygulanabilse de akıllı işaretçileri algılamaz.

Bir değişken, aşağıdaki bağlamlarda kullanıldığında null için işaretlendi olarak işaretlenir:

  • dal koşulunda sembol ifadesi olarak, örneğin; if (p) { ... }
  • bit düzeyinde olmayan mantıksal işlemler;
  • bir işlenenin sıfır olarak değerlendirilen sabit bir ifade olduğu karşılaştırma işlemleri.

Kuralın tam veri akışı izlemesi yok. Dolaylı denetimlerin kullanıldığı durumlarda (örneğin, bir ara değişkenin null değer barındırdığı ve daha sonra karşılaştırmada kullanıldığı durumlarda) yanlış sonuçlar verebilir.

Kod analizi adı: USE_NOTNULL

Örnek

Gizli beklenti:

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

Tarafından gsl::not_nullnetleştirilen gizli beklenti:

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