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 case activée 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, l’case activée er 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 case activée 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.

  • Le case activée peut dis carte une fonction trop compliquée 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 une complexité locale case activée au module Instructions de base C++ 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 case activée 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

Absence de propre up 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;