Avertissement C26429

Le symbole n’est jamais testé pour la nullité, il peut être marqué comme gsl::not_null.

Instructions principales C++ : F.23 : Utilisez un not_null<T> pour indiquer que « null » n’est pas une valeur valide

Il est courant d’utiliser des assertions pour appliquer des hypothèses sur la validité des valeurs de pointeur. Le problème est que les assertions n’exposent pas d’hypothèses par le biais de l’interface (par exemple, dans les types de retour ou les paramètres). Les assertions sont également plus difficiles à gérer et à rester synchronisées avec d’autres modifications de code. La recommandation est d’utiliser gsl::not_null à partir de la bibliothèque de prise en charge des instructions pour marquer les ressources qui ne doivent jamais avoir de valeur Null. La règle USE_NOTNULL permet d’identifier les emplacements qui omettent des case activée pour null et peuvent donc être mis à jour pour utiliser gsl::not_null.

Notes

La logique de la règle nécessite du code pour déréférer une variable de pointeur afin qu’une case activée Null (ou l’application d’une valeur non null) soit justifiée. Par conséquent, les avertissements sont émis uniquement si les pointeurs sont déréférencements et ne sont jamais testés pour null.

L’implémentation actuelle gère uniquement les pointeurs simples (ou leurs alias) et ne détecte pas les pointeurs intelligents, même si gsl::not_null elles peuvent également être appliquées aux pointeurs intelligents.

Une variable est marquée comme case activée pour null lorsqu’elle est utilisée dans les contextes suivants :

  • en tant qu’expression de symbole dans une condition de branche, par exemple ; if (p) { ... }
  • opérations logiques non au niveau du bit ;
  • opérations de comparaison où un opérande est une expression constante qui prend la valeur zéro.

La règle n’a pas de suivi de flux de données complet. Il peut produire des résultats incorrects dans les cas où des case activée indirects sont utilisés (par exemple, lorsqu’une variable intermédiaire contient une valeur Null et est ultérieurement utilisée dans une comparaison).

Nom de l’analyse du code : USE_NOTNULL

Exemple

Attentes masquées :

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

Attentes masquées expliquées par 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();
        // ...
    }
}