c++ crash casting dynamic-cast

c++ - ¿Qué podría causar un dynamic_cast se bloquee?



crash casting (6)

Tengo un código que se ve así:

TAxis *axis = 0; if (dynamic_cast<MonitorObjectH1C*>(obj)) axis = (dynamic_cast<MonitorObjectH1C*>(obj))->GetXaxis();

A veces se bloquea:

Thread 1 (Thread -1208658240 (LWP 11400)): #0 0x0019e7a2 in _dl_sysinfo_int80 () from /lib/ld-linux.so.2 #1 0x048c67fb in __waitpid_nocancel () from /lib/tls/libc.so.6 #2 0x04870649 in do_system () from /lib/tls/libc.so.6 #3 0x048709c1 in system () from /lib/tls/libc.so.6 #4 0x001848bd in system () from /lib/tls/libpthread.so.0 #5 0x0117a5bb in TUnixSystem::Exec () from /opt/root/lib/libCore.so.5.21 #6 0x01180045 in TUnixSystem::StackTrace () from /opt/root/lib/libCore.so.5.21 #7 0x0117cc8a in TUnixSystem::DispatchSignals () from /opt/root/lib/libCore.so.5.21 #8 0x0117cd18 in SigHandler () from /opt/root/lib/libCore.so.5.21 #9 0x0117bf5d in sighandler () from /opt/root/lib/libCore.so.5.21 #10 <signal handler called> #11 0x0533ddf4 in __dynamic_cast () from /usr/lib/libstdc++.so.6

No tengo idea de por qué se bloquea. obj no es nulo (y si lo fuera, no sería un problema, ¿verdad?).

¿Cuál podría ser la razón por la cual un lanzamiento dinámico se bloquea?

Si no puede transmitir, solo debe devolver NULL no?


Algunos posibles motivos del bloqueo:

  • obj apunta a un objeto con un tipo no polimórfico (una clase o estructura sin métodos virtuales, o un tipo fundamental).
  • obj apunta a un objeto que ha sido liberado.
  • obj apunta a la memoria no asignada, o memoria que se ha mapeado de forma tal que genera una excepción cuando se accede (como una página de guardia o una página inaccesible).
  • obj apunta a un objeto con un tipo polimórfico, pero ese tipo se definió en una biblioteca externa que se compiló con RTTI deshabilitado.

No todos estos problemas necesariamente causan un bloqueo en todas las situaciones.


¿Estás seguro de que el valor de ''obj'' se ha definido correctamente?

Si, por ejemplo, no está inicializado (es decir, al azar), podría verlo causando un bloqueo.


¿Se puede cambiar el valor de obj por un hilo diferente?


Como solo falla algunas veces, apuesto a que es un problema de enhebrado. Verifique todas las referencias a ''obj'':

grep -R ''obj.*='' .


dynamic_cast devolverá 0 si el lanzamiento falla y estás lanzando a un puntero, que es tu caso. El problema es que ya corrompió el montón antes en su código, o rtti no se activó.


Sugiero usar una sintaxis diferente para este fragmento de código.

if (MonitorObjectH1C* monitorObject = dynamic_cast<MonitorObjectH1C*>(obj)) { axis = monitorObject->GetXaxis(); }

Todavía puede bloquearse si otro subproceso elimina lo que monitorObject señala o si obj es una basura loca, pero al menos su problema ya no está relacionado con el casting y no está haciendo el dynamic_cast dos veces.