[Insight-users] I'm seeing a dynamic_cast problem in ImageBase (gcc4-related?)

Zachary Pincus zpincus at stanford.edu
Mon Jul 25 05:10:24 EDT 2005


Hello,

I've been stymied by an odd problem with using some ITK filters in my  
code. This problem appeared in previously-working code when I  
switched to gcc4. Compiling with gcc3.3 leads to correct behavior.

Unfortunately, I haven't been able to isolate a simple test case yet.  
I'm (really) hoping, however, that someone will be able to recognize  
the general type of error this is and be able to point me in the  
right direction to find this. Anyone's expertise in this matter would  
be really appreciated, as I've pretty much exhausted my hypotheses.

The problem is that when I try to run an image through a particular  
ITK filter, this exception is raised:

/Developer/Local/ITK-CVS/Insight/Code/Common/itkImageBase.txx:239:
itk::ERROR: Image(0x685560): itk::ImageBase::CopyInformation() cannot  
cast PKN3itk10DataObjectE to PKN3itk9ImageBaseILj2EEE

The problem is that the code leading up to this error is all  
statically-typed, so there should be nothing unexpected happening at  
runtime with the dynamic casting. I pass in an appropriately-typed  
input image, and get this error on calling Update on the filter.  
Oddly enough, some filters don't do this -- and these all seem to be  
subclasses of InPlaceImageFilter.

Now, I haven't been able to isolate this because it seems to happen  
in the context of some python wrapper code I've written. Simpler test  
cases don't cause the error.

Anyhow, the offending code looks basically like this:

MedianFilterImage(const Py::Tuple& args, const Py::Dict &kws) {
   typedef itk::MedianImageFilter<FloatImageType,
     FloatImageType > MedianFilterType;

   try {
     // Unpack a float image from the python input
     // It's statically typed as the right image type...
     FloatImageType::ConstPointer input =
       FloatImageWrapper::GetImageFromWrapper(kws["input"]);
     // but let's test it at run-time too.
     std::cout <<"Run time type is: " <<  typeid(input.GetPointer 
()).name() << std::endl;
     MedianFilterType::Pointer medianFilter = MedianFilterType::New();
     medianFilter->SetInput(input);
     FloatImageType::SizeType radius;
     // unpack the parameters from the python input
     radius.Fill(Py::Int(kws["radius"]));
     medianFilter->SetRadius(radius);
     // exception is thrown here...
     medianFilter->Update();
     // pack the output back into a python wrapper.
     return FloatImageWrapper::NewWrapperFromImage(medianFilter- 
 >GetOutput());
   } catch( itk::ExceptionObject & err ) {
     throw Py::RuntimeError(err.what());
   }
}

At run-time, the standard output from the typeid line above is:
Run time type is: PKN3itk5ImageIfLj2EEE

The backtrace from the exception throw is (until the Update command  
above):
#1  0x06cc89cc in itk::ImageBase<2u>::CopyInformation (this=0x685520,  
data=0x60c120) at /Developer/Local/ITK-CVS/Insight/Code/Common/ 
itkImageBase.txx:237
#2  0x02023764 in itk::ProcessObject::GenerateOutputInformation  
(this=0x685480) at /Developer/Local/ITK-CVS/Insight/Code/Common/ 
itkProcessObject.cxx:1048
#3  0x0202297c in itk::ProcessObject::UpdateOutputInformation  
(this=0x685480) at /Developer/Local/ITK-CVS/Insight/Code/Common/ 
itkProcessObject.cxx:690
#4  0x06cb3844 in itk::ImageBase<2u>::UpdateOutputInformation  
(this=0x685520) at /Developer/Local/ITK-CVS/Insight/Code/Common/ 
itkImageBase.txx:173
#5  0x0200a9e8 in itk::DataObject::Update (this=0x685520) at / 
Developer/Local/ITK-CVS/Insight/Code/Common/itkDataObject.cxx:342


Thanks for any advice at all,

Zach Pincus

Program in Biomedical Informatics and Department of Biochemistry
Stanford University School of Medicine



More information about the Insight-users mailing list