You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							197 lines
						
					
					
						
							5.0 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							197 lines
						
					
					
						
							5.0 KiB
						
					
					
				| /************************************************************************ | |
|  *									* | |
|  *			Copyright (c) 1985 by				* | |
|  *		Digital Equipment Corporation, Maynard, MA		* | |
|  *			All rights reserved.				* | |
|  *									* | |
|  *   The information in this software is subject to change  without	* | |
|  *   notice  and should not be construed as a commitment by Digital	* | |
|  *   Equipment Corporation.						* | |
|  *									* | |
|  *   Digital assumes no responsibility for the use  or  reliability	* | |
|  *   of its software on equipment which is not supplied by Digital.	* | |
|  *									* | |
|  *   Redistribution and use in source and binary forms are permitted	* | |
|  *   provided that the above copyright notice and this paragraph are	* | |
|  *   duplicated in all such forms and that any documentation,		* | |
|  *   advertising materials, and other materials related to such		* | |
|  *   distribution and use acknowledge that the software was developed	* | |
|  *   by Digital Equipment Corporation. The name of Digital Equipment	* | |
|  *   Corporation may not be used to endorse or promote products derived	* | |
|  *   from this software without specific prior written permission.	* | |
|  *   THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR	* | |
|  *   IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED	* | |
|  *   WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.* | |
|  *   Do not take internally. In case of accidental ingestion, contact	* | |
|  *   your physician immediately.					* | |
|  *									* | |
|  ************************************************************************/ | |
| 
 | |
| /* DO NOT INCLUDE "mnemosyne.h" !!! */ | |
| #include	<stdio.h> | |
| #include	<ctype.h> | |
| #include	<sys/types.h> | |
| #include	<sys/file.h> | |
|  | |
| static	char	rcsid[] = "/fats/tools/hsv/mnemosyne/mnemalyse.c,v 1.1.1.1 1995/06/06 18:18:28 fabio Exp"; | |
| 
 | |
| #include	"mnemconf.h" | |
|  | |
| extern	char	*index(); | |
| 
 | |
| /* | |
| post-processor to interpret memory allocation maps and search for | |
| pointers that were allocated but never freed. | |
|  | |
| 	Marcus J. Ranum, 1990. (mjr@decuac.dec.com) | |
| */ | |
| 
 | |
| 
 | |
| /* | |
| simple and braindead, read in the ".lines" file, and store it in a | |
| table by number. then read the pointer map, and crossref any unfreed | |
| pointers. simple as dereferencing NULL... | |
|  | |
| this could use some cleaning and buffing, but it's damn effective as | |
| it is. again, fancier symbol table routines would make this faster, | |
| but who gives a damn? it only has to be faster than finding memory | |
| leaks by hand... | |
| */ | |
| 
 | |
| struct	xsym	{ | |
| 	char	*dat; | |
| 	int	lnum; | |
| 	int	map; | |
| 	struct	xsym	*nxt; | |
| }; | |
| 
 | |
| 
 | |
| 
 | |
