[ODE] problems with trimesh and capsules

Jaroslav Sinecky sinecky at telefonica.net
Mon May 22 07:30:59 MST 2006


But the thing is that gLocalContacts *get allocated each time* 
dCollideCCTL() is called with no test for NULL value. So assigning NULL 
at exit should make no difference.

Paul MacKenzie wrote:
> Hi Jaroslav,
>
>> Well, this is still rather strange to me. How assigning NULL to 
>> gLocalContacts before exiting would influence something if we don't 
>> test for NULL before reallocating it again (and at any other place in 
>> the code).
>> It's not a problem to put it in, if it solves the problem for you, 
>> but I would prefer to understand what's going on. What's your 
>> platform/compiler, Paul?
>
> I am using Visual Studio .NET 2003 on Windows XP.
>
> There are essentially two problems:
>
> The first is that dALLOCA16() allocates memory on the stack within the 
> context of the function in which it is called, in this case, 
> dCollideCCTL().  So, when dCollideCCTL() exits, the memory pointed to 
> by gLocalContacts is no longer valid, and has been returned to the 
> stack. Later on, that stack memory is reused elsewhere while 
> gLocalContacts is still pointing to it.  By setting gLocalContacts to 
> NULL before the exit from dCollideCCTL(), it no longer points to 
> memory that will be invalid, and in the next call to dCollideCCTL() it 
> will be reallocated.
>
> The second problem is the "allocate once" idea.  The flags parameter 
> in the dCollideCCTL() function containts the maximum number of 
> contacts. If the first time I call it I pass flags = 4, and later on 
> flags = 16, then if I only allocated gLocalContacts once with a size 
> of 4, and try to use it with a size of 16, there will be a buffer 
> overrun.
>
> Setting gLocalContacts to NULL at the end of dCollideCCTL() removes 
> both of these problems.
>
> Ideally, gLocalContacts should not be a global variable, and should be 
> passed as a parameter to each function that requires it.  However, 
> that would involve a bit of refactoring, and the "setting to NULL" 
> solution does the job for now.
>
> Cheers,
> Paul
>


More information about the ODE mailing list