[net.lang.c] malloc and segmentation errors

rbp@investor.UUCP (Bob Peirce) (07/24/85)

*** REPLACE THIS LINE WITH YOUR CORE DUMP ***

I need help on segmentation errors I get when trying to run a
program called funiq which was submitted to the net a month
ago as:

Message-ID: <197@ur-cvsvax.UUCP>
>From bill@ur-cvsvax.UUCP (Bill Vaughn) Thu Jun 27 14:00:54 1985

I am running Altos' port of Sys III to the M68000.  This seems
fairly clean except the C compiler treats integers as 16 bits
so we have to be very careful about software that assumes pointers
are integers.  Therefore, the first thing I did was to run lint.
This checked out perfectly except for the usual comments about
possible pointer problems with malloc and anything=NULL.

The code which seems to cause the problem is the following:

--------------------------------------------------------------------------------
/*
 * Returns pointer to 'n' bytes for character string storage.
 */
char *allocstr(n)
{
	register char *x;

	x = malloc((unsigned)n);
	if (x == NULL) {
		fprintf(stderr,"funiq: not enough memory for strings\n");
		exit(1);
	}
	return(x);
}

/*
 * Returns a pointer to the next available string space.
 * Gets more space if necessary.
 */
char *nextstr(s)
register char *s;
{
	register char *x;
	register int i;

#ifdef STATS
	charsused += (i = strlen(s) + 1);
#else
	i = strlen(s) + 1;
#endif

	if ((x = s + i) >= cend) {
		x = allocstr(ADDSTR);
		cend = x + ADDSTR;
	}
	return(x);
}
--------------------------------------------------------------------------------

The program runs for a while, and will find a number of unique words
before crashing.  (Interestingly, sort -u also crashes on our system at
about the 750th word).  By changing the definitions for  initial tree
nodes and string space along with additional tree nodes and string
space, I discovered the problem seems to occur when additional string
space is requested.

The test file I used was 6463 words, one word/line, obtained from
running deroff -w on the netnews manual pages.  The statistics I
obtained were as follows:

				char	nodes	total	com-	max
NODES	STR	ADDNOD	ADDST	used	used	words	pares	depth
-----	---	------	-----	----	-----	-----	-----	-----
1024	4096	128	512	4091	 576	1940	19927	  24
 256	1024	128	512	1014	 153	 333	 2822	  17
 128	1024	 64	512	1014	 153	 333	 2822	  17
 Same with long instead of int	2044	 297	 766	 7272	  21
  
Clearly all the initial node and string space gets allocated, and
additional nodes get allocated, but additional string space doesn't
get allocated.  For the last test I changed most integers to longs,
since my integers are 16 bit.  This got me one additional string
allocation, but it died on the next call to allocstr.

As a further test, I set STR to 32768.  It crashed on the initial call
to allocstr.  I tried STR = 16384 and it ran to completion!  Obviously,
I will leave STR at 16384 for now, but can anyone tell me what is
going on here?
-- 

		 	Bob Peirce, Pittsburgh, PA
		uucp: ...!{allegra, bellcore, cadre, idis}
		  	 !pitt!darth!investor!rbp
				412-471-5320

		NOTE:  Mail must be < 30,000 bytes/message