Module Name:    src
Committed By:   rillig
Date:           Sat Feb  3 20:10:11 UTC 2024

Modified Files:
        src/distrib/sets/lists/tests: mi
        src/tests/usr.bin/xlint/lint1: msg_077.c t_usage.sh
        src/usr.bin/xlint/lint1: err.c lex.c
Added Files:
        src/tests/usr.bin/xlint/lint1: msg_356.c

Log Message:
lint: warn about short octal escape followed by '8' or '9'

These mistakes is typically found in snprintb format directives but is
probably a typo everywhere else as well.


To generate a diff of this commit:
cvs rdiff -u -r1.1304 -r1.1305 src/distrib/sets/lists/tests/mi
cvs rdiff -u -r1.8 -r1.9 src/tests/usr.bin/xlint/lint1/msg_077.c
cvs rdiff -u -r0 -r1.1 src/tests/usr.bin/xlint/lint1/msg_356.c
cvs rdiff -u -r1.14 -r1.15 src/tests/usr.bin/xlint/lint1/t_usage.sh
cvs rdiff -u -r1.223 -r1.224 src/usr.bin/xlint/lint1/err.c
cvs rdiff -u -r1.212 -r1.213 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/distrib/sets/lists/tests/mi
diff -u src/distrib/sets/lists/tests/mi:1.1304 src/distrib/sets/lists/tests/mi:1.1305
--- src/distrib/sets/lists/tests/mi:1.1304	Fri Feb  2 23:30:38 2024
+++ src/distrib/sets/lists/tests/mi	Sat Feb  3 20:10:10 2024
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1304 2024/02/02 23:30:38 rillig Exp $
+# $NetBSD: mi,v 1.1305 2024/02/03 20:10:10 rillig Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -7469,6 +7469,7 @@
 ./usr/tests/usr.bin/xlint/lint1/msg_353.c			tests-usr.bin-tests	compattestfile,atf
 ./usr/tests/usr.bin/xlint/lint1/msg_354.c			tests-usr.bin-tests	compattestfile,atf
 ./usr/tests/usr.bin/xlint/lint1/msg_355.c			tests-usr.bin-tests	compattestfile,atf
+./usr/tests/usr.bin/xlint/lint1/msg_356.c			tests-usr.bin-tests	compattestfile,atf
 ./usr/tests/usr.bin/xlint/lint1/op_colon.c			tests-usr.bin-tests	compattestfile,atf
 ./usr/tests/usr.bin/xlint/lint1/op_colon.exp			tests-obsolete		obsolete,atf
 ./usr/tests/usr.bin/xlint/lint1/op_shl_lp64.c			tests-usr.bin-tests	compattestfile,atf

Index: src/tests/usr.bin/xlint/lint1/msg_077.c
diff -u src/tests/usr.bin/xlint/lint1/msg_077.c:1.8 src/tests/usr.bin/xlint/lint1/msg_077.c:1.9
--- src/tests/usr.bin/xlint/lint1/msg_077.c:1.8	Sun Jul  9 11:01:27 2023
+++ src/tests/usr.bin/xlint/lint1/msg_077.c	Sat Feb  3 20:10:10 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg_077.c,v 1.8 2023/07/09 11:01:27 rillig Exp $	*/
+/*	$NetBSD: msg_077.c,v 1.9 2024/02/03 20:10:10 rillig Exp $	*/
 # 3 "msg_077.c"
 
 /* Test for message: bad octal digit '%c' [77] */
@@ -23,5 +23,6 @@ char single_digit = '\8';
  * anyway.
  * https://mail-index.netbsd.org/tech-toolchain/2021/03/16/msg003933.html
  */
+/* expect+2: warning: short octal escape '\0' followed by digit '8' [356] */
 /* expect+1: warning: multi-character character constant [294] */
 char several_digits = '\08';

Index: src/tests/usr.bin/xlint/lint1/t_usage.sh
diff -u src/tests/usr.bin/xlint/lint1/t_usage.sh:1.14 src/tests/usr.bin/xlint/lint1/t_usage.sh:1.15
--- src/tests/usr.bin/xlint/lint1/t_usage.sh:1.14	Sat Jan 20 10:02:31 2024
+++ src/tests/usr.bin/xlint/lint1/t_usage.sh	Sat Feb  3 20:10:11 2024
@@ -1,4 +1,4 @@
-# $NetBSD: t_usage.sh,v 1.14 2024/01/20 10:02:31 rillig Exp $
+# $NetBSD: t_usage.sh,v 1.15 2024/02/03 20:10:11 rillig Exp $
 #
 # Copyright (c) 2023 The NetBSD Foundation, Inc.
 # All rights reserved.
@@ -44,8 +44,8 @@ suppress_messages_body()
 	# Larger than the largest known message.
 	atf_check \
 	    -s 'exit:1' \
-	    -e "inline:lint1: invalid message ID '356'\n" \
-	    "$lint1" -X 356 code.c /dev/null
+	    -e "inline:lint1: invalid message ID '357'\n" \
+	    "$lint1" -X 357 code.c /dev/null
 
 	# Whitespace is not allowed before a message ID.
 	atf_check \

