[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