mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
socket: Use may_alias on sockaddr structs (bug 19622)
This supports common coding patterns. The GCC C front end before version 7 rejects the may_alias attribute on a struct definition if it was not present in a previous forward declaration, so this attribute can only be conditionally applied. This implements the spirit of the change in Austin Group issue 1641. Suggested-by: Marek Polacek <polacek@redhat.com> Suggested-by: Jakub Jelinek <jakub@redhat.com> Reviewed-by: Sam James <sam@gentoo.org> Reviewed-by: Carlos O'Donell <carlos@redhat.com>
This commit is contained in:
parent
2a99e2398d
commit
8d7b6b4cb2
@ -149,7 +149,7 @@ enum __socket_type
|
|||||||
#include <bits/sockaddr.h>
|
#include <bits/sockaddr.h>
|
||||||
|
|
||||||
/* Structure describing a generic socket address. */
|
/* Structure describing a generic socket address. */
|
||||||
struct sockaddr
|
struct __attribute_struct_may_alias__ sockaddr
|
||||||
{
|
{
|
||||||
__SOCKADDR_COMMON (sa_); /* Common data: address family and length. */
|
__SOCKADDR_COMMON (sa_); /* Common data: address family and length. */
|
||||||
char sa_data[14]; /* Address data. */
|
char sa_data[14]; /* Address data. */
|
||||||
@ -166,7 +166,7 @@ struct sockaddr
|
|||||||
#define _SS_PADSIZE \
|
#define _SS_PADSIZE \
|
||||||
(_SS_SIZE - __SOCKADDR_COMMON_SIZE - sizeof (__ss_aligntype))
|
(_SS_SIZE - __SOCKADDR_COMMON_SIZE - sizeof (__ss_aligntype))
|
||||||
|
|
||||||
struct sockaddr_storage
|
struct __attribute_struct_may_alias__ sockaddr_storage
|
||||||
{
|
{
|
||||||
__SOCKADDR_COMMON (ss_); /* Address family, etc. */
|
__SOCKADDR_COMMON (ss_); /* Address family, etc. */
|
||||||
char __ss_padding[_SS_PADSIZE];
|
char __ss_padding[_SS_PADSIZE];
|
||||||
|
@ -244,7 +244,7 @@ extern const struct in6_addr in6addr_loopback; /* ::1 */
|
|||||||
|
|
||||||
|
|
||||||
/* Structure describing an Internet socket address. */
|
/* Structure describing an Internet socket address. */
|
||||||
struct sockaddr_in
|
struct __attribute_struct_may_alias__ sockaddr_in
|
||||||
{
|
{
|
||||||
__SOCKADDR_COMMON (sin_);
|
__SOCKADDR_COMMON (sin_);
|
||||||
in_port_t sin_port; /* Port number. */
|
in_port_t sin_port; /* Port number. */
|
||||||
@ -257,9 +257,11 @@ struct sockaddr_in
|
|||||||
- sizeof (struct in_addr)];
|
- sizeof (struct in_addr)];
|
||||||
};
|
};
|
||||||
|
|
||||||
#if !__USE_KERNEL_IPV6_DEFS
|
#if __USE_KERNEL_IPV6_DEFS
|
||||||
|
struct __attribute_struct_may_alias__ sockaddr_in6;
|
||||||
|
#else
|
||||||
/* Ditto, for IPv6. */
|
/* Ditto, for IPv6. */
|
||||||
struct sockaddr_in6
|
struct __attribute_struct_may_alias__ sockaddr_in6
|
||||||
{
|
{
|
||||||
__SOCKADDR_COMMON (sin6_);
|
__SOCKADDR_COMMON (sin6_);
|
||||||
in_port_t sin6_port; /* Transport layer port # */
|
in_port_t sin6_port; /* Transport layer port # */
|
||||||
|
@ -874,4 +874,13 @@ _Static_assert (0, "IEEE 128-bits long double requires redirection on this platf
|
|||||||
# define __attribute_returns_twice__ /* Ignore. */
|
# define __attribute_returns_twice__ /* Ignore. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Mark struct types as aliasable. Restricted to compilers that
|
||||||
|
support forward declarations of structs in the presence of the
|
||||||
|
attribute. */
|
||||||
|
#if __GNUC_PREREQ (7, 1) || defined __clang__
|
||||||
|
# define __attribute_struct_may_alias__ __attribute__ ((__may_alias__))
|
||||||
|
#else
|
||||||
|
# define __attribute_struct_may_alias__
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* sys/cdefs.h */
|
#endif /* sys/cdefs.h */
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
|
|
||||||
/* Structure describing the address of an AF_LOCAL (aka AF_UNIX) socket. */
|
/* Structure describing the address of an AF_LOCAL (aka AF_UNIX) socket. */
|
||||||
struct sockaddr_un
|
struct __attribute_struct_may_alias__ sockaddr_un
|
||||||
{
|
{
|
||||||
__SOCKADDR_COMMON (sun_);
|
__SOCKADDR_COMMON (sun_);
|
||||||
char sun_path[108]; /* Path name. */
|
char sun_path[108]; /* Path name. */
|
||||||
|
@ -153,7 +153,7 @@ enum __socket_type
|
|||||||
#include <bits/sockaddr.h>
|
#include <bits/sockaddr.h>
|
||||||
|
|
||||||
/* Structure describing a generic socket address. */
|
/* Structure describing a generic socket address. */
|
||||||
struct sockaddr
|
struct __attribute_struct_may_alias__ sockaddr
|
||||||
{
|
{
|
||||||
__SOCKADDR_COMMON (sa_); /* Common data: address family and length. */
|
__SOCKADDR_COMMON (sa_); /* Common data: address family and length. */
|
||||||
char sa_data[14]; /* Address data. */
|
char sa_data[14]; /* Address data. */
|
||||||
@ -170,7 +170,7 @@ struct sockaddr
|
|||||||
#define _SS_PADSIZE \
|
#define _SS_PADSIZE \
|
||||||
(_SS_SIZE - __SOCKADDR_COMMON_SIZE - sizeof (__ss_aligntype))
|
(_SS_SIZE - __SOCKADDR_COMMON_SIZE - sizeof (__ss_aligntype))
|
||||||
|
|
||||||
struct sockaddr_storage
|
struct __attribute_struct_may_alias__ sockaddr_storage
|
||||||
{
|
{
|
||||||
__SOCKADDR_COMMON (ss_); /* Address family, etc. */
|
__SOCKADDR_COMMON (ss_); /* Address family, etc. */
|
||||||
char __ss_padding[_SS_PADSIZE];
|
char __ss_padding[_SS_PADSIZE];
|
||||||
|
@ -181,7 +181,7 @@ typedef __socklen_t socklen_t;
|
|||||||
#include <bits/sockaddr.h>
|
#include <bits/sockaddr.h>
|
||||||
|
|
||||||
/* Structure describing a generic socket address. */
|
/* Structure describing a generic socket address. */
|
||||||
struct sockaddr
|
struct __attribute_struct_may_alias__ sockaddr
|
||||||
{
|
{
|
||||||
__SOCKADDR_COMMON (sa_); /* Common data: address family and length. */
|
__SOCKADDR_COMMON (sa_); /* Common data: address family and length. */
|
||||||
char sa_data[14]; /* Address data. */
|
char sa_data[14]; /* Address data. */
|
||||||
@ -194,7 +194,7 @@ struct sockaddr
|
|||||||
#define _SS_PADSIZE \
|
#define _SS_PADSIZE \
|
||||||
(_SS_SIZE - __SOCKADDR_COMMON_SIZE - sizeof (__ss_aligntype))
|
(_SS_SIZE - __SOCKADDR_COMMON_SIZE - sizeof (__ss_aligntype))
|
||||||
|
|
||||||
struct sockaddr_storage
|
struct __attribute_struct_may_alias__ sockaddr_storage
|
||||||
{
|
{
|
||||||
__SOCKADDR_COMMON (ss_); /* Address family, etc. */
|
__SOCKADDR_COMMON (ss_); /* Address family, etc. */
|
||||||
char __ss_padding[_SS_PADSIZE];
|
char __ss_padding[_SS_PADSIZE];
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
From Linux 2.1 the AF_PACKET interface is preferred and you should
|
From Linux 2.1 the AF_PACKET interface is preferred and you should
|
||||||
consider using it in place of this one. */
|
consider using it in place of this one. */
|
||||||
|
|
||||||
struct sockaddr_pkt
|
struct __attribute_struct_may_alias__ sockaddr_pkt
|
||||||
{
|
{
|
||||||
__SOCKADDR_COMMON (spkt_);
|
__SOCKADDR_COMMON (spkt_);
|
||||||
unsigned char spkt_device[14];
|
unsigned char spkt_device[14];
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
#include <features.h>
|
#include <features.h>
|
||||||
#include <bits/sockaddr.h>
|
#include <bits/sockaddr.h>
|
||||||
|
|
||||||
struct sockaddr_ash
|
struct __attribute_struct_may_alias__ sockaddr_ash
|
||||||
{
|
{
|
||||||
__SOCKADDR_COMMON (sash_); /* Common data: address family etc. */
|
__SOCKADDR_COMMON (sash_); /* Common data: address family etc. */
|
||||||
int sash_ifindex; /* Interface to use. */
|
int sash_ifindex; /* Interface to use. */
|
||||||
|
@ -28,7 +28,7 @@ struct ec_addr
|
|||||||
unsigned char net; /* Network number. */
|
unsigned char net; /* Network number. */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sockaddr_ec
|
struct __attribute_struct_may_alias__ sockaddr_ec
|
||||||
{
|
{
|
||||||
__SOCKADDR_COMMON (sec_);
|
__SOCKADDR_COMMON (sec_);
|
||||||
unsigned char port; /* Port number. */
|
unsigned char port; /* Port number. */
|
||||||
|
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
__BEGIN_DECLS
|
__BEGIN_DECLS
|
||||||
|
|
||||||
struct sockaddr_iucv
|
struct __attribute_struct_may_alias__ sockaddr_iucv
|
||||||
{
|
{
|
||||||
__SOCKADDR_COMMON (siucv_);
|
__SOCKADDR_COMMON (siucv_);
|
||||||
unsigned short siucv_port; /* Reserved */
|
unsigned short siucv_port; /* Reserved */
|
||||||
|
Loading…
Reference in New Issue
Block a user