| main() | |
| { | |
| 	register struct xsym	*sp; | |
| 	register struct xsym	*zp; | |
| 	struct	ptr	p; | |
| 	struct	xsym	*shash[HASHSIZ]; | |
| 	char		inbuf[BUFSIZ]; | |
| 	FILE		*lp; | |
| 	int		fd; | |
| 
 | |
| 	/* statistics */ | |
| 	int		ptrcnt = 0; | |
| 	int		ptrbad = 0; | |
| 	int		ptrlos = 0; | |
| 
 | |
| 	/* to chop up lines */ | |
| 	char		*cpmap; | |
| 	char		*cpcalls; | |
| 	char		*cpave; | |
| 	char		*cplnum; | |
| 	char		*cpfnam; | |
| 
 | |
| 	for(fd = 0; fd < HASHSIZ; fd++) | |
| 		shash[fd] = (struct xsym *)0; | |
| 
 | |
| 	if((lp = fopen(LINESFILE,"r")) == (FILE *)0) { | |
| 		perror(LINESFILE); | |
| 		exit(1); | |
| 	} | |
| 
 | |
| 	if((fd = open(PTRFILE,O_RDONLY|O_RDWR)) < 0) { | |
| 		perror(PTRFILE); | |
| 		exit(1); | |
| 	} | |
| 
 | |
| 	/* this is ugly, but I refuse to trust !@(#&U!@#&! sscanf() */ | |
| 	while((cpmap = fgets(inbuf,sizeof(inbuf),lp)) != (char *)0) { | |
| 		if(inbuf[0] == '#') | |
| 			continue; | |
| 
 | |
| 		sp = (struct xsym *)malloc(sizeof(struct xsym)); | |
| 		if(sp == (struct xsym *)0) { | |
| 			perror("malloc"); | |
| 			exit(1); | |
| 		} | |
| 		sp->lnum = sp->map = 0; | |
| 
 | |
| 		if((cpcalls = index(cpmap,'\t')) != (char *)0) | |
| 			*cpcalls++ = '\0'; | |
| 
 | |
| 		if((cpave = index(cpcalls,'\t')) != (char *)0) | |
| 			*cpave++ = '\0'; | |
| 
 | |
| 		if((cplnum = index(cpave,'\t')) != (char *)0) | |
| 			*cplnum++ = '\0'; | |
| 
 | |
| 		if((cpfnam = index(cplnum,'\t')) != (char *)0) | |
| 			*cpfnam++ = '\0'; | |
| 
 | |
| 		/* setup symbol */ | |
| 		sp->map = atoi(cpmap); | |
| 
 | |
| 		if(cplnum == (char *)0) | |
| 			sp->lnum = -1; | |
| 		else | |
| 			sp->lnum = atoi(cplnum); | |
| 
 | |
| 		if(cpfnam != (char *)0) { | |
| 			char	*x; | |
| 			if((x = index(cpfnam,'\n')) != (char *)0) | |
| 				*x = '\0'; | |
| 
 | |
| 			sp->dat = malloc((unsigned)(strlen(cpfnam) + 1)); | |
| 			if(sp->dat == (char *)0) { | |
| 				perror("malloc"); | |
| 				exit(1); | |
| 			} | |
| 			(void)strcpy(sp->dat,cpfnam); | |
| 		} else | |
| 			sp->dat = "unknown"; | |
| 
 | |
| 		/* check to make sure it is not already in table */ | |
| 		zp = shash[sp->map % HASHSIZ]; | |
| 		while(zp != (struct xsym *)0) { | |
| 			if(zp->map == sp->map) { | |
| 				(void)fprintf(stderr, | |
| 				"mnemalyse: duplicate map entry ignored"); | |
| 				(void)fprintf(stderr, | |
| 				" (point at both %s and %s)\n",sp->dat,zp->dat); | |
| 				(void)free(sp); | |
| 
 | |
| 				/* can't free dat - may not be malloced! */ | |
| 				sp = (struct xsym *)0; | |
| 				break; | |
| 			} | |
| 			zp = zp->nxt; | |
| 		} | |
| 
 | |
| 		/* shrug, link it in */ | |
| 		if(sp != (struct xsym *)0) { | |
| 			sp->nxt = shash[sp->map % HASHSIZ]; | |
| 			shash[sp->map % HASHSIZ] = sp; | |
| 		} | |
| 	} | |
| 	(void)fclose(lp); | |
| 
 | |
| 	while(read(fd,(char *)&(p.dsk),sizeof(p.dsk)) == sizeof(p.dsk)) { | |
| 
 | |
| 		/* if the pointer was not deallocated, note it */ | |
| 		if(p.dsk.siz != 0) { | |
| 			zp = shash[p.dsk.smap % HASHSIZ]; | |
| 			while(zp != (struct xsym *)0) { | |
| 				if(zp->map == p.dsk.smap) { | |
| 					printf("%d bytes missing %s line:%d\n", | |
| 					p.dsk.siz,zp->dat,zp->lnum); | |
| 				} | |
| 				zp = zp->nxt; | |
| 			} | |
| 			ptrbad++; | |
| 			ptrlos += p.dsk.siz; | |
| 		} | |
| 		ptrcnt++; | |
| 	} | |
| 
 | |
| 	printf("%d pointers, %d lost totalling %d bytes\n", | |
| 		ptrcnt,ptrbad,ptrlos); | |
| 	exit(0); | |
| }
 |