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.

Foi útil?

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.

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

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top