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.

È stato utile?

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.

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

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top