Module Name:    src
Committed By:   rillig
Date:           Sat Jul 15 13:35:24 UTC 2023

Modified Files:
        src/usr.bin/xlint/lint1: cgram.y decl.c externs1.h func.c init.c lex.c
            lint1.h mem1.c tree.c

Log Message:
lint: add detailed logging for finding memory allocation bugs


To generate a diff of this commit:
cvs rdiff -u -r1.462 -r1.463 src/usr.bin/xlint/lint1/cgram.y
cvs rdiff -u -r1.357 -r1.358 src/usr.bin/xlint/lint1/decl.c
cvs rdiff -u -r1.195 -r1.196 src/usr.bin/xlint/lint1/externs1.h
cvs rdiff -u -r1.170 -r1.171 src/usr.bin/xlint/lint1/func.c
cvs rdiff -u -r1.246 -r1.247 src/usr.bin/xlint/lint1/init.c
cvs rdiff -u -r1.187 -r1.188 src/usr.bin/xlint/lint1/lex.c
cvs rdiff -u -r1.193 -r1.194 src/usr.bin/xlint/lint1/lint1.h
cvs rdiff -u -r1.69 -r1.70 src/usr.bin/xlint/lint1/mem1.c
cvs rdiff -u -r1.567 -r1.568 src/usr.bin/xlint/lint1/tree.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.bin/xlint/lint1/cgram.y
diff -u src/usr.bin/xlint/lint1/cgram.y:1.462 src/usr.bin/xlint/lint1/cgram.y:1.463
--- src/usr.bin/xlint/lint1/cgram.y:1.462	Sat Jul 15 09:40:36 2023
+++ src/usr.bin/xlint/lint1/cgram.y	Sat Jul 15 13:35:24 2023
@@ -1,5 +1,5 @@
 %{
-/* $NetBSD: cgram.y,v 1.462 2023/07/15 09:40:36 rillig Exp $ */
+/* $NetBSD: cgram.y,v 1.463 2023/07/15 13:35:24 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -35,7 +35,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: cgram.y,v 1.462 2023/07/15 09:40:36 rillig Exp $");
+__RCSID("$NetBSD: cgram.y,v 1.463 2023/07/15 13:35:24 rillig Exp $");
 #endif
 
 #include <limits.h>
@@ -520,12 +520,12 @@ generic_assoc_list:
 /* K&R ---, C90 ---, C99 ---, C11 6.5.1.1 */
 generic_association:
 	type_name T_COLON assignment_expression {
-		$$ = block_zero_alloc(sizeof(*$$));
+		$$ = block_zero_alloc(sizeof(*$$), "generic");
 		$$->ga_arg = $1;
 		$$->ga_result = $3;
 	}
 |	T_DEFAULT T_COLON assignment_expression {
-		$$ = block_zero_alloc(sizeof(*$$));
+		$$ = block_zero_alloc(sizeof(*$$), "generic");
 		$$->ga_arg = NULL;
 		$$->ga_result = $3;
 	}

Index: src/usr.bin/xlint/lint1/decl.c
diff -u src/usr.bin/xlint/lint1/decl.c:1.357 src/usr.bin/xlint/lint1/decl.c:1.358
--- src/usr.bin/xlint/lint1/decl.c:1.357	Sat Jul 15 09:40:36 2023
+++ src/usr.bin/xlint/lint1/decl.c	Sat Jul 15 13:35:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: decl.c,v 1.357 2023/07/15 09:40:36 rillig Exp $ */
+/* $NetBSD: decl.c,v 1.358 2023/07/15 13:35:24 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: decl.c,v 1.357 2023/07/15 09:40:36 rillig Exp $");
+__RCSID("$NetBSD: decl.c,v 1.358 2023/07/15 13:35:24 rillig Exp $");
 #endif
 
 #include <sys/param.h>
@@ -138,7 +138,7 @@ type_t *
 block_dup_type(const type_t *tp)
 {
 
-	type_t *ntp = block_zero_alloc(sizeof(*ntp));
+	type_t *ntp = block_zero_alloc(sizeof(*ntp), "type");
 	*ntp = *tp;
 	return ntp;
 }
@@ -148,7 +148,7 @@ type_t *
 expr_dup_type(const type_t *tp)
 {
 
-	type_t *ntp = expr_zero_alloc(sizeof(*ntp));
+	type_t *ntp = expr_zero_alloc(sizeof(*ntp), "type");
 	*ntp = *tp;
 	return ntp;
 }
@@ -163,7 +163,7 @@ type_t *
 expr_unqualified_type(const type_t *tp)
 {
 
-	type_t *ntp = expr_zero_alloc(sizeof(*ntp));
+	type_t *ntp = expr_zero_alloc(sizeof(*ntp), "type");
 	*ntp = *tp;
 	ntp->t_const = false;
 	ntp->t_volatile = false;
@@ -1042,7 +1042,7 @@ sym_t *
 declare_unnamed_member(void)
 {
 
-	sym_t *mem = block_zero_alloc(sizeof(*mem));
+	sym_t *mem = block_zero_alloc(sizeof(*mem), "sym");
 	mem->s_name = unnamed;
 	mem->s_kind = FMEMBER;
 	mem->s_scl = STRUCT_MEMBER;
@@ -1123,7 +1123,7 @@ set_bit_field_width(sym_t *dsym, int bit
 {
 
 	if (dsym == NULL) {
-		dsym = block_zero_alloc(sizeof(*dsym));
+		dsym = block_zero_alloc(sizeof(*dsym), "sym");
 		dsym->s_name = unnamed;
 		dsym->s_kind = FMEMBER;
 		dsym->s_scl = STRUCT_MEMBER;
@@ -1568,19 +1568,20 @@ make_tag_type(sym_t *tag, tspec_t kind, 
 		}
 		if (tag->s_scl == NOSCL) {
 			tag->s_scl = scl;
-			tag->s_type = tp = block_zero_alloc(sizeof(*tp));
+			tag->s_type = tp =
+			    block_zero_alloc(sizeof(*tp), "type");
 			tp->t_packed = dcs->d_packed;
 		} else
 			tp = tag->s_type;
 
 	} else {
-		tag = block_zero_alloc(sizeof(*tag));
+		tag = block_zero_alloc(sizeof(*tag), "sym");
 		tag->s_name = unnamed;
 		tag->s_def_pos = unique_curr_pos();
 		tag->s_kind = FTAG;
 		tag->s_scl = scl;
 		tag->s_block_level = -1;
-		tag->s_type = tp = block_zero_alloc(sizeof(*tp));
+		tag->s_type = tp = block_zero_alloc(sizeof(*tp), "type");
 		tp->t_packed = dcs->d_packed;
 		dcs->d_enclosing->d_nonempty_decl = true;
 	}
@@ -1588,13 +1589,15 @@ make_tag_type(sym_t *tag, tspec_t kind, 
 	if (tp->t_tspec == NO_TSPEC) {
 		tp->t_tspec = kind;
 		if (kind != ENUM) {
-			tp->t_sou = block_zero_alloc(sizeof(*tp->t_sou));
+			tp->t_sou = block_zero_alloc(sizeof(*tp->t_sou),
+			    "struct_or_union");
 			tp->t_sou->sou_align_in_bits = CHAR_SIZE;
 			tp->t_sou->sou_tag = tag;
 			tp->t_sou->sou_incomplete = true;
 		} else {
 			tp->t_is_enum = true;
-			tp->t_enum = block_zero_alloc(sizeof(*tp->t_enum));
+			tp->t_enum = block_zero_alloc(sizeof(*tp->t_enum),
+			    "enumeration");
 			tp->t_enum->en_tag = tag;
 			tp->t_enum->en_incomplete = true;
 		}
@@ -1823,7 +1826,7 @@ declare_extern(sym_t *dsym, bool has_ini
 	if (renaming != NULL) {
 		lint_assert(dsym->s_rename == NULL);
 
-		char *s = level_zero_alloc(1, renaming->sb_len + 1);
+		char *s = level_zero_alloc(1, renaming->sb_len + 1, "string");
 		(void)memcpy(s, renaming->sb_name, renaming->sb_len + 1);
 		dsym->s_rename = s;
 	}
@@ -2754,7 +2757,7 @@ abstract_name(void)
 	lint_assert(dcs->d_kind == DLK_ABSTRACT
 	    || dcs->d_kind == DLK_PROTO_PARAMS);
 
-	sym_t *sym = block_zero_alloc(sizeof(*sym));
+	sym_t *sym = block_zero_alloc(sizeof(*sym), "sym");
 	sym->s_name = unnamed;
 	sym->s_def = DEF;
 	sym->s_scl = ABSTRACT;

Index: src/usr.bin/xlint/lint1/externs1.h
diff -u src/usr.bin/xlint/lint1/externs1.h:1.195 src/usr.bin/xlint/lint1/externs1.h:1.196
--- src/usr.bin/xlint/lint1/externs1.h:1.195	Thu Jul 13 23:11:11 2023
+++ src/usr.bin/xlint/lint1/externs1.h	Sat Jul 15 13:35:24 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: externs1.h,v 1.195 2023/07/13 23:11:11 rillig Exp $	*/
+/*	$NetBSD: externs1.h,v 1.196 2023/07/15 13:35:24 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -104,11 +104,23 @@ int	get_filename_id(const char *);
 void	add_directory_replacement(char *);
 const char *transform_filename(const char *, size_t);
 
+#ifdef DEBUG_MEM
+void	*block_zero_alloc(size_t, const char *);
+void	*level_zero_alloc(size_t, size_t, const char *);
+#else
 void	*block_zero_alloc(size_t);
 void	*level_zero_alloc(size_t, size_t);
+#define block_zero_alloc(size, descr) (block_zero_alloc)(size)
+#define level_zero_alloc(level, size, descr) (level_zero_alloc)(level, size)
+#endif
 void	level_free_all(size_t);
 
+#ifdef DEBUG_MEM
+void	*expr_zero_alloc(size_t, const char *);
+#else
 void	*expr_zero_alloc(size_t);
+#define expr_zero_alloc(size, descr) (expr_zero_alloc)(size)
+#endif
 tnode_t	*expr_alloc_tnode(void);
 void	expr_free_all(void);
 memory_pool expr_save_memory(void);

Index: src/usr.bin/xlint/lint1/func.c
diff -u src/usr.bin/xlint/lint1/func.c:1.170 src/usr.bin/xlint/lint1/func.c:1.171
--- src/usr.bin/xlint/lint1/func.c:1.170	Thu Jul 13 08:40:38 2023
+++ src/usr.bin/xlint/lint1/func.c	Sat Jul 15 13:35:24 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: func.c,v 1.170 2023/07/13 08:40:38 rillig Exp $	*/
+/*	$NetBSD: func.c,v 1.171 2023/07/15 13:35:24 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: func.c,v 1.170 2023/07/13 08:40:38 rillig Exp $");
+__RCSID("$NetBSD: func.c,v 1.171 2023/07/15 13:35:24 rillig Exp $");
 #endif
 
 #include <stdlib.h>
@@ -1010,7 +1010,7 @@ check_return_value(bool sys, tnode_t *tn
 	}
 
 	/* Create a temporary node for the left side */
-	tnode_t *ln = expr_zero_alloc(sizeof(*ln));
+	tnode_t *ln = expr_zero_alloc(sizeof(*ln), "tnode");
 	ln->tn_op = NAME;
 	ln->tn_type = expr_unqualified_type(funcsym->s_type->t_subt);
 	ln->tn_lvalue = true;

Index: src/usr.bin/xlint/lint1/init.c
diff -u src/usr.bin/xlint/lint1/init.c:1.246 src/usr.bin/xlint/lint1/init.c:1.247
--- src/usr.bin/xlint/lint1/init.c:1.246	Thu Jul 13 08:40:38 2023
+++ src/usr.bin/xlint/lint1/init.c	Sat Jul 15 13:35:24 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: init.c,v 1.246 2023/07/13 08:40:38 rillig Exp $	*/
+/*	$NetBSD: init.c,v 1.247 2023/07/15 13:35:24 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: init.c,v 1.246 2023/07/13 08:40:38 rillig Exp $");
+__RCSID("$NetBSD: init.c,v 1.247 2023/07/15 13:35:24 rillig Exp $");
 #endif
 
 #include <stdlib.h>
@@ -304,7 +304,7 @@ check_init_expr(const type_t *ltp, sym_t
 	type_t *lutp = expr_unqualified_type(ltp);
 
 	/* Create a temporary node for the left side. */
-	tnode_t *ln = expr_zero_alloc(sizeof(*ln));
+	tnode_t *ln = expr_zero_alloc(sizeof(*ln), "tnode");
 	ln->tn_op = NAME;
 	ln->tn_type = lutp;
 	ln->tn_lvalue = true;

Index: src/usr.bin/xlint/lint1/lex.c
diff -u src/usr.bin/xlint/lint1/lex.c:1.187 src/usr.bin/xlint/lint1/lex.c:1.188
--- src/usr.bin/xlint/lint1/lex.c:1.187	Sat Jul 15 09:40:36 2023
+++ src/usr.bin/xlint/lint1/lex.c	Sat Jul 15 13:35:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lex.c,v 1.187 2023/07/15 09:40:36 rillig Exp $ */
+/* $NetBSD: lex.c,v 1.188 2023/07/15 13:35:24 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -38,7 +38,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: lex.c,v 1.187 2023/07/15 09:40:36 rillig Exp $");
+__RCSID("$NetBSD: lex.c,v 1.188 2023/07/15 13:35:24 rillig Exp $");
 #endif
 
 #include <ctype.h>
@@ -358,7 +358,7 @@ add_keyword(const struct keyword *kw, bo
 		name = xstrdup(buf);
 	}
 
-	sym_t *sym = block_zero_alloc(sizeof(*sym));
+	sym_t *sym = block_zero_alloc(sizeof(*sym), "sym");
 	sym->s_name = name;
 	sym->s_keyword = kw;
 	int tok = kw->kw_token;
@@ -481,7 +481,7 @@ lex_name(const char *yytext, size_t yyle
 		return sym->s_scl == TYPEDEF ? T_TYPENAME : T_NAME;
 	}
 
-	char *name = block_zero_alloc(yyleng + 1);
+	char *name = block_zero_alloc(yyleng + 1, "string");
 	(void)memcpy(name, yytext, yyleng + 1);
 	sb->sb_name = name;
 	return T_NAME;
@@ -1336,8 +1336,8 @@ getsym(sbuf_t *sb)
 	/* labels must always be allocated at level 1 (outermost block) */
 	decl_level *dl;
 	if (symtyp == FLABEL) {
-		sym = level_zero_alloc(1, sizeof(*sym));
-		char *s = level_zero_alloc(1, sb->sb_len + 1);
+		sym = level_zero_alloc(1, sizeof(*sym), "sym");
+		char *s = level_zero_alloc(1, sb->sb_len + 1, "string");
 		(void)memcpy(s, sb->sb_name, sb->sb_len + 1);
 		sym->s_name = s;
 		sym->s_block_level = 1;
@@ -1347,7 +1347,7 @@ getsym(sbuf_t *sb)
 			dl = dl->d_enclosing;
 		lint_assert(dl->d_kind == DLK_AUTO);
 	} else {
-		sym = block_zero_alloc(sizeof(*sym));
+		sym = block_zero_alloc(sizeof(*sym), "sym");
 		sym->s_name = sb->sb_name;
 		sym->s_block_level = block_level;
 		dl = dcs;
@@ -1378,8 +1378,8 @@ sym_t *
 mktempsym(type_t *tp)
 {
 	static unsigned n = 0;
-	char *s = level_zero_alloc((size_t)block_level, 64);
-	sym_t *sym = block_zero_alloc(sizeof(*sym));
+	char *s = level_zero_alloc((size_t)block_level, 64, "string");
+	sym_t *sym = block_zero_alloc(sizeof(*sym), "sym");
 	scl_t scl;
 
 	(void)snprintf(s, 64, "%.8u_tmp", n++);
@@ -1481,7 +1481,7 @@ pushdown(const sym_t *sym)
 
 	debug_step("pushdown '%s' %s '%s'",
 	    sym->s_name, symt_name(sym->s_kind), type_name(sym->s_type));
-	nsym = block_zero_alloc(sizeof(*nsym));
+	nsym = block_zero_alloc(sizeof(*nsym), "sym");
 	lint_assert(sym->s_block_level <= block_level);
 	nsym->s_name = sym->s_name;
 	nsym->s_def_pos = unique_curr_pos();

Index: src/usr.bin/xlint/lint1/lint1.h
diff -u src/usr.bin/xlint/lint1/lint1.h:1.193 src/usr.bin/xlint/lint1/lint1.h:1.194
--- src/usr.bin/xlint/lint1/lint1.h:1.193	Fri Jul 14 08:53:52 2023
+++ src/usr.bin/xlint/lint1/lint1.h	Sat Jul 15 13:35:24 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: lint1.h,v 1.193 2023/07/14 08:53:52 rillig Exp $ */
+/* $NetBSD: lint1.h,v 1.194 2023/07/15 13:35:24 rillig Exp $ */
 
 /*
  * Copyright (c) 1996 Christopher G. Demetriou.  All Rights Reserved.
@@ -43,7 +43,13 @@
  * - the end of the translation unit.
  */
 typedef struct memory_pool {
-	void	**items;
+	struct memory_pool_item {
+		void *p;
+#ifdef DEBUG_MEM
+		size_t size;
+		const char *descr;
+#endif
+	} *items;
 	size_t	len;
 	size_t	cap;
 } memory_pool;

Index: src/usr.bin/xlint/lint1/mem1.c
diff -u src/usr.bin/xlint/lint1/mem1.c:1.69 src/usr.bin/xlint/lint1/mem1.c:1.70
--- src/usr.bin/xlint/lint1/mem1.c:1.69	Sat Jul 15 09:40:36 2023
+++ src/usr.bin/xlint/lint1/mem1.c	Sat Jul 15 13:35:24 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: mem1.c,v 1.69 2023/07/15 09:40:36 rillig Exp $	*/
+/*	$NetBSD: mem1.c,v 1.70 2023/07/15 13:35:24 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: mem1.c,v 1.69 2023/07/15 09:40:36 rillig Exp $");
+__RCSID("$NetBSD: mem1.c,v 1.70 2023/07/15 13:35:24 rillig Exp $");
 #endif
 
 #include <sys/param.h>
@@ -170,7 +170,7 @@ static memory_pools mpools;
 static memory_pool expr_pool;
 
 static void
-mpool_add(memory_pool *pool, void *item)
+mpool_add(memory_pool *pool, struct memory_pool_item item)
 {
 
 	if (pool->len >= pool->cap) {
@@ -185,17 +185,41 @@ static void
 mpool_free(memory_pool *pool)
 {
 
-	for (; pool->len > 0; pool->len--)
-		free(pool->items[pool->len - 1]);
+	for (; pool->len > 0; pool->len--) {
+		struct memory_pool_item *item = pool->items + pool->len - 1;
+#ifdef DEBUG_MEM
+		if (strcmp(item->descr, "string") == 0)
+			debug_step("%s: freeing string '%s'",
+			    __func__, (const char *)item->p);
+		else if (strcmp(item->descr, "sym") == 0)
+			debug_step("%s: freeing symbol '%s'",
+			    __func__, ((const sym_t *)item->p)->s_name);
+		else if (strcmp(item->descr, "type") == 0)
+			debug_step("%s: freeing type '%s'",
+			    __func__, type_name(item->p));
+		else
+			debug_step("%s: freeing '%s' with %zu bytes",
+			    __func__, item->descr, item->size);
+#endif
+		free(item->p);
+	}
 }
 
 static void *
+#ifdef DEBUG_MEM
+mpool_zero_alloc(memory_pool *pool, size_t size, const char *descr)
+#else
 mpool_zero_alloc(memory_pool *pool, size_t size)
+#endif
 {
 
 	void *mem = xmalloc(size);
 	memset(mem, 0, size);
-	mpool_add(pool, mem);
+#if DEBUG_MEM
+	mpool_add(pool, (struct memory_pool_item){ mem, size, descr });
+#else
+	mpool_add(pool, (struct memory_pool_item){ mem });
+#endif
 	return mem;
 }
 
@@ -215,21 +239,39 @@ mpool_at(size_t level)
 }
 
 
-/* Allocate memory associated with level l, initialized with zero. */
+/* Allocate memory associated with the level, initialized with zero. */
+#ifdef DEBUG_MEM
+void *
+level_zero_alloc(size_t level, size_t size, const char *descr)
+{
+
+	return mpool_zero_alloc(mpool_at(level), size, descr);
+}
+#else
 void *
-level_zero_alloc(size_t l, size_t s)
+(level_zero_alloc)(size_t level, size_t size)
 {
 
-	return mpool_zero_alloc(mpool_at(l), s);
+	return mpool_zero_alloc(mpool_at(level), size);
 }
+#endif
 
 /* Allocate memory that is freed at the end of the current block. */
+#ifdef DEBUG_MEM
 void *
-block_zero_alloc(size_t s)
+block_zero_alloc(size_t size, const char *descr)
 {
 
-	return level_zero_alloc(mem_block_level, s);
+	return level_zero_alloc(mem_block_level, size, descr);
 }
+#else
+void *
+(block_zero_alloc)(size_t size)
+{
+
+	return (level_zero_alloc)(mem_block_level, size);
+}
+#endif
 
 void
 level_free_all(size_t level)
@@ -240,12 +282,21 @@ level_free_all(size_t level)
 }
 
 /* Allocate memory that is freed at the end of the current expression. */
+#if DEBUG_MEM
 void *
-expr_zero_alloc(size_t s)
+expr_zero_alloc(size_t s, const char *descr)
 {
 
-	return mpool_zero_alloc(&expr_pool, s);
+	return mpool_zero_alloc(&expr_pool, s, descr);
 }
+#else
+void *
+(expr_zero_alloc)(size_t size)
+{
+
+	return mpool_zero_alloc(&expr_pool, size);
+}
+#endif
 
 static bool
 str_ends_with(const char *haystack, const char *needle)
@@ -267,7 +318,7 @@ str_ends_with(const char *haystack, cons
 tnode_t *
 expr_alloc_tnode(void)
 {
-	tnode_t *tn = expr_zero_alloc(sizeof(*tn));
+	tnode_t *tn = expr_zero_alloc(sizeof(*tn), "tnode");
 	/*
 	 * files named *.c that are different from the main translation unit
 	 * typically contain generated code that cannot be influenced, such

Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.567 src/usr.bin/xlint/lint1/tree.c:1.568
--- src/usr.bin/xlint/lint1/tree.c:1.567	Sat Jul 15 12:24:57 2023
+++ src/usr.bin/xlint/lint1/tree.c	Sat Jul 15 13:35:24 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: tree.c,v 1.567 2023/07/15 12:24:57 rillig Exp $	*/
+/*	$NetBSD: tree.c,v 1.568 2023/07/15 13:35:24 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: tree.c,v 1.567 2023/07/15 12:24:57 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.568 2023/07/15 13:35:24 rillig Exp $");
 #endif
 
 #include <float.h>
@@ -322,7 +322,7 @@ block_derive_type(type_t *tp, tspec_t t)
 {
 	type_t *tp2;
 
-	tp2 = block_zero_alloc(sizeof(*tp2));
+	tp2 = block_zero_alloc(sizeof(*tp2), "type");
 	tp2->t_tspec = t;
 	tp2->t_subt = tp;
 	return tp2;
@@ -337,7 +337,7 @@ expr_derive_type(type_t *tp, tspec_t t)
 {
 	type_t *tp2;
 
-	tp2 = expr_zero_alloc(sizeof(*tp2));
+	tp2 = expr_zero_alloc(sizeof(*tp2), "type");
 	tp2->t_tspec = t;
 	tp2->t_subt = tp;
 	return tp2;
@@ -526,7 +526,7 @@ build_string(strg_t *strg)
 {
 	size_t len = strg->st_len;
 
-	type_t *tp = expr_zero_alloc(sizeof(*tp));
+	type_t *tp = expr_zero_alloc(sizeof(*tp), "type");
 	tp->t_tspec = ARRAY;
 	tp->t_subt = gettyp(strg->st_char ? CHAR : WCHAR_TSPEC);
 	tp->t_dim = (int)(len + 1);
@@ -536,13 +536,13 @@ build_string(strg_t *strg)
 	n->tn_type = tp;
 	n->tn_lvalue = true;
 
-	n->tn_string = expr_zero_alloc(sizeof(*n->tn_string));
+	n->tn_string = expr_zero_alloc(sizeof(*n->tn_string), "type.string");
 	n->tn_string->st_char = strg->st_char;
 	n->tn_string->st_len = len;
 
 	size_t chsize = strg->st_char ? sizeof(char) : sizeof(wchar_t);
 	size_t size = (len + 1) * chsize;
-	n->tn_string->st_mem = expr_zero_alloc(size);
+	n->tn_string->st_mem = expr_zero_alloc(size, "type.string.data");
 	(void)memcpy(n->tn_string->st_mem, strg->st_mem, size);
 	free(strg->st_mem);
 	free(strg);
@@ -1909,8 +1909,9 @@ struct_or_union_member(tnode_t *tn, op_t
 		msym->s_kind = FMEMBER;
 		msym->s_scl = STRUCT_MEMBER;
 
-		struct_or_union *sou = expr_zero_alloc(sizeof(*sou));
-		sou->sou_tag = expr_zero_alloc(sizeof(*sou->sou_tag));
+		struct_or_union *sou = expr_zero_alloc(sizeof(*sou),
+		    "struct_or_union");
+		sou->sou_tag = expr_zero_alloc(sizeof(*sou->sou_tag), "sym");
 		sou->sou_tag->s_name = unnamed;
 
 		msym->u.s_member.sm_containing_type = sou;

Reply via email to