Существуют ли какие-либо инструменты C ++, которые обнаруживают неправильное использование static_cast, dynamic_cast и reinterpret_cast?
-
20-09-2019 - |
Вопрос
Ответы на следующий вопрос описывают рекомендуемое использование static_cast
, dynamic_cast
, и reinterpret_cast
в C++:
Когда следует использовать static_cast, dynamic_cast, const_cast и reinterpret_cast?
Знаете ли вы о каких-либо инструментах, которые можно использовать для выявления неправильного использования этих видов приведения?Может ли это сделать такой инструмент статического анализа, как PC-Lint или Coverity Static Analysis?
Конкретным случаем, вызвавшим этот вопрос, было неуместное использование static_cast
чтобы опустить указатель, о котором компилятор не предупреждает.Я бы хотел обнаружить этот случай с помощью инструмента, а не предполагать, что разработчики никогда не допустят этой ошибки.
Решение
Учитывая, что не существует надежного способа определить, на какой тип указывает указатель во время компиляции, это довольно сложная проблема для отслеживания во время компиляции.
Самый простой метод - выполнить перехват во время выполнения, используя макрос "safe_cast", который компилируется в dynamic_cast с assert в debug и static_cast в release.
Теперь, во время отладки, если приведение неуместно, динамическое приведение вернет NULL и подтвердит.Кроме того, во время выпуска не возникает накладных расходов.
Другие советы
В Visual Studio есть предупреждения для некоторых из них.C4946, например.Однако по умолчанию они в основном отключены.
Boost предлагает функции polymorphic_pointer_downcast() и polymorphic_downcast(), которые действуют подобно static_cast, но будут подтверждать (обычно только в отладочных сборках), если произойдет сбой эквивалентной dynamic_cast.
Видишь http://www.boost.org/doc/libs/1_61_0/libs/conversion/cast.htm для получения подробной информации.