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);

Reply via email to