Partager via


Avertissement C26403

Réinitialiser ou supprimer explicitement un owner<T> pointeur 'variable' (r.3)

Les pointeurs propriétaires sont comme des pointeurs uniques : ils possèdent une ressource exclusivement et gèrent la mise en production de la ressource, ou ses transferts vers d’autres propriétaires. Cette vérification vérifie qu’un pointeur de propriétaire local conserve correctement sa ressource via tous les chemins d’exécution d’une fonction. Si la ressource n’a pas été transférée vers un autre propriétaire ou n’a pas été explicitement mise en production, le vérificateur avertit et pointe vers la déclaration de la variable de pointeur.

Pour plus d’informations, consultez les instructions de base C++.

Notes

  • Actuellement, cette vérification ne donne pas le chemin exact qui ne parvient pas à libérer la ressource. Ce comportement peut être amélioré dans les futures versions. Il peut être difficile de trouver un emplacement exact pour un correctif. La meilleure approche consiste à essayer de remplacer des pointeurs simples dans des fonctions complexes par des pointeurs uniques pour éviter les risques.

  • La vérification peut ignorer une fonction trop complexe afin de ne pas bloquer l’analyse du code. En règle générale, la complexité des fonctions doit être maintenue sous un seuil raisonnable. Nous pouvons envisager d’ajouter un contrôle de complexité local au module C++ Core Guidelines en cas de demande claire. Cette limitation s’applique à d’autres règles sensibles au flux de données.

  • L’avertissement peut se déclencher sur des cas clairement faux positifs où la mémoire est supprimée uniquement après la vérification null d’un pointeur. Ces faux positifs sont le résultat d’une limitation actuelle de l’API de l’outil, mais elle peut être améliorée à l’avenir.

Nom de l’analyse du code : RESET_OR_DELETE_OWNER

Exemple

Nettoyage manquant pendant la gestion des erreurs :

gsl::owner<int*> sequence = GetRandomSequence(); // C26403

try
{
    StartSimulation(sequence);
}
catch (const std::exception& e)
{
    if (KnownException(e))
        return; // Skipping the path which deletes the owner.

    ReportException(e);
}

delete [] sequence;