[Insight-developers] ImageIterators : Suggested Patch: Exception
Luis Ibanez
luis.ibanez at kitware.com
Sat May 9 15:19:33 EDT 2009
Gaetan,
Excellent,
Thanks for taking care of that problem.
Luis
-----------------------
Gaëtan Lehmann wrote:
>
> Luis,
>
> I think it is fixed now, for the morphology part.
>
> Gaëtan
>
>
> Le 8 mai 09 à 14:13, Luis Ibanez a écrit :
>
>> Gaetan,
>>
>> That's great.
>>
>> Thanks for looking at this problem.
>>
>> We will be following on the other filters
>> (the ones not related to morphology)
>>
>>
>> Luis
>>
>>
>> -----------------------------------------------
>> 2009/5/8 Gaëtan Lehmann <gaetan.lehmann at jouy.inra.fr>:
>>
>>>
>>> Hi Luis,
>>>
>>> I'll try to fix that this weekend, and to fix the various problems
>>> found in
>>> those classes as well.
>>>
>>> Regards,
>>>
>>> Gaëtan
>>>
>>>
>>> Le 6 mai 09 à 13:15, Luis Ibanez a écrit :
>>>
>>>>
>>>> Hi Gert,
>>>>
>>>> I like the option of having a Macro that
>>>>
>>>> * in Debug mode will use assert
>>>> * in Release mode will throw and exception.
>>>>
>>>>
>>>> --------
>>>>
>>>>
>>>> Coming back to specific problem at hand:
>>>>
>>>>
>>>> A Nightly build was run with this
>>>> patch for Iterators and 26 tests failed:
>>>>
>>>> http://www.cdash.org/CDash/viewTest.php?onlyfailed&buildid=327351
>>>>
>>>> About 12 of them are related to Mathematical Morphology classes
>>>> in Code/Review.
>>>>
>>>> Others are in unexpected places, like:
>>>>
>>>> * itkImageSeriesWriterTest
>>>> * itkCommonPrintTest
>>>>
>>>>
>>>>
>>>> It seems that this is a fundamental flaw that we want to
>>>> fix before releasing ITK 3.14 by the end of this month.
>>>>
>>>>
>>>>
>>>> Luis
>>>>
>>>>
>>>> -------------------
>>>> Gert Wollny wrote:
>>>>
>>>>>
>>>>> On Tue, 2009-05-05 at 19:53 +0200, Gaëtan Lehmann wrote:
>>>>>
>>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> It would be nice to have that check in the code.
>>>>>> I think it's better to not use assert() here because it can let the
>>>>>> user to catch problematic mistakes in it's code and the check is
>>>>>> not so
>>>>>> computing intensive, so I doubt we can see any difference.
>>>>>
>>>>>
>>>>> Well, since the error is a programing error, the reason to use assert
>>>>> over throwing an exceptions is that with an assertion, you can open a
>>>>> debugger and end up exactly at the offending code line [1] -
>>>>> either by
>>>>> starting the debugger directly, like Visual Studio does, or by
>>>>> examining
>>>>> the core dump on a Unix-like system, and you can see directly,
>>>>> where the
>>>>> bad input came from. When an exception is thrown, the stack is
>>>>> unwind,
>>>>> and you have a hard
>>>>> time to find the source of the offending data. The only approach
>>>>> here is
>>>>> to explicitly open a debugging session, and then configure the
>>>>> debugger
>>>>> to catch exceptions when they are thrown.
>>>>> One idea to check also in the release builds would be that in debug
>>>>> builds the code uses assert, and in release builds it throws an
>>>>> exception, so that a developer can get easily to the offending
>>>>> code/data, and a user sees a reasonable error message without a core
>>>>> dump or general protection fault. The other option would be to
>>>>> define an
>>>>> assert that is also compiled in when NDEBUG is defined.
>>>>> [1] H. Sutter & A. Alexandrescu, "C++ Coding Standards"
>>>>> Regards, Gert
>>>>>
>>>>>>
>>>>>> Regards,
>>>>>>
>>>>>> Gaëtan
>>>>>>
>>>>>>
>>>>>>
>>>>>> Le 5 mai 09 à 18:14, Luis Ibanez a écrit :
>>>>>>
>>>>>>
>>>>>>> Hi Brad,
>>>>>>>
>>>>>>>
>>>>>>> Thanks for the feedback.
>>>>>>>
>>>>>>>
>>>>>>> We don't have guidelines for asserts nor preconditions in ITK.
>>>>>>>
>>>>>>>
>>>>>>> Although,
>>>>>>> unless I'm missing something,
>>>>>>> that will simply mean that instead of writing:
>>>>>>>
>>>>>>>
>>>>>>> if( ! bufferedRegion.IsInside( m_Region ) )
>>>>>>> {
>>>>>>> itkGenericExceptionMacro("..");
>>>>>>> }
>>>>>>>
>>>>>>>
>>>>>>> we will write
>>>>>>>
>>>>>>>
>>>>>>> assert( bufferedRegion.IsInside( m_Region ) )
>>>>>>>
>>>>>>>
>>>>>>> and the implementation of assert witll throw the exception.
>>>>>>>
>>>>>>> Which is admitedly a more elegant way of writing the code.
>>>>>>>
>>>>>>>
>>>>>>> We could achieve a similar goal with itkTestingMacros such
>>>>>>> as the ones we have been using in
>>>>>>>
>>>>>>>
>>>>>>> http://svn.na-mic.org/NAMICSandBox/trunk/QuadEdgeMeshRigidRegistration/Testing/itkTestingMacros.h
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Would you recommend a better approach ?
>>>>>>>
>>>>>>>
>>>>>>> Thanks
>>>>>>>
>>>>>>>
>>>>>>> Luis
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> ------------------------
>>>>>>> Bradley Lowekamp wrote:
>>>>>>>
>>>>>>>> I ran into this issue with trying to improve the
>>>>>>>> ShrinkImageFilter. I
>>>>>>>> think this is a good check to make. In my case we only had
>>>>>>>> test failing on
>>>>>>>> one or two systems, even through the buffer was being accessed
>>>>>>>> outside the
>>>>>>>> buffered region.
>>>>>>>> However, this seems like an assertion of preconditions. In
>>>>>>>> this case
>>>>>>>> the precondition is that the region parameter must be with in
>>>>>>>> the buffered
>>>>>>>> region. There are a variety of ways to verify preconditions.
>>>>>>>> One way is to
>>>>>>>> use an assert type macro that is only implemented in Debug
>>>>>>>> versions. Do we
>>>>>>>> have any guidelines for asserts or verification of
>>>>>>>> preconditions in ITK?
>>>>>>>> Brad
>>>>>>>> On May 5, 2009, at 11:07 AM, Luis Ibanez wrote:
>>>>>>>>
>>>>>>>>> With Michel Audette we have been tracking the issues related to
>>>>>>>>> aligning physical point coordinates with index coordinates.
>>>>>>>>>
>>>>>>>>> In the process we noticed that the ITK image iterators do not
>>>>>>>>> verify at construction time whether the region given as argument
>>>>>>>>> to the iterator constructor, is inside of the image or not.
>>>>>>>>>
>>>>>>>>> The consequence is that a user can provide a region outside
>>>>>>>>> of the image, we compute the offset (that will turn out to be
>>>>>>>>> outside of the image buffer) and then we (incorrectly) provide
>>>>>>>>> access to the pixel location.
>>>>>>>>>
>>>>>>>>> This has now been reported as Bug #8960:
>>>>>>>>>
>>>>>>>>> http://public.kitware.com/Bug/view.php?id=8960
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> We are suggesting the following fix to this problem:
>>>>>>>>>
>>>>>>>>> Namely, to check the region argument of the iterator constructor
>>>>>>>>> against the BufferedRegion of the image, and throw an exception
>>>>>>>>> if the region is not fully inside of the image buffered region.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Index: itkImageConstIterator.h
>>>>>>>>> = = = =
>>>>>>>>> ===============================================================
>>>>>>>>> RCS file: /cvsroot/Insight/Insight/Code/Common/
>>>>>>>>> itkImageConstIterator.h,v
>>>>>>>>> retrieving revision 1.23
>>>>>>>>> diff -r1.23 itkImageConstIterator.h
>>>>>>>>> 175a176,183
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> const RegionType & bufferedRegion = m_Image-
>>>>>>>>>> >GetBufferedRegion();
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> if( ! bufferedRegion.IsInside( m_Region ) )
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> {
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> itkGenericExceptionMacro("Region " << m_Region
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> << " is outside of buffered region " << bufferedRegion );
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> }
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Index: itkImageConstIteratorWithIndex.txx
>>>>>>>>> = = = =
>>>>>>>>> ===============================================================
>>>>>>>>> RCS file: /cvsroot/Insight/Insight/Code/Common/
>>>>>>>>> itkImageConstIteratorWithIndex.txx,v
>>>>>>>>> retrieving revision 1.27
>>>>>>>>> diff -r1.27 itkImageConstIteratorWithIndex.txx
>>>>>>>>> 84a85,92
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> const RegionType & bufferedRegion = m_Image-
>>>>>>>>>> >GetBufferedRegion();
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> if( ! bufferedRegion.IsInside( m_Region ) )
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> {
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> itkGenericExceptionMacro("Region " << m_Region
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> << " is outside of buffered region " << bufferedRegion );
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> }
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Does anyone see a problem with this patch ?
>>>>>>>>>
>>>>>>>>> Any objections ?
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Thanks
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Luis
>>>>>>>>> _______________________________________________
>>>>>>>>> Powered by www.kitware.com <http://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
>>>>>>>>
>>>>>>>>
>>>>>>>> ========================================================
>>>>>>>> Bradley Lowekamp Lockheed Martin Contractor for
>>>>>>>> Office of High Performance Computing and Communications
>>>>>>>> National Library of Medicine blowekamp at mail.nih.gov
>>>>>>>> <mailto:blowekamp at mail.nih.gov
>>>>>>>
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> 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
>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> 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
>>>
>>>
>>> --
>>> Gaëtan Lehmann
>>> Biologie du Développement et de la Reproduction
>>> INRA de Jouy-en-Josas (France)
>>> tel: +33 1 34 65 29 66 fax: 01 34 65 29 09
>>> http://voxel.jouy.inra.fr http://www.mandriva.org
>>> http://www.itk.org http://www.clavier-dvorak.org
>>>
>>>
>
More information about the Insight-developers
mailing list