Module Name: src
Committed By: rillig
Date: Fri Jun 24 20:02:58 UTC 2022
Modified Files:
src/tests/usr.bin/xlint/lint1: msg_247.c
Log Message:
tests/lint: demonstrate pointer casts between sockaddr variants
To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/tests/usr.bin/xlint/lint1/msg_247.c
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.20 src/tests/usr.bin/xlint/lint1/msg_247.c:1.21
--- src/tests/usr.bin/xlint/lint1/msg_247.c:1.20 Fri Jun 24 19:27:43 2022
+++ src/tests/usr.bin/xlint/lint1/msg_247.c Fri Jun 24 20:02:58 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_247.c,v 1.20 2022/06/24 19:27:43 rillig Exp $ */
+/* $NetBSD: msg_247.c,v 1.21 2022/06/24 20:02:58 rillig Exp $ */
# 3 "msg_247.c"
// Test for message: pointer cast from '%s' to '%s' may be troublesome [247]
@@ -207,3 +207,63 @@ char_to_struct(void *ptr)
/* expect+1: warning: pointer cast from 'pointer to signed char' to 'pointer to struct counter' may be troublesome [247] */
sink((struct counter *)(signed char *)ptr);
}
+
+
+// The following data types are simplified from various system headers.
+
+typedef unsigned char uint8_t;
+typedef unsigned short uint16_t;
+typedef unsigned int uint32_t;
+
+typedef uint16_t in_port_t;
+typedef uint8_t sa_family_t;
+
+struct sockaddr {
+ uint8_t sa_len;
+ sa_family_t sa_family;
+ char sa_data[14];
+};
+
+struct in_addr {
+ uint32_t s_addr;
+};
+
+struct sockaddr_in {
+ uint8_t sin_len;
+ sa_family_t sin_family;
+ in_port_t sin_port;
+ struct in_addr sin_addr;
+ uint8_t sin_zero[8];
+};
+
+struct sockaddr_in6 {
+ uint8_t sin6_len;
+ sa_family_t sin6_family;
+ in_port_t sin6_port;
+ uint32_t sin6_flowinfo;
+ union {
+ uint8_t u6_addr8[16];
+ uint16_t u6_addr16[8];
+ uint32_t u6_addr32[4];
+ } sin6_addr;
+ uint32_t sin6_scope_id;
+};
+
+void *
+cast_between_sockaddr_variants(void *ptr)
+{
+
+ /* expect+1: warning: pointer cast from 'pointer to struct sockaddr' to 'pointer to struct sockaddr_in' may be troublesome [247] */
+ void *t1 = (struct sockaddr_in *)(struct sockaddr *)ptr;
+
+ /* expect+1: warning: pointer cast from 'pointer to struct sockaddr_in' to 'pointer to struct sockaddr' may be troublesome [247] */
+ void *t2 = (struct sockaddr *)(struct sockaddr_in *)t1;
+
+ /* expect+1: warning: pointer cast from 'pointer to struct sockaddr' to 'pointer to struct sockaddr_in6' may be troublesome [247] */
+ void *t3 = (struct sockaddr_in6 *)(struct sockaddr *)t2;
+
+ /* expect+1: warning: pointer cast from 'pointer to struct sockaddr_in6' to 'pointer to struct sockaddr' may be troublesome [247] */
+ void *t4 = (struct sockaddr *)(struct sockaddr_in6 *)t3;
+
+ return t4;
+}