xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_366.c (revision 465ab238788e2dd3555edb0497148fa4c5f47dc7)
1 /*	$NetBSD: msg_366.c,v 1.5 2024/08/31 06:57:31 rillig Exp $	*/
2 # 3 "msg_366.c"
3 
4 // Test for message: missing '\0' at the end of '%.*s' [366]
5 
6 /*
7  * In the new-style format, each conversion ends with a '\0'.  If that's not
8  * the case, snprintb will read beyond the end of the format argument, looking
9  * for the terminating '\0'.  In the most common case where the format comes
10  * from a string literal, the '\0' from the conversion needs to be spelled
11  * out, while the '\0' that terminates the sequence of conversions is provided
12  * by the C compiler.
13  */
14 
15 /* lint1-extra-flags: -X 351 */
16 
17 typedef typeof(sizeof(0)) size_t;
18 typedef unsigned long long uint64_t;
19 
20 int snprintb(char *, size_t, const char *, uint64_t);
21 
22 void
23 example(unsigned u32)
24 {
25 	char buf[64];
26 
27 	/* expect+4: warning: redundant '\0' at the end of the format [377] */
28 	snprintb(buf, sizeof(buf),
29 	    "\177\020"
30 	    "\0",
31 	    u32);
32 
33 	/* expect+5: warning: empty description in 'b\007' [367] */
34 	/* expect+4: warning: missing '\0' at the end of 'b\007' [366] */
35 	snprintb(buf, sizeof(buf),
36 	    "\177\020"
37 	    "b\007",
38 	    u32);
39 
40 	/* expect+5: warning: empty description in 'f\007\000' [367] */
41 	/* expect+4: warning: missing '\0' at the end of 'f\007\000' [366] */
42 	snprintb(buf, sizeof(buf),
43 	    "\177\020"
44 	    "f\007\000",
45 	    u32);
46 
47 	/* expect+4: warning: missing '\0' at the end of 'F\007\000' [366] */
48 	snprintb(buf, sizeof(buf),
49 	    "\177\020"
50 	    "F\007\000",
51 	    u32);
52 
53 	/* expect+4: warning: missing '\0' at the end of '=\007value' [366] */
54 	snprintb(buf, sizeof(buf),
55 	    "\177\020"
56 	    "=\007value",
57 	    u32);
58 
59 	/* expect+4: warning: missing '\0' at the end of ':\007value' [366] */
60 	snprintb(buf, sizeof(buf),
61 	    "\177\020"
62 	    ":\007value",
63 	    u32);
64 
65 	/* expect+4: warning: missing '\0' at the end of '*default' [366] */
66 	snprintb(buf, sizeof(buf),
67 	    "\177\020"
68 	    "*default",
69 	    u32);
70 }
71