public inbox for gcc-help@gcc.gnu.org
 help / color / mirror / Atom feed
From: Andrew Haley <aph-gcc@littlepinkcloud.COM>
To: Michael Haubenwallner <michael.haubenwallner@salomon.at>
Cc: gcc-help@gcc.gnu.org
Subject: Re: ignore that strict-aliasing warning ?
Date: Fri, 19 Oct 2007 02:54:00 -0000	[thread overview]
Message-ID: <18199.14807.784370.382284@zebedee.pink> (raw)
In-Reply-To: <1192695762.13354.50.camel@sapc154>

Michael Haubenwallner writes:

 > $ cat test.c
 > /* 1*/ extern void allocate(int size, void** p);
 > /* 2*/
 > /* 3*/ typedef struct X {
 > /* 4*/     char A;
 > /* 5*/ } X;
 > /* 6*/
 > /* 7*/ X* test1(void)
 > /* 8*/ {
 > /* 9*/     X *x;
 > /*10*/     allocate((int)sizeof(X), (void**)&x);   /* current code */
 > /*11*/     allocate((int)sizeof(X), &x);           /* as older gcc warned here already */
 > /*12*/     return x;
 > /*13*/ }
 > /*14*/
 > /*15*/ X* test2(void)
 > /*16*/ {
 > /*17*/     union {
 > /*18*/         X *x;
 > /*19*/         void* v;
 > /*20*/     } u;
 > /*21*/     allocate((int)sizeof(X), &u.v);
 > /*22*/     allocate((int)sizeof(X), (void**)&u);
 > /*23*/     return u.x;
 > /*24*/ }
 > $ gcc -Wall -O2 -c test.c -Wstrict-aliasing=2
 > test.c: In function 'test1':
 > test.c:10: warning: dereferencing type-punned pointer will break strict-aliasing rules
 > test.c:11: warning: passing argument 2 of 'allocate' from incompatible pointer type
 > test.c: In function 'test2':
 > test.c:22: warning: dereferencing type-punned pointer might break strict-aliasing rules
 > 
 > Strange is that line 10 "will", but line 22 "might" break
 > strict-aliasing rules.

I don't see what's strange about it.  Assigning to u.v and then
converting the address of u to a void** is perfectly legal C.  It's a
pointless thing to do, though, and rather than this you might as well
do Line 21.

 > Do I really need the union here like in test2() and line 21 ?

There's no way for us to tell.

 > Or is there another "correct" way to get rid of warning in line 10 ?

If you could tell us what you're really trying to do we might be able
to help.  The code in Line 10 makes no sense at all: it has no
meaning, and can't possibly do anything useful.

The sensible way to do what you need is simply:

  void *p;
  allocate((int)sizeof(X), &p);
  X *x = (x*)p;

Andrew.

      reply	other threads:[~2007-10-18 10:48 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-10-18 10:22 Michael Haubenwallner
2007-10-19  2:54 ` Andrew Haley [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=18199.14807.784370.382284@zebedee.pink \
    --to=aph-gcc@littlepinkcloud.com \
    --cc=gcc-help@gcc.gnu.org \
    --cc=michael.haubenwallner@salomon.at \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).