[ITK-dev] Bug in the library, or just in the test..?

Bradley Lowekamp blowekamp at mail.nih.gov
Fri Oct 23 14:17:42 EDT 2015


We have seen this a couple times before [1]. Unfortunately the windows debug testing takes too long and times out in many cases so we don't have it on the dashboard for many versions.

I would add the if statement as Casey suggests.

Brad


[1] https://github.com/InsightSoftwareConsortium/ITK/commit/d21f4a64c3c04a83d38324316e7e2bffa7c14d14

On Oct 23, 2015, at 2:10 PM, David Cole via Insight-developers <insight-developers at itk.org> wrote:

> I am sure m_Data is nullptr. In the debugger, it says so. The value of
> "this" is a valid pointer, and the value of m_Data is 0x00000000.
> 
> The assert is coming from squarely inside a call to std::fill_n with the text:
> 
>    Debug Assertion Failed!
> 
>    Program: C:\WINDOWS\SYSTEM32\MSVCP120D.dll
>    File: C:\Program Files (x86)\Microsoft Visual Studio
>        12.0\VC\INCLUDE\xutility
>    Line: 2713
> 
>    Expression: invalid null pointer
> 
> That line is inside std::fill_n, so ... pretty sure m_Data is nullptr.
> 
> 
> D
> 
> 
> 
> 
> On Fri, Oct 23, 2015 at 1:59 PM, Casey Goodlett <gcasey at gmail.com> wrote:
>> Hi David,
>> 
>> I'm not sure that m_Data is nullptr.  I assume its an alias for std::vector
>> of size zero.
>> 
>> I've hit this bug a couple of times.  In visual studio debug mode
>> &std::vector[0] raises an error for vectors of size zero even if that
>> address is never used for anything.  The bug is not in fill_n because the
>> error is raised before fill_n is called.  Calling fill_n with a bogus
>> pointer and size zero is valid.
>> 
>> On linux the system is happy to generate a bogus pointer thats never used
>> for anything so no valgrind errors are ever generated.
>> 
>> I recommend checking an if(m_NumElements >0) in pre c++-11.  In c++11 I
>> recommend using the data() method which was added for precisely this reason.
>> 
>> Hope that helps.
>> 
>> 
>> Casey Goodlett
>> 
>> On Fri, Oct 23, 2015 at 1:47 PM, David Cole via Insight-developers
>> <insight-developers at itk.org> wrote:
>>> 
>>> It is definitely related to STL being checked in a Debug Visual Studio
>>> build... I get a bunch of ASSERT dialogs that pop up, so the test
>>> times out and hangs there with the dialog up until I kill it manually.
>>> 
>>> If I ignore through all the dialogs that pop up (click ignore on each
>>> of them, there are exactly 12 in total), then the test output is
>>> normal, and it reports that it has PASSED.
>>> 
>>> I can wait for a fix. I was just asking to see if it was a known
>>> thing, and find out if anybody was working on it, or if there was a
>>> general recommendation about what the right fix for it is before I
>>> attempt to fix it myself.
>>> 
>>> I'm curious, though, why is using "&this->m_Data[0]" acceptable if
>>> m_Data is nullptr ...? Why doesn't valgrind pick this up as a problem?
>>> 
>>> 
>>> D
>>> 
>>> 
>>> 
>>> 
>>> On Fri, Oct 23, 2015 at 1:33 PM, Luc Hermitte <luc.hermitte at c-s.fr> wrote:
>>>> Hi,
>>>> 
>>>> Le 23/10/2015 18:43, David Cole via Insight-developers a écrit :
>>>>> The itkTransformTest is the only test failing on my Visual Studio 2013
>>>>> Debug dashboard because of this code:
>>>> 
>>>> What is the exact error produced when your run the test in verbose mode?
>>>> 
>>>> 
>>>>> The problem is in the Fill implementation:
>>>>> 
>>>>>    template< typename TValue >
>>>>>    void VariableLengthVector< TValue >
>>>>>    ::Fill(TValue const & v) ITK_NOEXCEPT
>>>>>    {
>>>>>      std::fill_n(&this->m_Data[0], m_NumElements, v);
>>>>>    }
>>>>> 
>>>>> In this test call, m_Data is nullptr, and m_NumElements is 0, so
>>>>> clearly,&m_Data[0] is not a useful pointer, and with 0 elements, there
>>>>> is nothing to fill.
>>>>> 
>>>>> So.... should the implementation of Fill be changed to be conditional
>>>>> on the pointer being non-nullptr, or the number of elements being
>>>>> non-zero, or both? (Are other Fill implementations protected like so?)
>>>>> 
>>>>> Or should the test be changed to avoid calling Fill when there are no
>>>>> elements...?
>>>> 
>>>> I'd say that this is a bug in std::fill_n (or something related to the
>>>> STL being in CHECKED MODE) and that we should fall back into a plain
>>>> loop. We should avoid adding such defensive tests (if (!empty)
>>>> fill_n()).
>>>> 
>>>> I can take care of this issue (only on Monday). If you don't mind, I'd
>>>> rather avoid rebasing yet another time and first go through
>>>> http://review.source.kitware.com/#/c/20253/10 (I could also fix the
>>>> issue I've introduced in my first patch on VLV in this patch, but this
>>>> is not the usual patching policy if I understand correctly)
>>>> 
>>>> 
>>>> Regards,
>>>> --
>>>> Luc Hermitte
>>> _______________________________________________
>>> Powered by www.kitware.com
>>> 
>>> Visit other Kitware open-source projects at
>>> http://www.kitware.com/opensource/opensource.html
>>> 
>>> Kitware offers ITK Training Courses, for more information visit:
>>> http://kitware.com/products/protraining.php
>>> 
>>> 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://public.kitware.com/mailman/listinfo/insight-developers
>> 
>> 
> _______________________________________________
> Powered by www.kitware.com
> 
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
> 
> Kitware offers ITK Training Courses, for more information visit:
> http://kitware.com/products/protraining.php
> 
> 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://public.kitware.com/mailman/listinfo/insight-developers



More information about the Insight-developers mailing list