Module Name: src Committed By: rillig Date: Mon Jan 29 21:30:25 UTC 2024
Modified Files: src/usr.bin/xlint/lint1: ckgetopt.c debug.c emit1.c lex.c lint1.h tree.c Log Message: lint: do not remember content of wide string literals The plain char literals are needed for checking printf/scanf format strings; lint has no similar check for wide strings. These format strings are checked by modern compilers, making this check less relevant. To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/usr.bin/xlint/lint1/ckgetopt.c cvs rdiff -u -r1.66 -r1.67 src/usr.bin/xlint/lint1/debug.c cvs rdiff -u -r1.81 -r1.82 src/usr.bin/xlint/lint1/emit1.c cvs rdiff -u -r1.203 -r1.204 src/usr.bin/xlint/lint1/lex.c cvs rdiff -u -r1.209 -r1.210 src/usr.bin/xlint/lint1/lint1.h cvs rdiff -u -r1.598 -r1.599 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/ckgetopt.c diff -u src/usr.bin/xlint/lint1/ckgetopt.c:1.18 src/usr.bin/xlint/lint1/ckgetopt.c:1.19 --- src/usr.bin/xlint/lint1/ckgetopt.c:1.18 Mon Jan 29 21:04:21 2024 +++ src/usr.bin/xlint/lint1/ckgetopt.c Mon Jan 29 21:30:24 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: ckgetopt.c,v 1.18 2024/01/29 21:04:21 rillig Exp $ */ +/* $NetBSD: ckgetopt.c,v 1.19 2024/01/29 21:30:24 rillig Exp $ */ /*- * Copyright (c) 2021 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: ckgetopt.c,v 1.18 2024/01/29 21:04:21 rillig Exp $"); +__RCSID("$NetBSD: ckgetopt.c,v 1.19 2024/01/29 21:30:24 rillig Exp $"); #endif #include <stdbool.h> @@ -100,7 +100,7 @@ is_getopt_condition(const tnode_t *tn, c && last_arg->tn_left->tn_op == ADDR && last_arg->tn_left->tn_left->tn_op == STRING && (str = last_arg->tn_left->tn_left->tn_string)->st_char) { - *out_options = xstrdup(str->st_mem); + *out_options = xstrdup(str->st_chars); return true; } return false; Index: src/usr.bin/xlint/lint1/debug.c diff -u src/usr.bin/xlint/lint1/debug.c:1.66 src/usr.bin/xlint/lint1/debug.c:1.67 --- src/usr.bin/xlint/lint1/debug.c:1.66 Tue Jan 23 19:44:28 2024 +++ src/usr.bin/xlint/lint1/debug.c Mon Jan 29 21:30:24 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: debug.c,v 1.66 2024/01/23 19:44:28 rillig Exp $ */ +/* $NetBSD: debug.c,v 1.67 2024/01/29 21:30:24 rillig Exp $ */ /*- * Copyright (c) 2021 The NetBSD Foundation, Inc. @@ -35,7 +35,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: debug.c,v 1.66 2024/01/23 19:44:28 rillig Exp $"); +__RCSID("$NetBSD: debug.c,v 1.67 2024/01/29 21:30:24 rillig Exp $"); #endif #include <stdlib.h> @@ -238,15 +238,9 @@ debug_node(const tnode_t *tn) // NOLINT( if (tn->tn_string->st_char) debug_printf(", length %zu, \"%s\"\n", tn->tn_string->st_len, - (const char *)tn->tn_string->st_mem); - else { - size_t n = MB_CUR_MAX * (tn->tn_string->st_len + 1); - char *s = xmalloc(n); - (void)wcstombs(s, tn->tn_string->st_mem, n); - debug_printf(", length %zu, L\"%s\"\n", - tn->tn_string->st_len, s); - free(s); - } + tn->tn_string->st_chars); + else + debug_printf(", length %zu\n", tn->tn_string->st_len); break; default: debug_printf("\n"); Index: src/usr.bin/xlint/lint1/emit1.c diff -u src/usr.bin/xlint/lint1/emit1.c:1.81 src/usr.bin/xlint/lint1/emit1.c:1.82 --- src/usr.bin/xlint/lint1/emit1.c:1.81 Sun Dec 3 18:17:41 2023 +++ src/usr.bin/xlint/lint1/emit1.c Mon Jan 29 21:30:24 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: emit1.c,v 1.81 2023/12/03 18:17:41 rillig Exp $ */ +/* $NetBSD: emit1.c,v 1.82 2024/01/29 21:30: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: emit1.c,v 1.81 2023/12/03 18:17:41 rillig Exp $"); +__RCSID("$NetBSD: emit1.c,v 1.82 2024/01/29 21:30:24 rillig Exp $"); #endif #include "lint1.h" @@ -450,17 +450,13 @@ outqchar(char c) static void outfstrg(strg_t *strg) { - char c, oc; - bool first; - const char *cp; lint_assert(strg->st_char); - cp = strg->st_mem; + const char *cp = strg->st_chars; outchar('"'); - c = *cp++; - + char c = *cp++; while (c != '\0') { if (c != '%') { @@ -511,7 +507,7 @@ outfstrg(strg_t *strg) */ if (c != '\0') { outqchar(c); - oc = c; + char oc = c; c = *cp++; /* * handle [ for scanf. [-] means that a minus sign was @@ -522,7 +518,7 @@ outfstrg(strg_t *strg) c = *cp++; if (c == ']') c = *cp++; - first = true; + bool first = true; while (c != '\0' && c != ']') { if (c == '-') { if (!first && *cp != ']') Index: src/usr.bin/xlint/lint1/lex.c diff -u src/usr.bin/xlint/lint1/lex.c:1.203 src/usr.bin/xlint/lint1/lex.c:1.204 --- src/usr.bin/xlint/lint1/lex.c:1.203 Sat Jan 27 20:03:14 2024 +++ src/usr.bin/xlint/lint1/lex.c Mon Jan 29 21:30:25 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: lex.c,v 1.203 2024/01/27 20:03:14 rillig Exp $ */ +/* $NetBSD: lex.c,v 1.204 2024/01/29 21:30:25 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.203 2024/01/27 20:03:14 rillig Exp $"); +__RCSID("$NetBSD: lex.c,v 1.204 2024/01/29 21:30:25 rillig Exp $"); #endif #include <ctype.h> @@ -1259,28 +1259,26 @@ clear_warn_flags(void) int lex_string(void) { - unsigned char *s; - int c; - size_t len, max; - - s = xmalloc(max = 64); + size_t s_len = 0; + size_t s_cap = 64; + char *s = xmalloc(s_cap); - len = 0; + int c; while ((c = get_escaped_char('"')) >= 0) { /* +1 to reserve space for a trailing NUL character */ - if (len + 1 == max) - s = xrealloc(s, max *= 2); - s[len++] = (char)c; + if (s_len + 1 == s_cap) + s = xrealloc(s, s_cap *= 2); + s[s_len++] = (char)c; } - s[len] = '\0'; + s[s_len] = '\0'; if (c == -2) /* unterminated string constant */ error(258); strg_t *strg = xcalloc(1, sizeof(*strg)); strg->st_char = true; - strg->st_len = len; - strg->st_mem = s; + strg->st_len = s_len; + strg->st_chars = s; yylval.y_string = strg; return T_STRING; @@ -1317,7 +1315,7 @@ lex_wide_string(void) n = 1; } - wchar_t *ws = xmalloc((wlen + 1) * sizeof(*ws)); + wchar_t *ws = xcalloc(wlen + 1, sizeof(*ws)); size_t wi = 0; /* convert from multibyte to wide char */ (void)mbtowc(NULL, NULL, 0); @@ -1327,13 +1325,12 @@ lex_wide_string(void) if (n == 0) n = 1; } - ws[wi] = 0; free(s); + free(ws); strg_t *strg = xcalloc(1, sizeof(*strg)); strg->st_char = false; strg->st_len = wlen; - strg->st_mem = ws; yylval.y_string = strg; return T_STRING; @@ -1580,7 +1577,7 @@ freeyyv(void *sp, int tok) free(val); } else if (tok == T_STRING) { strg_t *strg = *(strg_t **)sp; - free(strg->st_mem); + free(strg->st_chars); free(strg); } } Index: src/usr.bin/xlint/lint1/lint1.h diff -u src/usr.bin/xlint/lint1/lint1.h:1.209 src/usr.bin/xlint/lint1/lint1.h:1.210 --- src/usr.bin/xlint/lint1/lint1.h:1.209 Tue Jan 23 19:44:28 2024 +++ src/usr.bin/xlint/lint1/lint1.h Mon Jan 29 21:30:25 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: lint1.h,v 1.209 2024/01/23 19:44:28 rillig Exp $ */ +/* $NetBSD: lint1.h,v 1.210 2024/01/29 21:30:25 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -81,7 +81,7 @@ typedef struct { typedef struct strg { bool st_char; /* string doesn't have an 'L' prefix */ size_t st_len; /* length without trailing NUL */ - void *st_mem; /* char[] for st_char, or wchar_t[] */ + char *st_chars; /* only if st_char */ } strg_t; // TODO: Use bit-fields instead of plain bool, but keep an eye on arm and Index: src/usr.bin/xlint/lint1/tree.c diff -u src/usr.bin/xlint/lint1/tree.c:1.598 src/usr.bin/xlint/lint1/tree.c:1.599 --- src/usr.bin/xlint/lint1/tree.c:1.598 Tue Jan 23 20:03:42 2024 +++ src/usr.bin/xlint/lint1/tree.c Mon Jan 29 21:30:25 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: tree.c,v 1.598 2024/01/23 20:03:42 rillig Exp $ */ +/* $NetBSD: tree.c,v 1.599 2024/01/29 21:30:25 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.598 2024/01/23 20:03:42 rillig Exp $"); +__RCSID("$NetBSD: tree.c,v 1.599 2024/01/29 21:30:25 rillig Exp $"); #endif #include <float.h> @@ -542,9 +542,12 @@ build_string(strg_t *strg) 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, "tnode.string.data"); - (void)memcpy(n->tn_string->st_mem, strg->st_mem, size); - free(strg->st_mem); + if (strg->st_char) { + n->tn_string->st_chars = expr_zero_alloc(size, + "tnode.string.data"); + (void)memcpy(n->tn_string->st_chars, strg->st_chars, size); + free(strg->st_chars); + } free(strg); return n; @@ -4700,13 +4703,11 @@ cat_strings(strg_t *s1, strg_t *s2) size_t len1 = s1->st_len; size_t len2 = s2->st_len; - size_t chsize = s1->st_char ? sizeof(char) : sizeof(wchar_t); - size_t size1 = len1 * chsize; - size_t size2 = (len2 + 1) * chsize; - s1->st_mem = xrealloc(s1->st_mem, size1 + size2); - memcpy((char *)s1->st_mem + size1, s2->st_mem, size2); - free(s2->st_mem); - + if (s1->st_char) { + s1->st_chars = xrealloc(s1->st_chars, len1 + len2 + 1); + memcpy(s1->st_chars + len1, s2->st_chars, len2 + 1); + free(s2->st_chars); + } s1->st_len = len1 + len2; free(s2);