aboutsummaryrefslogtreecommitdiff
path: root/usr.bin/xlint/lint1/msg_378.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/xlint/lint1/msg_378.c')
-rw-r--r--usr.bin/xlint/lint1/msg_378.c52
1 files changed, 52 insertions, 0 deletions
diff --git a/usr.bin/xlint/lint1/msg_378.c b/usr.bin/xlint/lint1/msg_378.c
new file mode 100644
index 000000000000..4698e99a9e9e
--- /dev/null
+++ b/usr.bin/xlint/lint1/msg_378.c
@@ -0,0 +1,52 @@
+/* $NetBSD: msg_378.c,v 1.3 2024/08/31 06:57:32 rillig Exp $ */
+# 3 "msg_378.c"
+
+// Test for message: conversion '%.*s' is unreachable by input value [378]
+
+/*
+ * The typical use case of snprintb is to have a format that is specifically
+ * tailored to a particular input value. Often, a format is only used in a
+ * single place. Therefore, bits that are unreachable are redundant and may
+ * hint at typos.
+ */
+
+/* lint1-extra-flags: -X 351 */
+
+typedef typeof(sizeof(0)) size_t;
+typedef unsigned long long uint64_t;
+
+int snprintb(char *, size_t, const char *, uint64_t);
+
+void
+example(unsigned u32, uint64_t u64)
+{
+ char buf[64];
+
+ /* expect+5: warning: conversion '\040bit32' is unreachable by input value [378] */
+ snprintb(buf, sizeof(buf),
+ "\020"
+ "\037bit31"
+ "\040bit32",
+ u32 >> 1);
+
+ /* expect+5: warning: conversion 'b\075bit61\0' is unreachable by input value [378] */
+ snprintb(buf, sizeof(buf),
+ "\177\020"
+ "b\074bit60\0"
+ "b\075bit61\0",
+ u64 >> 3);
+
+ /* expect+12: warning: conversion 'b\000bit0\0' is unreachable by input value [378] */
+ /* expect+11: warning: conversion 'b\011bit9\0' is unreachable by input value [378] */
+ /* expect+10: warning: conversion 'f\017\002bits15-16\0' is unreachable by input value [378] */
+ /* expect+9: warning: conversion 'f\050\030bits40-63\0' is unreachable by input value [378] */
+ snprintb(buf, sizeof(buf),
+ "\177\020"
+ "b\000bit0\0"
+ "b\010bit8\0"
+ "b\011bit9\0"
+ "f\012\002bits10-11\0"
+ "f\017\002bits15-16\0"
+ "f\050\030bits40-63\0",
+ (u32 & 0xaa55aa55) << 8);
+}