[Insight-developers] Broken backwards compatibility -- results of 2 days debugging

Bill Lorensen bill.lorensen at gmail.com
Tue Aug 25 12:04:25 EDT 2009


At a minimum that fix should have included a warning if the dynamic
cast failed. Also, Lucas' code should be fixed to check for the NULL.


Bill

On Tue, Aug 25, 2009 at 10:42 AM, Daniel Blezek<Blezek.Daniel at mayo.edu> wrote:
> Hi  all,
>
>   I had integrated Luca Antiga’s vesselness code into our application a
> while ago.  Fairly recently, it has been breaking on one of our platforms,
> the only one building with the CVS head version of Insight.  I finally
> tracked the crash down to this sequence.
>
> Luca’s code creates output images of different types and caches them in the
> outputs:
>   typename HessianImageType::Pointer hessianImage = HessianImageType::New();
>   this->ProcessObject::SetNthOutput(2,hessianImage.GetPointer());
>
> Later, he grabs the output and allocates the buffers:
>     this->GetOutput(2)->SetBufferedRegion(this->GetOutput(2)->GetRequestedRegion());
>     this->GetOutput(2)->Allocate();
>
> This code crashes due to this change:
> revision 1.64
> date: 2009-03-10 09:38:35 -0500;  author: blowekamp;  state: Exp;  lines:
> +24 -10;  commitid: 0s3FC2A2iqP1NuFt;
> BUG: 8681 ImageSource lacks type safety for multiple outputs of different
> types. Changed static_cast to dynamic_cast in GetOutput(unsigned int), so
> that we don't return an invalid pointer. GraftNthOutput now uses type safe
> ProcessObject::GetOutput. AllocateOutputs previously would segfault under
> these conditions. Now it safely casts to ImageBase and calls Allocate
> methods.
>
> which made this code use dynamic_cast, rather than static_cast:
>
>   return dynamic_cast<TOutputImage*>
>     (this->ProcessObject::GetOutput(idx));
>
>
> So now, my GetOutput(2) returns null (cause it’s not a TOutputImage) and
> everything crashes.
>
> This was highly frustrating to me.  Yes I know this is a bug, and I know it
> should be fixed, but code which depended on this behavior (Luca’s first
> implementation) is now broken.  Does this constitute a break of backwards
> compatibility?
>
> I propose at least a warning if the static_cast and dynamic_cast return
> different pointers.  This would have saved me two days of deep debugging and
> wondering why the same code ran fine on an older release version of ITK.
>
> Best regards,
> -dan
>
>
>
> --
> Daniel Blezek, PhD
> Medical Imaging Informatics Innovation Center
>
> P 127 or (77) 8 8886
> T 507 538 8886
> E blezek.daniel at mayo.edu
>
> Mayo Clinic
> 200 First St. S.W.
> Harwick SL-44
> Rochester, MN 55905
> mayoclinic.org
>
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-developers
>
>


More information about the Insight-developers mailing list