[Insight-users] Walking off the end of an array.

Bill Lorensen bill.lorensen at gmail.com
Sat Jun 6 13:07:31 EDT 2009


I just modified my localcopy of itkArrayTest with  myOwnBoss(100) =
0.0; where size is 5 and I received the following:

itkCommonTests:
/home/lorensen/Projects/InsightPersonal/Utilities/vxl/core/vnl/vnl_vector.h:168:
T& vnl_vector<T>::operator()(unsigned int) [with T = float]: Assertion
`i<size()' failed.

but if I add  myOwnBoss.put(100, 0.0); I don't get a failure.  That's because
ERROR_CHECKING is not defined. I'm not sure why the vxl folks are
using two different #if's.

Bill

On Sat, Jun 6, 2009 at 12:34 PM, Bill Lorensen<bill.lorensen at gmail.com> wrote:
> Ooops, I see that VNL_CONFIG_CHECK_BOUNDS is ON by default.
>
> Bill
>
> On Sat, Jun 6, 2009 at 12:17 PM, Bill Lorensen<bill.lorensen at gmail.com> wrote:
>> I looked at the vnl_vector.h code and assert checking is only on for
>> operator() #if VNL_CONFIG_CHECK_BOUNDS. Alsoin put(), checking is only
>> on if #ifdef ERROR_CHECKING
>>
>> Maybe we should consider setting these if building Debug.
>>
>> Bill
>>
>> On Sat, Jun 6, 2009 at 10:23 AM, Mike
>> Jackson<mike.jackson at bluequartz.net> wrote:
>>> Yep. I followed the hierarchy all way back to the vnl_vector class and
>>> so change my code a bit:
>>>
>>> when I print the value of the "size" of the array I get 2. So I tried
>>> the following code and it seemed to let me set the value without
>>> asserting during execution.
>>>
>>>
>>> metricParams(200) = 0.0;
>>> metricParams.put(200, 0.0);
>>>
>>> I made sure I was building with a debug build but I still do not get
>>> an assert or error or anything that I would assume I would get when
>>> running the code. Dunno.
>>>
>>> Mike
>>>
>>> On Sat, Jun 6, 2009 at 9:54 AM, Luis Ibanez<luis.ibanez at kitware.com> wrote:
>>>>
>>>> Hi Mike,
>>>>
>>>> The type used by the Metric for the array of transform parameters
>>>> is ultimately an itk::Array<double>.
>>>>
>>>> You will find it in:
>>>>
>>>> Insight/Code/Common/itkTransformBase.h  line  49
>>>>
>>>>   /** Type of the input parameters. */
>>>>   typedef  Array< double >           ParametersType;
>>>>
>>>>
>>>> The code of the itkArray itself does not have assertions,
>>>> nor error checking when accessing the elements with
>>>> the operator[].
>>>>
>>>> The itkArray derives from the vnl_vector, which indeed
>>>> has some of these assertions, but they are in the
>>>>
>>>>    operator()   method,
>>>>
>>>> not in the
>>>>
>>>>     operator[]  method.
>>>>
>>>> Therefore, you will have error checking if you use
>>>>
>>>>     metricParams(3) = 56;
>>>>
>>>> but not if you use
>>>>
>>>>     metricParams[3] = 56;
>>>>
>>>>
>>>> --
>>>>
>>>>
>>>>    Regards,
>>>>
>>>>
>>>>         Luis
>>>>
>>>>
>>>> -------------------------------------------------------------------------------------------------------------
>>>> On Sat, Jun 6, 2009 at 9:33 AM, Mike Jackson <mike.jackson at bluequartz.net>
>>>> wrote:
>>>>>
>>>>> While running some code I kept getting some asserts from the HDF5
>>>>> library that I am using when my program exited. Turns out that I had
>>>>> something like this in my own code:
>>>>>
>>>>>
>>>>>
>>>>> namespace R3D
>>>>> {
>>>>>  namespace Detail
>>>>>  {
>>>>>    const unsigned int Dimension = 2;
>>>>>  }
>>>>> }
>>>>>
>>>>> typedef   unsigned char  PixelType;
>>>>> typedef itk::Image<PixelType, R3D::Detail::Dimension>
>>>>>  ImageType;
>>>>> typedef itk::MeanSquaresImageToImageMetric<  ImageType, ImageType >
>>>>>  MetricType;
>>>>> MetricType::TransformParametersType metricParams(R3D::Detail::Dimension);
>>>>>
>>>>>
>>>>> metricParams[0] = scale;
>>>>> metricParams[1] = 0.0;
>>>>> metricParams[2] = 0.0;
>>>>> metricParams[3] = 0.0;
>>>>>
>>>>> Turns out there are only 2 parameters for the metricParams array and
>>>>> so I guess I was walking off the end of then array and assigning data
>>>>> to memory locations in the HDF5 library area.
>>>>>
>>>>> Turns out I was using the non-boundary checking version of those
>>>>> calls. I should have been doing something like:
>>>>> metricParams(2) = 0.0;
>>>>> metricParams.put(2, 0.0);
>>>>>
>>>>> So I tried those fully expecting an assert to happen by my code
>>>>> completes successfully now. I compiled ITK in debug mode along with my
>>>>> code. Is there something else that needs to be done in order to enable
>>>>> these asserts or boundary checking? I am still new to ITK and so I
>>>>> would like to have the safety net.
>>>>>
>>>>> Thanks
>>>>> Mike Jackson
>>> _____________________________________
>>> 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-users
>>>
>>
>


More information about the Insight-users mailing list