Y a-t-il des outils C ++ qui détectent une mauvaise utilisation de static_cast, dynamic_cast et reinterpret_cast?
-
20-09-2019 - |
Question
Les réponses à la question suivante décrivent l'utilisation recommandée de static_cast
, dynamic_cast
et reinterpret_cast
en C ++:
Quand faut-static_cast, dynamic_cast, const_cast et reinterpret_cast utiliser?
Connaissez-vous des outils qui peuvent être utilisés pour détecter l'utilisation abusive de ce genre de casting? Est-ce qu'un outil d'analyse statique comme PC-Lint ou Coverity Static Analysis faire?
Le cas particulier qui a poussé cette question était l'utilisation inappropriée de static_cast
pour downcaster un pointeur, que le compilateur ne prévient pas. Je voudrais détecter ce cas à l'aide d'un outil, et ne pas présumer que les développeurs ne feront jamais cette erreur.
La solution
Étant donné qu'il n'y a aucun moyen fiable de dire quel type de points de pointeur au moment de la compilation, c'est un problème assez difficile à attraper au moment de la compilation.
La méthode la plus simple est de faire les prises lors de l'exécution, en utilisant une macro « safe_cast » qui compile un dynamic_cast avec une assertion dans le débogage, et un static_cast dans la version.
Maintenant, pendant le débogage, si le casting est inappropriée, la distribution dynamique renvoie null, et faire valoir. Il y a aussi pas de frais généraux lors de la libération.
Autres conseils
Visual Studio a des avertissements pour certains d'entre eux. C4946, par exemple. Ils sont la plupart du temps rebutés par défaut cependant.
Boost offre des fonctions polymorphic_pointer_downcast () et polymorphic_downcast (), qui agissent comme static_cast mais affirmera (généralement que dans les versions debug) si le dynamic_cast équivalent échoue.
Voir http://www.boost.org/doc /libs/1_61_0/libs/conversion/cast.htm pour plus de détails.