Esistono strumenti C++ che rilevano l'uso improprio di static_cast, Dynamic_cast e reinterpret_cast?
-
20-09-2019 - |
Domanda
Le risposte alla domanda seguente descrivono l'utilizzo consigliato di static_cast
, dynamic_cast
, E reinterpret_cast
in C++:
Quando dovrebbero essere utilizzati static_cast, Dynamic_cast, const_cast e reinterpret_cast?
Conosci qualche strumento che possa essere utilizzato per rilevare l'uso improprio di questo tipo di gesso?Uno strumento di analisi statica come PC-Lint o Coverity Static Analysis farebbe questo?
Il caso particolare che ha portato a questa domanda è stato l'uso inappropriato di static_cast
per abbassare un puntatore, di cui il compilatore non avvisa.Mi piacerebbe rilevare questo caso utilizzando uno strumento e non dare per scontato che gli sviluppatori non commetteranno mai questo errore.
Soluzione
Dato che non v'è alcun modo affidabile di dire che tipo il puntatore punta a in fase di compilazione, questo è un problema piuttosto difficile da catturare in fase di compilazione.
Il metodo più semplice è quello di fare il fermo a run-time, utilizzando una macro "safe_cast", che viene compilato in un dynamic_cast con un'asserzione in debug e uno static_cast nel rilascio.
Ora, durante il debug, se il cast non è appropriato, il cast dinamico sarà di ritorno NULL, e affermano. Non c'è inoltre in testa durante il rilascio.
Altri suggerimenti
Visual Studio dispone di avvisi per alcuni di questi.C4946, ad esempio.Tuttavia, sono per lo più disattivati per impostazione predefinita.
Boost offre polymorphic_pointer_downcast () e polymorphic_downcast () funzioni, che agiscono come static_cast ma sarà affermare (in genere solo nei build di debug) se il dynamic_cast equivalente fallisce.
http://www.boost.org/doc /libs/1_61_0/libs/conversion/cast.htm per i dettagli.