-lmalloc

Dan Webb dan at ingr.com
Sat Feb 4 01:53:55 AEST 1989


in article <295 at jupiter.iotek.UUCP>, mike at iotek.UUCP (Mike Thompson) says:
> 
> In article <3724 at ingr.com> dan at ingr.com (Dan Webb) says:
>>I probably don't have to convince too many people of this, but a request
>>for zero bytes is by no means an invalid request.  I think -lmalloc should
>>be fixed.

> 	Well I'm one of those few who need convincing, I think that
>     treating a request for 0 memory from a memory managment system as
>     an error is if not correct is at least not incorrect, to give you

Ok, I guess there are a few people that need to be convinced.

Philisophically speaking:
When you're talking about an amount of things, zero is not a special case.
I can have two apples, or I can have zero apples.  If I have zero apples, I'd
better not try to eat one because I might core dump :-).

Asking for zero bytes is just as valid.  I have written lots of code that
deals with dynamically changing data, such as fonts (yes, these fonts are
quite dynamic) and Mac-like scrolling lists.  It is quite valid for a font
to initially have no characters or a list to have no entries.  I must
therefore deal with the case of allocating a zero-length amount.  Later, I
need to realloc or free the data.  If malloc(0) returns NULL, I'm forced to
special-case it everywhere I allocate/reallocate/free it.

My code looks like this in many places:
	ptr = (Thing *) malloc (count * sizeof (Thing));
	...
	ptr = (Thing *) realloc (ptr, count * sizeof (Thing));
	...
	free (ptr);
The value of count may very well be zero.

The bottom line is that if I want to special-case zero for speed,
I will.  But I don't want malloc to force me to do it.

>      ...to give you
>     a valid pointer would in effect be allocating at least a byte,
>     after all that address cannot be allocated to any other request
>     can it?

This depends on the implementation.  The normal SysV malloc uses a linked
list of blocks, so it isn't a problem.  The only thing that would exist for
the zero-length block is the block header.

>     On the other hand a program that does not check for
>     errors on system calls, and does no checking for null pointers is
>     definitely what I would call not written in the best of styles if
>     not down right buggy!  (especially with the problems of null
>     de-referencing effecting portability over the past few years)

I totally agree.  But if I checked for an error an error from -lmalloc, it
would tell me that allocating zero entries in my list is invalid -- when
it's really not!

To solve the problem with -lmalloc, I wrote wrappers around malloc and
realloc.  They turn any zero request into a request for one byte.

	- Dan Webb



More information about the Comp.sys.sgi mailing list