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