classpath-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cp-patches] [RFC][PATCH] don't break strict-aliasing rules


From: Giuseppe Scrivano
Subject: [cp-patches] [RFC][PATCH] don't break strict-aliasing rules
Date: Sun, 14 Feb 2010 19:44:19 +0100
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.1.92 (gnu/linux)

Hello,

I tried to build the last revision from CVS and I got this error:

gnu_java_nio_VMChannel.c: In function ‘Java_gnu_java_nio_VMChannel_receive’:
gnu_java_nio_VMChannel.c:812: error: dereferencing pointer ‘sockaddr’
does break strict-aliasing rules
gnu_java_nio_VMChannel.c:804: error: dereferencing pointer ‘sockaddr’
does break strict-aliasing rules

This is the gcc version I am using:

$ gcc --version
gcc (Debian 4.4.2-9) 4.4.3 20100108 (prerelease)


I am not sure this is the proper way to fix it, it looks to me like a
hack but I don't know a better way to do it, any comment?


Cheers,
Giuseppe


+2010-02-14  Giuseppe Scrivano  <address@hidden>
+
+       * native/jni/java-nio/gnu_java_nio_VMChannel.c
+       (Java_gnu_java_nio_VMChannel_getpeername): Change type of
+       `sock_storage' to char[].
+       (Java_gnu_java_nio_VMChannel_getsockname): Likewise.
+       (Java_gnu_java_nio_VMChannel_receive): Likewise.
+
 2010-01-15  Rainer Orth  <address@hidden>
 
        PR libgcj/38251
Index: native/jni/java-nio/gnu_java_nio_VMChannel.c
===================================================================
RCS file: 
/sources/classpath/classpath/native/jni/java-nio/gnu_java_nio_VMChannel.c,v
retrieving revision 1.22
diff -u -r1.22 gnu_java_nio_VMChannel.c
--- native/jni/java-nio/gnu_java_nio_VMChannel.c        28 Dec 2007 17:49:56 
-0000      1.22
+++ native/jni/java-nio/gnu_java_nio_VMChannel.c        14 Feb 2010 17:11:08 
-0000
@@ -758,11 +758,11 @@
   char *addrPortPtr = (*env)->GetDirectBufferAddress (env, addrPort);
   struct JCL_buffer buf;
 #ifdef HAVE_INET6
-  struct sockaddr_in6 sock_storage;
   struct sockaddr_in6 *sock6;
+  char sock_storage[sizeof (struct sockaddr_in6)];
   socklen_t slen = sizeof (struct sockaddr_in6);
 #else
-  struct sockaddr_in sock_storage;
+  char sock_storage[sizeof (struct sockaddr_in)];
   socklen_t slen = sizeof (struct sockaddr_in);
 #endif /* HAVE_INET6 */
   struct sockaddr *sockaddr = (struct sockaddr *) &sock_storage;
@@ -1360,10 +1360,10 @@
 #ifdef HAVE_GETSOCKNAME
 #ifdef HAVE_INET6
   struct sockaddr_in6 *addr6;
-  struct sockaddr_in6 sock_storage;
+  char sock_storage[sizeof (struct sockaddr_in6)];
   socklen_t socklen = sizeof (struct sockaddr_in6);
 #else
-  struct sockaddr_in sock_storage;
+  char sock_storage[sizeof (struct sockaddr_in)];
   socklen_t socklen = sizeof (struct sockaddr_in);
 #endif /* HAVE_INET6 */
 
@@ -1420,10 +1420,11 @@
 #ifdef HAVE_GETPEERNAME
 #ifdef HAVE_INET6
   struct sockaddr_in6 *addr6;
-  struct sockaddr_in6 sock_storage;
+  /*  struct sockaddr_in6 sock_storage;*/
+  char sock_storage[sizeof (struct sockaddr_in6)];
   socklen_t socklen = sizeof (struct sockaddr_in6);
 #else
-  struct sockaddr_in sock_storage;
+  char sock_storage[sizeof (struct sockaddr_in)];
   socklen_t socklen = sizeof (struct sockaddr_in);
 #endif /* HAVE_INET6 */
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]