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;