Patchwork lib: fwts_hwinfo.c: Fix strict aliasing build failure on Lucid (LP: #1251587)

login
register
mail settings
Submitter Colin King
Date Nov. 15, 2013, 11:01 a.m.
Message ID <1384513275-17047-1-git-send-email-colin.king@canonical.com>
Download mbox | patch
Permalink /patch/291541/
State Accepted
Headers show

Comments

Colin King - Nov. 15, 2013, 11:01 a.m.
From: Colin Ian King <colin.king@canonical.com>

With gcc gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1) we are getting strict
aliasing warnings causing a build failure:

fwts_hwinfo.c: In function 'fwts_hwinfo_get':
fwts_hwinfo.c:418: error: dereferencing pointer '({anonymous})' does break strict-aliasing rules
fwts_hwinfo.c:418: note: initialized from here
make[5]: *** [fwts_hwinfo.lo] Error 1

This patch works around this issue.  Fromw what I understand, gcc 4.4.x was
rather (too?) strict on this kind of warning.

Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 src/lib/src/fwts_hwinfo.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
Alex Hung - Nov. 27, 2013, 2:51 a.m.
On 11/15/2013 07:01 PM, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
>
> With gcc gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1) we are getting strict
> aliasing warnings causing a build failure:
>
> fwts_hwinfo.c: In function 'fwts_hwinfo_get':
> fwts_hwinfo.c:418: error: dereferencing pointer '({anonymous})' does break strict-aliasing rules
> fwts_hwinfo.c:418: note: initialized from here
> make[5]: *** [fwts_hwinfo.lo] Error 1
>
> This patch works around this issue.  Fromw what I understand, gcc 4.4.x was
> rather (too?) strict on this kind of warning.
>
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>   src/lib/src/fwts_hwinfo.c | 5 ++++-
>   1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/src/lib/src/fwts_hwinfo.c b/src/lib/src/fwts_hwinfo.c
> index cb70f98..e3a9d2e 100644
> --- a/src/lib/src/fwts_hwinfo.c
> +++ b/src/lib/src/fwts_hwinfo.c
> @@ -382,6 +382,7 @@ static int fwts_hwinfo_net_get(
>
>   	while ((d = readdir(dp)) != NULL) {
>   		struct	ifreq buf;
> +		struct in_addr in_addr;
>   		fwts_net_config *net_config;
>
>   		if (d->d_name[0] == '.')
> @@ -415,7 +416,9 @@ static int fwts_hwinfo_net_get(
>   			if (errno != EADDRNOTAVAIL)
>   				fwts_log_error(fw, "Cannot get address for device %s.", d->d_name);
>   		}
> -		net_config->addr = strdup(inet_ntoa(((struct sockaddr_in *)&buf.ifr_addr)->sin_addr));
> +		/* GCC 4.4 is rather overly pedantic in strict aliasing warnings, this avoids it */
> +		in_addr = (struct in_addr)((struct sockaddr_in *)&buf.ifr_addr)->sin_addr;
> +		net_config->addr = strdup(inet_ntoa(in_addr));
>   		if (net_config->addr == NULL) {
>   			fwts_log_error(fw, "Cannot allocate net config H/W address.");
>   			fwts_hwinfo_net_free(net_config);
>

Acked-by: Alex Hung <alex.hung@canonical.com>
Ivan Hu - Nov. 29, 2013, 3:54 a.m.
On 11/15/2013 07:01 PM, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
>
> With gcc gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1) we are getting strict
> aliasing warnings causing a build failure:
>
> fwts_hwinfo.c: In function 'fwts_hwinfo_get':
> fwts_hwinfo.c:418: error: dereferencing pointer '({anonymous})' does break strict-aliasing rules
> fwts_hwinfo.c:418: note: initialized from here
> make[5]: *** [fwts_hwinfo.lo] Error 1
>
> This patch works around this issue.  Fromw what I understand, gcc 4.4.x was
> rather (too?) strict on this kind of warning.
>
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>   src/lib/src/fwts_hwinfo.c | 5 ++++-
>   1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/src/lib/src/fwts_hwinfo.c b/src/lib/src/fwts_hwinfo.c
> index cb70f98..e3a9d2e 100644
> --- a/src/lib/src/fwts_hwinfo.c
> +++ b/src/lib/src/fwts_hwinfo.c
> @@ -382,6 +382,7 @@ static int fwts_hwinfo_net_get(
>
>   	while ((d = readdir(dp)) != NULL) {
>   		struct	ifreq buf;
> +		struct in_addr in_addr;
>   		fwts_net_config *net_config;
>
>   		if (d->d_name[0] == '.')
> @@ -415,7 +416,9 @@ static int fwts_hwinfo_net_get(
>   			if (errno != EADDRNOTAVAIL)
>   				fwts_log_error(fw, "Cannot get address for device %s.", d->d_name);
>   		}
> -		net_config->addr = strdup(inet_ntoa(((struct sockaddr_in *)&buf.ifr_addr)->sin_addr));
> +		/* GCC 4.4 is rather overly pedantic in strict aliasing warnings, this avoids it */
> +		in_addr = (struct in_addr)((struct sockaddr_in *)&buf.ifr_addr)->sin_addr;
> +		net_config->addr = strdup(inet_ntoa(in_addr));
>   		if (net_config->addr == NULL) {
>   			fwts_log_error(fw, "Cannot allocate net config H/W address.");
>   			fwts_hwinfo_net_free(net_config);
>

Acked-by: Ivan Hu <ivan.hu@canonical.com>

Patch

diff --git a/src/lib/src/fwts_hwinfo.c b/src/lib/src/fwts_hwinfo.c
index cb70f98..e3a9d2e 100644
--- a/src/lib/src/fwts_hwinfo.c
+++ b/src/lib/src/fwts_hwinfo.c
@@ -382,6 +382,7 @@  static int fwts_hwinfo_net_get(
 
 	while ((d = readdir(dp)) != NULL) {
 		struct	ifreq buf;
+		struct in_addr in_addr;
 		fwts_net_config *net_config;
 
 		if (d->d_name[0] == '.')
@@ -415,7 +416,9 @@  static int fwts_hwinfo_net_get(
 			if (errno != EADDRNOTAVAIL)
 				fwts_log_error(fw, "Cannot get address for device %s.", d->d_name);
 		}
-		net_config->addr = strdup(inet_ntoa(((struct sockaddr_in *)&buf.ifr_addr)->sin_addr));
+		/* GCC 4.4 is rather overly pedantic in strict aliasing warnings, this avoids it */
+		in_addr = (struct in_addr)((struct sockaddr_in *)&buf.ifr_addr)->sin_addr;
+		net_config->addr = strdup(inet_ntoa(in_addr));
 		if (net_config->addr == NULL) {
 			fwts_log_error(fw, "Cannot allocate net config H/W address.");
 			fwts_hwinfo_net_free(net_config);