Index: src/usr.bin/xlint/lint1/err.c
diff -u src/usr.bin/xlint/lint1/err.c:1.223 src/usr.bin/xlint/lint1/err.c:1.224
--- src/usr.bin/xlint/lint1/err.c:1.223	Sat Jan 20 10:02:31 2024
+++ src/usr.bin/xlint/lint1/err.c	Sat Feb  3 20:10:10 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: err.c,v 1.223 2024/01/20 10:02:31 rillig Exp $	*/
+/*	$NetBSD: err.c,v 1.224 2024/02/03 20:10:10 rillig Exp $	*/
 
 /*
  * Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID)
-__RCSID("$NetBSD: err.c,v 1.223 2024/01/20 10:02:31 rillig Exp $");
+__RCSID("$NetBSD: err.c,v 1.224 2024/02/03 20:10:10 rillig Exp $");
 #endif
 
 #include <limits.h>
@@ -411,6 +411,7 @@ static const char *const msgs[] = {
 	"empty initializer braces require C23 or later",	      /* 353 */
 	"'_Static_assert' requires C11 or later",		      /* 354 */
 	"'_Static_assert' without message requires C23 or later",     /* 355 */
+	"short octal escape '%.*s' followed by digit '%c'",	      /* 356 */
 };
 
 static bool is_suppressed[sizeof(msgs) / sizeof(msgs[0])];

Index: src/usr.bin/xlint/lint1/lex.c
diff -u src/usr.bin/xlint/lint1/lex.c:1.212 src/usr.bin/xlint/lint1/lex.c:1.213
--- src/usr.bin/xlint/lint1/lex.c:1.212	Sat Feb  3 19:25:16 2024
+++ src/usr.bin/xlint/lint1/lex.c	Sat Feb  3 20:10:10 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: lex.c,v 1.212 2024/02/03 19:25:16 rillig Exp $ */
+/* $NetBSD: lex.c,v 1.213 2024/02/03 20:10:10 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.212 2024/02/03 19:25:16 rillig Exp $");
+__RCSID("$NetBSD: lex.c,v 1.213 2024/02/03 20:10:10 rillig Exp $");
 #endif
 
 #include <ctype.h>
@@ -931,8 +931,8 @@ hex_escape:
 static void
 check_quoted(const buffer *buf, bool complete, char delim)
 {
-	quoted_iterator it = { .start = 0 };
-	while (quoted_next(buf, &it)) {
+	quoted_iterator it = { .start = 0 }, prev = it;
+	for (; quoted_next(buf, &it); prev = it) {
 		if (it.missing_hex_digits)
 			/* no hex digits follow \x */
 			error(74);
@@ -975,6 +975,11 @@ check_quoted(const buffer *buf, bool com
 			/* invisible character U+%04X in %s */
 			query_message(17, (unsigned)it.value, delim == '"'
 			    ? "string literal" : "character constant");
+		if (prev.octal_digits > 0 && prev.octal_digits < 3
+		    && !it.escaped && it.value >= '8' && it.value <= '9')
+			/* short octal escape '%.*s' followed by digit '%c' */
+			warning(356, (int)(prev.i - prev.start),
+			    buf->data + prev.start, buf->data[it.start]);
 	}
 	if (it.unescaped_newline)
 		/* newline in string or char constant */

Added files:

Index: src/tests/usr.bin/xlint/lint1/msg_356.c
diff -u /dev/null src/tests/usr.bin/xlint/lint1/msg_356.c:1.1
--- /dev/null	Sat Feb  3 20:10:11 2024
+++ src/tests/usr.bin/xlint/lint1/msg_356.c	Sat Feb  3 20:10:11 2024
@@ -0,0 +1,35 @@
+/*	$NetBSD: msg_356.c,v 1.1 2024/02/03 20:10:11 rillig Exp $	*/
+# 3 "msg_356.c"
+
+// Test for message 356: short octal escape '%.*s' followed by digit '%c' [356]
+
+/* lint1-extra-flags: -X 351 */
+
+// When counting backwards in octal, the number before \040 is not \039 but
+// \037. This mistake sometimes happens while encoding the bit numbers for
+// snprintb(3) format directives.
+
+char snprintb_fmt[] = "\020"
+    "\0040bit32"		// 3-digit octal escapes are fine
+    "\0039bit31"
+    "\0038bit30"
+
+    "\040bit32"
+    /* expect+1: warning: short octal escape '\03' followed by digit '9' [356] */
+    "\039bit31"
+    /* expect+1: warning: short octal escape '\03' followed by digit '8' [356] */
+    "\038bit30"
+
+    "\40bit32"
+    /* expect+1: warning: short octal escape '\3' followed by digit '9' [356] */
+    "\39bit31"
+    /* expect+1: warning: short octal escape '\3' followed by digit '8' [356] */
+    "\38bit30"
+    "\37bit29"
+;
+
+char ok[] = ""
+    "\3\70"			// short octal followed by escaped '8'
+    "\3\x38"			// short octal followed by escaped '8'
+    "\3" "8"			// short octal and '8' are separated
+;

Reply via email to