Existem ferramentas C ++ que detectam uso indevido de static_cast, dinâmico_cast e reinterpret_cast?
-
20-09-2019 - |
Pergunta
As respostas para a seguinte pergunta descrevem o uso recomendado de static_cast
, dynamic_cast
, e reinterpret_cast
em C ++:
Quando deve ser usado static_cast, dinâmico_cast, const_cast e reinterpret_cast?
Você conhece alguma ferramenta que possa ser usada para detectar o uso indevido desses tipos de elenco? Uma ferramenta de análise estática como PC-Lint ou Análise estática de cobertura faria isso?
O caso particular que provocou essa pergunta foi o uso inadequado de static_cast
Para baixo um ponteiro, sobre o qual o compilador não avisa. Eu gostaria de detectar esse caso usando uma ferramenta e não assumir que os desenvolvedores nunca cometerão esse erro.
Solução
Dado que não existe uma maneira confiável de dizer que tipo o ponteiro aponta para a hora da compilação, esse é um problema bastante difícil de capturar na hora da compilação.
O método mais simples é fazer a captura em tempo de execução, usando um macro "Safe_cast" que compila com um dinâmico_cast com uma afirmação no Debug e um static_cast no lançamento.
Agora, durante a depuração, se o elenco for inapropriado, o elenco dinâmico retornará nulo e afirmará. Também não há sobrecarga durante a liberação.
Outras dicas
O Visual Studio tem avisos para alguns deles. C4946, por exemplo. Eles estão desligados principalmente por padrão.
O Boost oferece as funções polymorphic_pointer_downcast () e polymorphic_downcast (), que agem como static_cast, mas serão afirmadas (normalmente apenas no depuração) se o dinâmico equivalente falhar.
Ver http://www.boost.org/doc/libs/1_61_0/libs/conversion/cast.htm para detalhes.