Compiler bug or violation of strict aliasing rule?

Rin Okuyama <[email protected]>
Newsgroups gmane.os.netbsd.devel.toolchain
Message-ID <[email protected]>
For aarch64eb, GCC 9 and 10 compile this "if" block of
tests/net/net/t_tcp.c:

https://nxr.netbsd.org/xref/src/tests/net/net/t_tcp.c#141

    141          if (sfamily == AF_INET6 && cfamily == AF_INET) {
    142                  ss = bs;
    143                  sin6 = (void *)&ss;
    144                  sin = (void *)&bs;
    145                  addrlen = sizeof(*sin);
    146  #ifdef BSD4_4
    147                  sin->sin_len = sizeof(*sin);
    148  #endif
    149                  sin->sin_family = AF_INET;
    150                  sin->sin_port = sin6->sin6_port;
    151                  sin->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    152          }

into a code, where fetch for "sin6->sin6_port" is preceding to
structure copy "ss = bs".

This is apparently not what the author of this code intended.

However, I'm not sure whether this is a compiler bug, or a kind of
violation of strict aliasing rule.

Note that the emitted code is "fixed" if (1) -fno-strict-aliasing
option is added, or (2) the attached patch is applied.

Thoughts?

Thanks,
rin
----
Index: t_tcp.c
===================================================================
RCS file: /home/netbsd/src/tests/net/net/t_tcp.c,v
retrieving revision 1.11
diff -p -u -r1.11 t_tcp.c
--- t_tcp.c	26 Oct 2019 23:08:27 -0000	1.11
+++ t_tcp.c	4 Nov 2021 09:35:30 -0000
@@ -139,15 +139,14 @@ accept_test(sa_family_t sfamily, sa_fami
  		FAIL("socket");
  
  	if (sfamily == AF_INET6 && cfamily == AF_INET) {
-		ss = bs;
-		sin6 = (void *)&ss;
+		in_port_t port = ((struct sockaddr_in6 *)&bs)->sin6_port;
  		sin = (void *)&bs;
  		addrlen = sizeof(*sin);
  #ifdef BSD4_4
  		sin->sin_len = sizeof(*sin);
  #endif
  		sin->sin_family = AF_INET;
-		sin->sin_port = sin6->sin6_port;
+		sin->sin_port = port;
  		sin->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
  	}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.