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

Bill Lorensen bill.lorensen at gmail.com
Sat Jun 6 12:17:54 EDT 2009


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