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

Ответы на следующий вопрос описывают рекомендуемое использование static_cast, dynamic_cast и reinterpret_cast в C ++:

Когда следует использовать static_cast, dynamic_cast, const_cast и reinterpret_cast?

Знаете ли вы какие-либо инструменты, которые можно использовать для обнаружения злоупотребления этими видами приведения? Будет ли это делать инструмент статического анализа, такой как PC-Lint или Coverity Static Analysis?

Частным случаем, вызвавшим этот вопрос, было неправильное использование static_cast для уменьшения указателя, о котором компилятор не предупреждает. Я хотел бы обнаружить это дело с помощью инструмента и не предполагать, что разработчики никогда не допустят эту ошибку.

Ответы [ 3 ]

5 голосов
/ 18 марта 2010

Учитывая, что не существует надежного способа определить, на какой тип указатель указывает во время компиляции, это довольно сложная проблема для обнаружения во время компиляции.

Самый простой способ - выполнить перехват во время выполнения, используя макрос «safe_cast», который компилируется в dynamic_cast с assert в отладке и static_cast в выпуске.

Теперь, во время отладки, если приведение не подходит, динамическое приведение вернет NULL и подтвердит. Во время выпуска также нет накладных расходов.

4 голосов
/ 18 марта 2010

Visual Studio имеет предупреждения для некоторых из них. C4946, например. По умолчанию они в основном отключены.

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

0 голосов
/ 10 августа 2016

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

Подробнее см. http://www.boost.org/doc/libs/1_61_0/libs/conversion/cast.htm.

...