[petsc-dev] PetscMalloc for size zero

Jed Brown jed at jedbrown.org
Thu Jan 30 15:00:22 CST 2014


Barry Smith <bsmith at mcs.anl.gov> writes:
>> Why do we want this behavior?
>
>    Matt feels that having zero space allocated items always as NULL is
>    useful. Perhaps as a debugging/error determining issue since no one
>    can “accidentally” use the location returned by malloc(0) and in
>    the debugger one won’t mistakenly think that a pointer which
>    contains something returned by malloc(0) has a legitimate value in
>    it.

The pointer returned by malloc(0) [e.g., optimized mode] is actually
invalid.  PETSc checks in debug mode; valgrind tracks zero-size
allocations.

>> Can we see some concrete code that is affected by this behavior?  We
>> needed PetscMalloc[2-7] to work in optimized mode, so nothing in
>> PETSc should be depending on it.
>
>    What does “it” here refer to?  And what do you mean by “depending
>    on”.  Certainly we could make PetscMallocn() and PetscFreen()
>    behave in a way Matt suggests even in optimized code (if we choose
>    to).

I'm assuming that current code is correct, thus I'm asking where
significant simplifications would occur if the caller knew that
zero-sized arrays were NULL.

>    Some notes:
>
>    We currently mark freed pointers with a NULL so they cannot be
>    accidentally used at a later time.
>
>    In Jed’s model something a “zero length space” will have the value
>    NULL and something not. There is, AFAIK, no tool to check the
>    address and see if it is a real pointer or a pointer to an invalid
>    location.

There's no tool to determine whether it can hold more than one entry.
What arrays do we have that (a) do not store size and (b) do not use a
mandatory end marker like '\0' (in which case you had to allocate the
end marker)?

>    With Matt’s scheme we could also mark “zero length space” with a
>    NULL. In an ideal world I could see having a different specific
>    value for “zero length space” such as INVALIDPOINTER then one could
>    distinguish the two values and their different meanings.  Alias I
>    don’t control the ideal C world.

Why don't you have this information out-of-band anyway?

>    I agree with Jed that we don’t want any PETSc code to be dependent
>    on PetscMallocn(0) always being NULL in all cases; but I understand
>    Matt’s argument that having PetscMallocn() always being NULL makes
>    debugging easier.

I'm not convinced of this.  Memory checkers will notice accesses (and be
able to track back to where the zero-length array was "allocated").
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 835 bytes
Desc: not available
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20140130/7f0b8962/attachment.sig>


More information about the petsc-dev mailing list