Module Name: src Committed By: rillig Date: Sat Feb 3 18:58:05 UTC 2024
Modified Files: src/tests/usr.bin/xlint/lint1: msg_075.c src/usr.bin/xlint/lint1: lex.c Log Message: lint: allow hexadecimal character escapes up to UINT_MAX Previously, any value larger than INT_MAX was regarded as negative and thus terminated the loop around get_escaped_char. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 src/tests/usr.bin/xlint/lint1/msg_075.c cvs rdiff -u -r1.210 -r1.211 src/usr.bin/xlint/lint1/lex.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/usr.bin/xlint/lint1/msg_075.c diff -u src/tests/usr.bin/xlint/lint1/msg_075.c:1.8 src/tests/usr.bin/xlint/lint1/msg_075.c:1.9 --- src/tests/usr.bin/xlint/lint1/msg_075.c:1.8 Sat Feb 3 10:01:59 2024 +++ src/tests/usr.bin/xlint/lint1/msg_075.c Sat Feb 3 18:58:05 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: msg_075.c,v 1.8 2024/02/03 10:01:59 rillig Exp $ */ +/* $NetBSD: msg_075.c,v 1.9 2024/02/03 18:58:05 rillig Exp $ */ # 3 "msg_075.c" // Test for message: overflow in hex escape [75] @@ -36,8 +36,7 @@ int wide_hex2 = L'\xff'; int wide_hex3 = L'\x100'; int wide_hex4 = L'\xffff'; int wide_hex5 = L'\xfffff'; -/* expect+2: warning: overflow in hex escape [75] */ -/* expect+1: error: empty character constant [73] */ +/* expect+1: warning: overflow in hex escape [75] */ int wide_hex9 = L'\xfffffffff'; char char_string_hex1[] = "\xf"; Index: src/usr.bin/xlint/lint1/lex.c diff -u src/usr.bin/xlint/lint1/lex.c:1.210 src/usr.bin/xlint/lint1/lex.c:1.211 --- src/usr.bin/xlint/lint1/lex.c:1.210 Sat Feb 3 12:57:12 2024 +++ src/usr.bin/xlint/lint1/lex.c Sat Feb 3 18:58:05 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: lex.c,v 1.210 2024/02/03 12:57:12 rillig Exp $ */ +/* $NetBSD: lex.c,v 1.211 2024/02/03 18:58:05 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.210 2024/02/03 12:57:12 rillig Exp $"); +__RCSID("$NetBSD: lex.c,v 1.211 2024/02/03 18:58:05 rillig Exp $"); #endif #include <ctype.h> @@ -773,7 +773,7 @@ read_escaped_oct(int c, bool wide) return value; } -static unsigned int +static int64_t read_escaped_hex(int c, bool wide) { if (!allow_c90) @@ -802,10 +802,10 @@ read_escaped_hex(int c, bool wide) } if (state == 2) value &= mask; - return (unsigned int)value; + return (int64_t)value; } -static int +static int64_t read_escaped_backslash(int delim, bool wide) { int c; @@ -859,7 +859,7 @@ read_escaped_backslash(int delim, bool w case '4': case '5': case '6': case '7': return read_escaped_oct(c, wide); case 'x': - return (int)read_escaped_hex(c, wide); + return read_escaped_hex(c, wide); case '\n': return -3; case EOF: @@ -885,11 +885,11 @@ read_escaped_backslash(int delim, bool w * Returns -1 if the end of the character constant or string is reached, * -2 if the EOF is reached, and the character otherwise. */ -static int +static int64_t get_escaped_char(int delim, bool wide) { - int c = prev_byte; + int64_t c = prev_byte; if (c != -1) prev_byte = -1; else @@ -927,13 +927,11 @@ get_escaped_char(int delim, bool wide) int lex_character_constant(void) { - size_t n; - int val, c; - n = 0; - val = 0; + size_t n = 0; + int64_t val = 0, c; while ((c = get_escaped_char('\'', false)) >= 0) { - val = (int)((unsigned int)val << CHAR_SIZE) + c; + val = (int64_t)((uint64_t)val << CHAR_SIZE) + c; n++; } if (c == -2) { @@ -954,7 +952,7 @@ lex_character_constant(void) error(73); } if (n == 1) - val = (int)convert_integer(val, CHAR, CHAR_SIZE); + val = convert_integer(val, CHAR, CHAR_SIZE); yylval.y_val = xcalloc(1, sizeof(*yylval.y_val)); yylval.y_val->v_tspec = INT; @@ -970,22 +968,18 @@ lex_character_constant(void) int lex_wide_character_constant(void) { - static char buf[MB_LEN_MAX + 1]; - size_t n, nmax; - int c; - wchar_t wc; + char buf[MB_LEN_MAX + 1]; + size_t nmax = MB_CUR_MAX; - nmax = MB_CUR_MAX; - - n = 0; + int64_t c; + size_t n = 0; while ((c = get_escaped_char('\'', true)) >= 0) { if (n < nmax) buf[n] = (char)c; n++; } - wc = 0; - + wchar_t wc = 0; if (c == -2) { /* unterminated character constant */ error(253); @@ -1255,7 +1249,7 @@ lex_string(void) buffer *buf = xcalloc(1, sizeof(*buf)); buf_init(buf); - int c; + int64_t c; while ((c = get_escaped_char('"', false)) >= 0) buf_add_char(buf, (char)c); if (c == -2) @@ -1289,7 +1283,7 @@ wide_length(const buffer *buf) int lex_wide_string(void) { - int c; + int64_t c; buffer buf; buf_init(&buf);