Avertissement C26437
Ne pas trancher.
Instructions principales C++ : ES.63 : Ne pas segmenter
La langue permet le découpage et peut être considéré comme un cas spécial d’un cast implicite dangereux. Même s’il est fait intentionnellement et n’entraîne pas de problèmes immédiats, il est toujours fortement déconseillé. Il rend le code plus difficile à modifier, en forçant des exigences supplémentaires sur les types de données associés. Il est particulièrement vrai si les types sont polymorphes ou impliquent la gestion des ressources.
Notes
Cette règle avertit non seulement les affectations explicites, mais également les découpages implicites. Le découpage implicite se produit lorsqu’un résultat est retourné à partir de la fonction actuelle ou lorsque les données sont transmises à d’autres fonctions.
La règle signale également les cas où une affectation n’implique pas de découpage de données réels (par exemple, si les types sont vides ou ne font pas de manipulations de données dangereuses). Ces avertissements doivent toujours être corrigés pour empêcher toute régression indésirable si les types de données ou les comportements changent à l’avenir.
Exemple
Dans l’exemple de code suivant, nous lisons id_ex
, mais l’appelant de la fonction obtient uniquement une tranche de l’objet :
struct id {
int value;
};
struct id_ex : id {
int extension;
};
bool read_id(stream &s, id &v) {
id_ex tmp{};
if (!s.read(tmp.value) || !s.read(tmp.extension))
return false;
v = tmp; // C26437
return true;
}
Pour résoudre le problème, mettez à jour la fonction pour utiliser les types appropriés :
// ...
bool read_id(stream &s, id_ex &v) {
// ...