[Halld-offline] strange casting problem

Matthew Shepherd mashephe at indiana.edu
Thu Feb 6 13:15:16 EST 2014


Dear C++ gurus,

I've been trying to track down a problem that Eric Pooser was having using AmpTools on several machines, all running a new version of Ubuntu with gcc 4.6.3  (don't know if that is relevant).

The problem is that the following (relatively standard) code:

TTree* m_inTree = static_cast<TTree*>( m_inFile->Get( inTreeName.c_str() ) );

Results in a segfault (ROOT-reported stack trace pasted below).

However if I change:

TTree* m_inTree = dynamic_cast<TTree*>( m_inFile->Get( inTreeName.c_str() ) );

The code runs fine.  I have never seen anything like this.  Does anyone have any idea why a static_cast would generate code that results in a segfault but a dynamic_cast would work?  Is it the the difference between runtime and compile-time casting? but how?  

In this case, dynamic_cast is actually more appropriate, so I have no problem switching to that method; however, the solution to the problem leaves me a little unsatisfied.  Any ideas?

Matt



There was a crash.
This is the entire stack trace of all threads:
===========================================================
#0  0x00007f8139a10c8e in __libc_waitpid (pid=<optimized out>, stat_loc=0x7fff918fa540, options=0) at ../sysdeps/unix/sysv/linux/waitpid.c:32
#1  0x00007f813999629e in do_system (line=0x24f0ec0 "/home/pooser/matt_work/root_v5.34.14/etc/gdb-backtrace.sh 32076 1>&2") at ../sysdeps/posix/system.c:149
#2  0x00007f813b5f3337 in TUnixSystem::StackTrace() () from /home/pooser/matt_work/root_v5.34.14/lib/libCore.so
#3  0x00007f813b5f5c23 in TUnixSystem::DispatchSignals(ESignals) () from /home/pooser/matt_work/root_v5.34.14/lib/libCore.so
#4  <signal handler called>
#5  0x00007f813b5aa983 in TObjArray::Init(int, int) () from /home/pooser/matt_work/root_v5.34.14/lib/libCore.so
#6  0x00007f813b5aad82 in TObjArray::TObjArray(int, int) () from /home/pooser/matt_work/root_v5.34.14/lib/libCore.so
#7  0x00007f813b85f4b5 in ROOT::new_TObjArray(void*) () from /home/pooser/matt_work/root_v5.34.14/lib/libCore.so
#8  0x00007f813b5c5ee4 in TClass::New(void*, TClass::ENewType) const () from /home/pooser/matt_work/root_v5.34.14/lib/libCore.so
#9  0x00007f813b000908 in TStreamerInfo::New(void*) () from /home/pooser/matt_work/root_v5.34.14/lib/libRIO.so
#10 0x00007f813b5c63a9 in TClass::New(TClass::ENewType) const () from /home/pooser/matt_work/root_v5.34.14/lib/libCore.so
#11 0x00007f813af5b495 in TKey::ReadObj() () from /home/pooser/matt_work/root_v5.34.14/lib/libRIO.so
#12 0x00007f813af271cc in TDirectoryFile::Get(char const*) () from /home/pooser/matt_work/root_v5.34.14/lib/libRIO.so
#13 0x0000000000403e83 in DalitzDataReader::DalitzDataReader(std::vector<std::string, std::allocator<std::string> > const&) ()
#14 0x0000000000402566 in main ()




---------------------------------------------------------------------
Matthew Shepherd, Associate Professor
Department of Physics, Indiana University, Swain West 265
727 East Third Street, Bloomington, IN 47405

Office Phone:  +1 812 856 5808




More information about the Halld-offline mailing list