Gibt es C ++ Tools, die den Missbrauch von static_cast, dynamic_cast erkennen und reinterpret_cast?
-
20-09-2019 - |
Frage
Die Antworten auf die folgenden Fragen beschreiben die empfohlene Verwendung von static_cast
, dynamic_cast
und reinterpret_cast
in C ++:
Wann sollte static_cast, dynamic_cast, const_cast und reinterpret_cast verwendet werden?
Kennen Sie irgendwelche Werkzeuge, die verwendet werden können, Missbrauch dieser Arten von Guss zu erkennen? Würde ein statische Analyse-Tool wie PC-Lint oder Coverity Static Analysis tun?
Der besondere Fall, dass diese Frage aufgefordert, war die unangemessene Verwendung von static_cast
einen Zeiger auf niedergeschlagenen, die die Compiler nicht zustande warnen. Ich mag diesen Fall erkennen, mit einem Werkzeug, und nicht davon ausgehen, dass die Entwickler nie diesen Fehler machen.
Lösung
Da gibt es keine zuverlässige Möglichkeit, zu sagen, was den Zeiger auf zum Zeitpunkt der Kompilierung geben, das ist ein ziemlich schwieriges Problem zu fangen bei der Kompilierung.
Die einfachste Methode ist es, den Fang zu Laufzeit zu tun, einen Makro „safe_cast“ verwendet, die kompiliert zu einem dynamic_cast mit einer Assertion in debuggen und einem static_cast in Release.
Nun, beim Debuggen, wenn die Besetzung nicht geeignet ist, wird die dynamische Umwandlung NULL zurück, und assert. Es gibt auch keinen Overhead bei der Freigabe.
Andere Tipps
Visual Studio hat Warnungen für einige von ihnen. C4946, zum Beispiel. Sie sind meist standardmäßig though.
ausgeschaltetBoost-Angebote polymorphic_pointer_downcast () und polymorphic_downcast () Funktionen, die wie static_cast wirken aber behaupten (in der Regel nur in Debug-Builds), wenn das Äquivalent dynamic_cast ausfällt.
Siehe http://www.boost.org/doc /libs/1_61_0/libs/conversion/cast.htm .