Существуют ли какие-либо инструменты C ++, которые обнаруживают неправильное использование static_cast, dynamic_cast и reinterpret_cast?

StackOverflow https://stackoverflow.com/questions/2465964

Вопрос

Ответы на следующий вопрос описывают рекомендуемое использование 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, например.Однако по умолчанию они в основном отключены.

http://msdn.microsoft.com/en-us/library/23k5d385.aspx

Boost предлагает функции polymorphic_pointer_downcast() и polymorphic_downcast(), которые действуют подобно static_cast, но будут подтверждать (обычно только в отладочных сборках), если произойдет сбой эквивалентной dynamic_cast.

Видишь http://www.boost.org/doc/libs/1_61_0/libs/conversion/cast.htm для получения подробной информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top