msg_358.c revision 1.4 1 1.4 rillig /* $NetBSD: msg_358.c,v 1.4 2024/11/05 06:23:04 rillig Exp $ */
2 1.1 rillig # 3 "msg_358.c"
3 1.1 rillig
4 1.1 rillig // Test for message: hex escape '%.*s' has more than 2 digits [358]
5 1.1 rillig
6 1.1 rillig /*
7 1.1 rillig * In the format argument of the snprintb and snprintb_m functions, a bit
8 1.1 rillig * position or field width is written as an octal or hexadecimal escape
9 1.4 rillig * sequence. If the description that follows a hexadecimal escape sequence
10 1.4 rillig * starts with hexadecimal digits (A-Fa-f), these digits are still part of the
11 1.4 rillig * escape sequence instead of the description.
12 1.4 rillig *
13 1.4 rillig * All platforms supported by lint have 8-bit char, so using more than the
14 1.4 rillig * maximum necessary 2 hexadecimal digits in an escape sequence is suspicious
15 1.4 rillig * of being unintended.
16 1.1 rillig */
17 1.1 rillig
18 1.1 rillig /* lint1-extra-flags: -X 351 */
19 1.1 rillig
20 1.1 rillig typedef typeof(sizeof(0)) size_t;
21 1.1 rillig typedef unsigned long long uint64_t;
22 1.1 rillig
23 1.3 rillig int snprintb(char *, size_t, const char *, uint64_t);
24 1.1 rillig
25 1.1 rillig void
26 1.1 rillig examples(unsigned u32, uint64_t u64)
27 1.1 rillig {
28 1.1 rillig char buf[64];
29 1.1 rillig
30 1.1 rillig /* expect+3: warning: hex escape '\x01B' has more than 2 digits [358] */
31 1.1 rillig snprintb(buf, sizeof(buf),
32 1.1 rillig "\020\x01BIT",
33 1.1 rillig u32);
34 1.1 rillig
35 1.1 rillig /* expect+3: warning: hex escape '\x01b' has more than 2 digits [358] */
36 1.1 rillig snprintb(buf, sizeof(buf),
37 1.1 rillig "\020\x01bit",
38 1.1 rillig u32);
39 1.1 rillig
40 1.1 rillig // This mismatch goes undetected as it has only 2 digits, does not mix
41 1.1 rillig // case and is in bounds. A spellchecker could mark the unknown word
42 1.1 rillig // 'ield' to give a hint.
43 1.1 rillig snprintb(buf, sizeof(buf),
44 1.1 rillig "\020\x1FIELD",
45 1.1 rillig u32);
46 1.1 rillig
47 1.1 rillig /* expect+3: warning: hex escape '\x01b' has more than 2 digits [358] */
48 1.1 rillig snprintb(buf, sizeof(buf),
49 1.1 rillig "\177\020b\x01bit\0",
50 1.1 rillig u64);
51 1.1 rillig
52 1.1 rillig /* expect+3: warning: hex escape '\x02b' has more than 2 digits [358] */
53 1.1 rillig snprintb(buf, sizeof(buf),
54 1.1 rillig "\177\020f\x00\x02bit\0",
55 1.1 rillig u64);
56 1.2 rillig
57 1.2 rillig // In this example from the snprintb manual page, the descriptions
58 1.2 rillig // that start with a hexadecimal digit must be separated from the
59 1.2 rillig // hexadecimal escape sequence for the bit position.
60 1.2 rillig snprintb(buf, sizeof(buf),
61 1.2 rillig "\20\x10NOTBOOT\x0f" "FPP\x0eSDVMA\x0cVIDEO"
62 1.2 rillig "\x0bLORES\x0a" "FPA\x09" "DIAG\x07" "CACHE"
63 1.2 rillig "\x06IOCACHE\x05LOOPBACK\x04" "DBGCACHE",
64 1.2 rillig u32);
65 1.1 rillig }
66