xref: /netbsd-src/tests/usr.bin/xlint/lint1/msg_366.c (revision 465ab238788e2dd3555edb0497148fa4c5f47dc7)
1*465ab238Srillig /*	$NetBSD: msg_366.c,v 1.5 2024/08/31 06:57:31 rillig Exp $	*/
238c0bdf2Srillig # 3 "msg_366.c"
338c0bdf2Srillig 
438c0bdf2Srillig // Test for message: missing '\0' at the end of '%.*s' [366]
538c0bdf2Srillig 
638c0bdf2Srillig /*
764230f32Srillig  * In the new-style format, each conversion ends with a '\0'.  If that's not
838c0bdf2Srillig  * the case, snprintb will read beyond the end of the format argument, looking
938c0bdf2Srillig  * for the terminating '\0'.  In the most common case where the format comes
1064230f32Srillig  * from a string literal, the '\0' from the conversion needs to be spelled
1164230f32Srillig  * out, while the '\0' that terminates the sequence of conversions is provided
1264230f32Srillig  * by the C compiler.
1338c0bdf2Srillig  */
1438c0bdf2Srillig 
1538c0bdf2Srillig /* lint1-extra-flags: -X 351 */
1638c0bdf2Srillig 
1738c0bdf2Srillig typedef typeof(sizeof(0)) size_t;
1838c0bdf2Srillig typedef unsigned long long uint64_t;
1938c0bdf2Srillig 
2038c0bdf2Srillig int snprintb(char *, size_t, const char *, uint64_t);
2138c0bdf2Srillig 
2238c0bdf2Srillig void
2338c0bdf2Srillig example(unsigned u32)
2438c0bdf2Srillig {
2538c0bdf2Srillig 	char buf[64];
2638c0bdf2Srillig 
27a8d07ea3Srillig 	/* expect+4: warning: redundant '\0' at the end of the format [377] */
2838c0bdf2Srillig 	snprintb(buf, sizeof(buf),
2938c0bdf2Srillig 	    "\177\020"
3038c0bdf2Srillig 	    "\0",
3138c0bdf2Srillig 	    u32);
3238c0bdf2Srillig 
33a8d07ea3Srillig 	/* expect+5: warning: empty description in 'b\007' [367] */
3438c0bdf2Srillig 	/* expect+4: warning: missing '\0' at the end of 'b\007' [366] */
3538c0bdf2Srillig 	snprintb(buf, sizeof(buf),
3638c0bdf2Srillig 	    "\177\020"
3738c0bdf2Srillig 	    "b\007",
3838c0bdf2Srillig 	    u32);
3938c0bdf2Srillig 
40a8d07ea3Srillig 	/* expect+5: warning: empty description in 'f\007\000' [367] */
4138c0bdf2Srillig 	/* expect+4: warning: missing '\0' at the end of 'f\007\000' [366] */
4238c0bdf2Srillig 	snprintb(buf, sizeof(buf),
4338c0bdf2Srillig 	    "\177\020"
4438c0bdf2Srillig 	    "f\007\000",
4538c0bdf2Srillig 	    u32);
4638c0bdf2Srillig 
4738c0bdf2Srillig 	/* expect+4: warning: missing '\0' at the end of 'F\007\000' [366] */
4838c0bdf2Srillig 	snprintb(buf, sizeof(buf),
4938c0bdf2Srillig 	    "\177\020"
5038c0bdf2Srillig 	    "F\007\000",
5138c0bdf2Srillig 	    u32);
5238c0bdf2Srillig 
5338c0bdf2Srillig 	/* expect+4: warning: missing '\0' at the end of '=\007value' [366] */
5438c0bdf2Srillig 	snprintb(buf, sizeof(buf),
5538c0bdf2Srillig 	    "\177\020"
5638c0bdf2Srillig 	    "=\007value",
5738c0bdf2Srillig 	    u32);
5838c0bdf2Srillig 
5938c0bdf2Srillig 	/* expect+4: warning: missing '\0' at the end of ':\007value' [366] */
6038c0bdf2Srillig 	snprintb(buf, sizeof(buf),
6138c0bdf2Srillig 	    "\177\020"
6238c0bdf2Srillig 	    ":\007value",
6338c0bdf2Srillig 	    u32);
6438c0bdf2Srillig 
6538c0bdf2Srillig 	/* expect+4: warning: missing '\0' at the end of '*default' [366] */
6638c0bdf2Srillig 	snprintb(buf, sizeof(buf),
6738c0bdf2Srillig 	    "\177\020"
6838c0bdf2Srillig 	    "*default",
6938c0bdf2Srillig 	    u32);
7038c0bdf2Srillig }
71