[Insight-developers] Dashboard & NrrdIO warnings
Michel Audette
michel.audette at kitware.com
Mon Mar 1 09:58:13 EST 2010
Hi Luis,
sorry, I'd made a change to this recently, but in the process of
adopting the latest NrrdIO stuff, based on the wiki procedure, I
neglected to propagate the change. It was a fix to NrrdIO.h... I will
make the fix this morning.
Cheers,
Michel
On Mon, Mar 1, 2010 at 7:42 AM, Gordon L. Kindlmann <glk at uchicago.edu> wrote:
> Hello,
>
> Okay, I've looked at this again; it is about the NRRD_INDEX_GEN macro:
>
> /*
> ******** NRRD_INDEX_GEN
> **
> ** Given a coordinate array "coord", as well as the array sizes "size"
> ** and dimension "dim", calculates the linear index, and stores it in
> ** "I".
> */
> #define NRRD_INDEX_GEN(I, coord, size, dim) \
> do { \
> int d; \
> for (d=(dim)-1, (I)=(coord)[d--]; \
> d >= 0; \
> d--) { \
> (I) = (coord)[d] + (size)[d]*(I); \
> } \
> } while (0)
>
>
> There was a series of emails about this around Jan 28, which unfortunately I
> didn't have the time to follow then, but I've skimmed them now.
>
> Cryptic as it may be, there's no real bug in the macro. Its been run
> through valgrind on a range of possible inputs (by its use in Teem), and
> that code has been in daily use for about 10 years. I appreciate that this
> loop doesn't match ITK coding styles, but this code is from Teem, which has
> its own coding style. People are welcome to argue about that on the Teem
> mailing lists :)
>
> The only time that the coord array could be indexed by -1 is if dim is 0,
> which is an invalid dimension for a nrrd. dim can be 1 (nrrd represents 1-D
> arrays just fine), but then d=0, I=coord[0], d-=1, so d=-1, but then the
> second loop expression d >= 0 fails, and the loop exits before the body
> executes (and that's correct; the assignment to I is what matters). If dim
> is 2, the body executes once, and then the loop exits. The whole thing is
> in a "do {} while (0)" so that we can have a local variable d; simply "{}"
> would probably also work, but that's not the source of the warning.
>
> My priority is to resolve the ITK compiler warnings without altering code
> that is working and (I strongly believe) error free, and to do so in a way
> that minimizes future work (and chances for error) in future updates of
> NrrdIO. I think the process we've worked through for NrrdIO updates is
> good; it relies on copying and minimally transforming sources from Teem.
> I'm not yet convinced this macro is a problem that needs fixing in Teem.
>
> However, looking at the code and its context again, I can certainly see that
> a compiler could believe that the macro could be called with dim=0 (which
> would lead to indexing coord[-1]). My belief is that this can't happen,
> given checks that exist elsewhere, but there's no reason not to make those
> checks more explicit/redundant.
>
> How do you think the dim > 0 check would be added? Is it other people's
> experience that these kinds of warnings can be resolving by putting in
> asserts()? Or other checks that clearly lead to a different execution path?
>
> Thanks for your patience,
> Gordon
>
> On Feb 28, 2010, at 2:45 PM, Luis Ibanez wrote:
>
>> Michel, Gordon,
>>
>>
>> The following warnings seems to be related to real bugs:
>>
>> http://www.cdash.org/CDash/viewBuildError.php?type=1&buildid=551088
>>
>> /.../Insight/Utilities/NrrdIO/reorder.c:250: warning: array subscript
>> is below array bounds
>> /.../Insight/Utilities/NrrdIO/subset.c:241: warning: array subscript
>> is below array bounds
>>
>>
>> Could you please comment on them ?
>>
>>
>> Thanks
>>
>>
>> Luis
>>
>
>
--
Michel Audette, Ph.D.
R & D Engineer,
Kitware Inc.,
Chapel Hill, N.C.
More information about the Insight-developers
mailing list