public inbox for gcc-help@gcc.gnu.org
 help / color / mirror / Atom feed
* RE: Avoiding "assignment from incompatible pointer type" warning
@ 2002-10-21  7:04 Moore, Mathew L
  2002-10-21  7:17 ` Florian Weimer
  0 siblings, 1 reply; 19+ messages in thread
From: Moore, Mathew L @ 2002-10-21  7:04 UTC (permalink / raw)
  To: 'Florian Weimer', John Love-Jensen
  Cc: Claudio Bley, Joshua Nye, Steve Dondley, gcc-help

> 
> 6.3.2.3(7) only ensures that conforming implementations may not issue
> a diagnostic for such programming errors.
> 

To help expand my (very) limited knowledge, does this mean that 

	float f;
	int *p = (int*)&f;

may not work even if sizeof(float) == sizeof(int)?

Thanks,
--Matt

^ permalink raw reply	[flat|nested] 19+ messages in thread
* RE: Avoiding "assignment from incompatible pointer type" warning
@ 2002-10-21  6:07 Moore, Mathew L
  0 siblings, 0 replies; 19+ messages in thread
From: Moore, Mathew L @ 2002-10-21  6:07 UTC (permalink / raw)
  To: 'Claudio Bley', Florian Weimer
  Cc: Joshua Nye, Steve Dondley, gcc-help

Certainly it is legal as far as the standard is concerned,

"A pointer to an object or incomplete type may be converted to a pointer to
a different object or incomplete type."

However, it may not be safe,

"If the resulting pointer is not correctly aligned for the pointed-to type,
the behavior is undefined."

--Matt


> -----Original Message-----
> From: Claudio Bley [mailto:bley@cs.uni-magdeburg.de]
> Sent: Monday, October 21, 2002 07:22
> To: Florian Weimer
> Cc: Joshua Nye; Steve Dondley; gcc-help@gcc.gnu.org
> Subject: Re: Avoiding "assignment from incompatible pointer type"
> warning
> 
> 
> >>>>> "Florian" == Florian Weimer <fw@deneb.enyo.de> writes:
> 
>     Florian> "Joshua Nye" <josh@boxcarmedia.com> writes:
>     >>> > int *p; 
>     >>> > float g = 3.141592653589793238;
>     >>> > p = (int *)&g;
>     >>> 
>     >>> Is this code legal?  I doubt it.
>     >>> 
>     >>  What do you consider legal and why wouldn't it be?
> 
>     Florian> Casting a pointer from float to int can result in
>     Florian> undefined behavior on some implementations.
> 
> I can't see why. Can you elaborate on that? I mean, casting on the
> machine code level does just nothing - it's just "syntactic sugar" to
> convince the compiler to be quiet. I think casting from one pointer
> type to another does no harm at all. Am I wrong?
> 
> -- 
> Claudio Bley                                 ASCII ribbon campaign (")
> Debian GNU/Linux advocate                     - against HTML email  X 
> http://www.cs.uni-magdeburg.de/~bley/                     & vCards / \
> 

^ permalink raw reply	[flat|nested] 19+ messages in thread
* RE: Avoiding "assignment from incompatible pointer type" warning
@ 2002-10-13 13:37 Moore, Mathew L
  2002-10-13 15:10 ` Florian Weimer
  0 siblings, 1 reply; 19+ messages in thread
From: Moore, Mathew L @ 2002-10-13 13:37 UTC (permalink / raw)
  To: 'Steve Dondley', gcc-help

You can always use a void pointer,

  const float x = 2.0625;
  const void *p = &x;
  const int *lp = p;

but explicit casting works just as well.

While we are on this topic, is there a portable way to perform the bit-wise
examination of a floating point variable?  What about for an implementation
where sizeof(float) != sizeof(int) (or sizeof(long), etc.).  Is there
something significantly wrong about doing the following?  Will gcc even
allow this?

  union {
    float x;
    char b[sizeof(float)];
  } u;
  u.x = 2.0625;
  /* Access bytes/bits through u.b[0], u.b[1], ..., u.b[sizeof(float)-1] */


Thanks,
--Matt



> -----Original Message-----
> From: Steve Dondley [mailto:s@dondley.com]
> Sent: Sunday, October 13, 2002 12:13
> To: gcc-help@gcc.gnu.org
> Subject: Avoiding "assignment from incompatible pointer type" warning
> 
> 
> Hi,
> 
> I've written a simple program that print out each bit of a 
> floating point
> variable so I can learn how floating point numbers are represented in
> memory.  The program contains the following statements:
> 
> int *p;
> float g = 2.0625;
> p = &g;
> 
> The third statement above generates an "assignment from 
> incompatible pointer
> type" warning for obvious reasons.  Other than this, the 
> program compiles
> fine and works.
> 
> My question is:  Is there a way to properly assign a pointer 
> of one type to
> a variable of different type so that the warning is suppressed?
> 
> Thanks again.
> 
> 

^ permalink raw reply	[flat|nested] 19+ messages in thread
* Avoiding "assignment from incompatible pointer type" warning
@ 2002-10-13  9:08 Steve Dondley
  2002-10-13  9:28 ` Joshua Nye
  0 siblings, 1 reply; 19+ messages in thread
From: Steve Dondley @ 2002-10-13  9:08 UTC (permalink / raw)
  To: gcc-help

Hi,

I've written a simple program that print out each bit of a floating point
variable so I can learn how floating point numbers are represented in
memory.  The program contains the following statements:

int *p;
float g = 2.0625;
p = &g;

The third statement above generates an "assignment from incompatible pointer
type" warning for obvious reasons.  Other than this, the program compiles
fine and works.

My question is:  Is there a way to properly assign a pointer of one type to
a variable of different type so that the warning is suppressed?

Thanks again.


^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2002-10-21 14:43 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-10-21  7:04 Avoiding "assignment from incompatible pointer type" warning Moore, Mathew L
2002-10-21  7:17 ` Florian Weimer
2002-10-21  7:43   ` John Love-Jensen
  -- strict thread matches above, loose matches on Subject: below --
2002-10-21  6:07 Moore, Mathew L
2002-10-13 13:37 Moore, Mathew L
2002-10-13 15:10 ` Florian Weimer
2002-10-13  9:08 Steve Dondley
2002-10-13  9:28 ` Joshua Nye
2002-10-13  9:34   ` Steve Dondley
2002-10-13 15:09   ` Florian Weimer
2002-10-13 15:19     ` Joshua Nye
2002-10-15 11:24     ` Joshua Nye
2002-10-21  3:12       ` Florian Weimer
2002-10-21  4:22         ` Claudio Bley
2002-10-21  4:30           ` Florian Weimer
2002-10-21  6:48             ` Claudio Bley
2002-10-21  4:42           ` Sebastian Huber
2002-10-21  6:43           ` John Love-Jensen
2002-10-21  6:52             ` Florian Weimer

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).