Module Name: src
Committed By: rillig
Date: Fri Mar 26 16:19:43 UTC 2021
Modified Files:
src/tests/usr.bin/xlint/lint1: msg_247.c msg_247.exp
Log Message:
tests/lint: add tests for warning about cast to character types
To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/tests/usr.bin/xlint/lint1/msg_247.c
cvs rdiff -u -r1.3 -r1.4 src/tests/usr.bin/xlint/lint1/msg_247.exp
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/tests/usr.bin/xlint/lint1/msg_247.c
diff -u src/tests/usr.bin/xlint/lint1/msg_247.c:1.5 src/tests/usr.bin/xlint/lint1/msg_247.c:1.6
--- src/tests/usr.bin/xlint/lint1/msg_247.c:1.5 Sun Mar 14 22:24:24 2021
+++ src/tests/usr.bin/xlint/lint1/msg_247.c Fri Mar 26 16:19:43 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_247.c,v 1.5 2021/03/14 22:24:24 rillig Exp $ */
+/* $NetBSD: msg_247.c,v 1.6 2021/03/26 16:19:43 rillig Exp $ */
# 3 "msg_247.c"
// Test for message: pointer cast from '%s' to '%s' may be troublesome [247]
@@ -30,3 +30,48 @@ example(struct Other *arg)
*/
display = (PDisplay)arg; /* expect: 247 */
}
+
+/*
+ * C code with a long history that has existed in pre-C90 times already often
+ * uses 'pointer to char' where modern code would use 'pointer to void'.
+ * Since 'char' is the most general underlying type, there is nothing wrong
+ * with casting to it. An example for this type of code is X11.
+ *
+ * Casting to 'pointer to char' may also be used by programmers who don't know
+ * about endianness, but that's not something lint can do anything about. The
+ * code for these two use cases looks exactly the same, so lint errs on the
+ * side of fewer false positive warnings here. (after fixing the FIXME below)
+ */
+char *
+cast_to_char_pointer(struct Other *arg)
+{
+ return (char *)arg; /* expect: 247 *//* FIXME */
+}
+
+/*
+ * In traditional C there was 'unsigned char' as well, so the same reasoning
+ * as for plain 'char' applies here.
+ */
+unsigned char *
+cast_to_unsigned_char_pointer(struct Other *arg)
+{
+ return (unsigned char *)arg; /* expect: 247 *//* FIXME */
+}
+
+/*
+ * Traditional C does not have the type specifier 'signed', which means that
+ * this type cannot be used by old code. Therefore warn about this. All code
+ * that triggers this warning should do the intermediate cast via 'void
+ * pointer'.
+ */
+signed char *
+cast_to_signed_char_pointer(struct Other *arg)
+{
+ return (signed char *)arg; /* expect: 247 */
+}
+
+char *
+cast_to_void_pointer_then_to_char_pointer(struct Other *arg)
+{
+ return (char *)(void *)arg;
+}
Index: src/tests/usr.bin/xlint/lint1/msg_247.exp
diff -u src/tests/usr.bin/xlint/lint1/msg_247.exp:1.3 src/tests/usr.bin/xlint/lint1/msg_247.exp:1.4
--- src/tests/usr.bin/xlint/lint1/msg_247.exp:1.3 Sun Mar 14 22:24:24 2021
+++ src/tests/usr.bin/xlint/lint1/msg_247.exp Fri Mar 26 16:19:43 2021
@@ -1 +1,4 @@
msg_247.c(31): warning: pointer cast from 'pointer to struct Other' to 'pointer to struct <unnamed>' may be troublesome [247]
+msg_247.c(48): warning: pointer cast from 'pointer to struct Other' to 'pointer to char' may be troublesome [247]
+msg_247.c(58): warning: pointer cast from 'pointer to struct Other' to 'pointer to unsigned char' may be troublesome [247]
+msg_247.c(70): warning: pointer cast from 'pointer to struct Other' to 'pointer to signed char' may be troublesome [247]