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 de vérifier 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 vérification 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 vérifiée pour la valeur 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 vérifications indirectes sont utilisées (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();
// ...
}
}