* ISO Aliasing rules question
@ 2003-02-21 17:18 law
2003-02-21 19:16 ` Mark Mitchell
` (2 more replies)
0 siblings, 3 replies; 17+ messages in thread
From: law @ 2003-02-21 17:18 UTC (permalink / raw)
To: gcc
Given this testcase:
struct s1 { double d; };
struct s2 { double d; };
double f(struct s1 *a, struct s2 *b)
{
a->d = 1.0;
return b->d + 1.0;
}
int main()
{
struct s1 a;
a.d = 0.0;
if (f (&a, (struct s2 *)&a) != 2.0)
abort ();
return 0;
}
Does this code produce undefined behavior according to ISO standard,
particularly in regards to aliasing issues.
My recollection of the standard is that struct s1 and struct s2 are
_NOT_ type compatible (even though they have identical internal structure).
Thus the variables a & b in function f can't refer to the same object
as they are not type compatible. Thus the compiler should be free to
ignore the assignment a->d = 1.0 when evaluating return b->d + 1.0
(which is precisely what the tree-ssa branch does :-)
Is this correct? Or is my recollection of the ISO standard incorrect here?
Jeff
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: ISO Aliasing rules question
2003-02-21 17:18 ISO Aliasing rules question law
@ 2003-02-21 19:16 ` Mark Mitchell
2003-02-21 19:38 ` law
2003-02-21 20:01 ` Michael Matz
2003-02-21 19:33 ` Michael Matz
2003-02-27 18:47 ` David Carlton
2 siblings, 2 replies; 17+ messages in thread
From: Mark Mitchell @ 2003-02-21 19:16 UTC (permalink / raw)
To: law, gcc
--On Friday, February 21, 2003 10:16:02 AM -0700 "law@redhat.com"
<law@redhat.com> wrote:
> Is this correct? Or is my recollection of the ISO standard incorrect
> here?
This is tricky. In general, you're right -- the structure of the type
doesn't matter, only the name.
But, then there's the "common initial sequence" stuff -- which doesn't
apply in your example, but can in other palces. See 6.5.2.3 in your C99
standard for details.
Bottom line: the optimization in the code you showed is correct.
--
Mark Mitchell mark@codesourcery.com
CodeSourcery, LLC http://www.codesourcery.com
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: ISO Aliasing rules question
2003-02-21 17:18 ISO Aliasing rules question law
2003-02-21 19:16 ` Mark Mitchell
@ 2003-02-21 19:33 ` Michael Matz
2003-02-22 0:53 ` Joseph S. Myers
2003-02-27 18:47 ` David Carlton
2 siblings, 1 reply; 17+ messages in thread
From: Michael Matz @ 2003-02-21 19:33 UTC (permalink / raw)
To: law; +Cc: gcc
Hi,
On Fri, 21 Feb 2003 law@redhat.com wrote:
> struct s1 { double d; };
> struct s2 { double d; };
>
> double f(struct s1 *a, struct s2 *b)
> {
> a->d = 1.0;
> return b->d + 1.0;
> }
>
> int main()
> {
> struct s1 a;
> a.d = 0.0;
> if (f (&a, (struct s2 *)&a) != 2.0)
> abort ();
> return 0;
> }
>
>
> Does this code produce undefined behavior according to ISO standard,
> particularly in regards to aliasing issues.
I asked myself also repeatedly similar things. Is 'a->d' a whole object
or not? If yes, then 'a->d' and 'b->d' alias because they have the same
type. I not, i.e. they are only part of the objects *a and *b, then they
can not alias, because as you notice 'struct s1' and 'struct s2' are not
compatible types as defined in 6.2.7 #1.
> Thus the variables a & b in function f can't refer to the same object
> as they are not type compatible.
Well, the aliasing rules only constrain how you can _access_ the storage,
not how many and which references you can have to it. I.e. a and b are
allowed to refer to the same storage, just the access later would be
non-conforming. But the basic question is, if a->b constitutes an access
to a 'double' object, or to a 'struct s1.double' object. And about that I
wondered too repeatedly ;-) 6.5.2.3 says the type of an 's->x' expression
is that of member 'x' (with added qualification), so I guess, that a->b
and b->d _do_ alias each other (both types are double).
Ciao,
Michael.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: ISO Aliasing rules question
2003-02-21 19:16 ` Mark Mitchell
@ 2003-02-21 19:38 ` law
2003-02-21 20:03 ` Mark Mitchell
2003-02-21 20:01 ` Michael Matz
1 sibling, 1 reply; 17+ messages in thread
From: law @ 2003-02-21 19:38 UTC (permalink / raw)
To: Mark Mitchell; +Cc: gcc
In message <75590000.1045854544@warlock.codesourcery.com>, Mark Mitchell writes
:
>
>
>--On Friday, February 21, 2003 10:16:02 AM -0700 "law@redhat.com"
><law@redhat.com> wrote:
>
>> Is this correct? Or is my recollection of the ISO standard incorrect
>> here?
>
>This is tricky. In general, you're right -- the structure of the type
>doesn't matter, only the name.
>
>But, then there's the "common initial sequence" stuff -- which doesn't
>apply in your example, but can in other palces. See 6.5.2.3 in your C99
>standard for details.
Understood. However, those cases are caught by the subset/superset
relationships we build in alias.c.
In the testcase I showed we effectively have the following alias sets
struct s1 struct s2
| |
double double
s1 is not a superset of s2 and s2 is not a superset of s2. Thus according
to our alias code objects of type s1 and type s2 will never conflict, even
though they have members of the same type.
Anyway, I'm just trying to make sure that
a. I understand this case correctly.
b. Our aliasing code does the right thing.
c. Our testsuite doesn't have tests with undefined behavior :-)
(that test is execute/20000603-1.c).
>Bottom line: the optimization in the code you showed is correct.
Meaning that execute/20000603-1.c is a bogus test :-)
jeff
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: ISO Aliasing rules question
2003-02-21 19:16 ` Mark Mitchell
2003-02-21 19:38 ` law
@ 2003-02-21 20:01 ` Michael Matz
2003-02-21 20:17 ` Mark Mitchell
2003-02-22 1:22 ` Geoff Keating
1 sibling, 2 replies; 17+ messages in thread
From: Michael Matz @ 2003-02-21 20:01 UTC (permalink / raw)
To: Mark Mitchell; +Cc: law, gcc
Hi,
On Fri, 21 Feb 2003, Mark Mitchell wrote:
> This is tricky. In general, you're right -- the structure of the type
> doesn't matter, only the name.
Yes, but he's accessing a member, not the whole struct. And that access
has type 'double'. 6.5 #7 only speaks about accessing "an object". Is
somewhere defined, that a->d is not such an object, but merely a part of a
bigger one (and b->d too, so 6.5 #7 would apply to the whole struct, which
indeed can't alias).
Hmm, I can construct a funny example:
struct s1 {int i1, i2; };
struct s2 {int i1, i2; };
int g(struct s1 *a, struct s2* b);
int f()
{
struct s1 * p = malloc (sizeof (struct s1));
// P1
p->i1 = 2;
// P2
((struct s2 *)p)->i2 = 3;
// P3
g (p, (struct s2* )p);
}
As per 6.5 #4 (effective type of objects);
At P1 *p does not have an effective type yet. At P2 the object
'p->i1' does have effective type double. But what is the effective type
of *p? If you can answer that, then which type has *p at P3? I think
under this light it makes only sense to speak about the effective types of
the members. Hmm, what does that mean for aliasing of a and b int g()?
Ciao,
Michael.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: ISO Aliasing rules question
2003-02-21 19:38 ` law
@ 2003-02-21 20:03 ` Mark Mitchell
2003-02-21 20:10 ` Michael Matz
0 siblings, 1 reply; 17+ messages in thread
From: Mark Mitchell @ 2003-02-21 20:03 UTC (permalink / raw)
To: law; +Cc: gcc
> >Bottom line: the optimization in the code you showed is correct.
> Meaning that execute/20000603-1.c is a bogus test :-)
The key thing there is that b doesn't really point to an s2, so accesses
through it are invalid. Although I can't find the part of the standard
that says that any more!
The C++ standard has this language:
If a program attempts to access the stored value of an object through
an lvalue of other than one of the following types the behavior is
undefined25):
--the dynamic type of the object,
...
The problem here is that b doesn't have the dynamic type s2.
I think the C standard has similar language -- somewhere.
--
Mark Mitchell mark@codesourcery.com
CodeSourcery, LLC http://www.codesourcery.com
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: ISO Aliasing rules question
2003-02-21 20:03 ` Mark Mitchell
@ 2003-02-21 20:10 ` Michael Matz
0 siblings, 0 replies; 17+ messages in thread
From: Michael Matz @ 2003-02-21 20:10 UTC (permalink / raw)
To: Mark Mitchell; +Cc: law, gcc
Hi,
On Fri, 21 Feb 2003, Mark Mitchell wrote:
> The C++ standard has this language:
>
> If a program attempts to access the stored value of an object through
> an lvalue of other than one of the following types the behavior is
> undefined25):
>
> --the dynamic type of the object,
>
> ...
>
> The problem here is that b doesn't have the dynamic type s2.
>
> I think the C standard has similar language -- somewhere.
6.5 #6 defines effective type (that's the dynamic type of C++)
6.5 #7 defines the permitted accesses (the aliasing rules. similar to
C++, except it doesn't contain the base class case)
Ciao,
Michael.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: ISO Aliasing rules question
2003-02-21 20:01 ` Michael Matz
@ 2003-02-21 20:17 ` Mark Mitchell
2003-02-21 20:29 ` Michael Matz
2003-02-22 1:22 ` Geoff Keating
1 sibling, 1 reply; 17+ messages in thread
From: Mark Mitchell @ 2003-02-21 20:17 UTC (permalink / raw)
To: Michael Matz; +Cc: law, gcc
--On Friday, February 21, 2003 08:38:07 PM +0100 Michael Matz
<matz@suse.de> wrote:
> Yes, but he's accessing a member, not the whole struct. And that access
I'm pretty sure it's the pointer he's using that's the key.
If he wrote:
double *dp = (double*) b;
*dp = 1.0;
that would be fine, but saying b->d = 1.0 isn't.
--
Mark Mitchell mark@codesourcery.com
CodeSourcery, LLC http://www.codesourcery.com
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: ISO Aliasing rules question
2003-02-21 20:17 ` Mark Mitchell
@ 2003-02-21 20:29 ` Michael Matz
2003-02-21 21:26 ` Mark Mitchell
0 siblings, 1 reply; 17+ messages in thread
From: Michael Matz @ 2003-02-21 20:29 UTC (permalink / raw)
To: Mark Mitchell; +Cc: law, gcc
Hi,
On Fri, 21 Feb 2003, Mark Mitchell wrote:
> --On Friday, February 21, 2003 08:38:07 PM +0100 Michael Matz
> <matz@suse.de> wrote:
>
> > Yes, but he's accessing a member, not the whole struct. And that access
>
> I'm pretty sure it's the pointer he's using that's the key.
>
> If he wrote:
>
> double *dp = (double*) b;
>
> *dp = 1.0;
>
> that would be fine, but saying b->d = 1.0 isn't.
Hmm. How's that then:
double *dp = &(b->d);
*dp = 1.0;
This definitely is accessing a 'double' object, and aliases ergo with
a->d. In this regard I fail to see the difference between
"*dp = 1.0" and "b->d = 1.0". If there _is_ a difference it could only
result from types, and then only if there would be the concept of
subtypes, or tagged types, or however we call them. I.e. if
type(*dp) != type(b->d) would be true. I don't think this concept exists
in C. Hmm.
Ciao,
Michael.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: ISO Aliasing rules question
2003-02-21 20:29 ` Michael Matz
@ 2003-02-21 21:26 ` Mark Mitchell
0 siblings, 0 replies; 17+ messages in thread
From: Mark Mitchell @ 2003-02-21 21:26 UTC (permalink / raw)
To: Michael Matz; +Cc: law, gcc
--On Friday, February 21, 2003 09:20:32 PM +0100 Michael Matz
<matz@suse.de> wrote:
> Hi,
>
> On Fri, 21 Feb 2003, Mark Mitchell wrote:
>
>> --On Friday, February 21, 2003 08:38:07 PM +0100 Michael Matz
>> <matz@suse.de> wrote:
>>
>> > Yes, but he's accessing a member, not the whole struct. And that
>> > access
>>
>> I'm pretty sure it's the pointer he's using that's the key.
>>
>> If he wrote:
>>
>> double *dp = (double*) b;
>>
>> *dp = 1.0;
>>
>> that would be fine, but saying b->d = 1.0 isn't.
>
> Hmm. How's that then:
>
> double *dp = &(b->d);
> *dp = 1.0;
>
> This definitely is accessing a 'double' object, and aliases ergo with
> a->d. In this regard I fail to see the difference between
> "*dp = 1.0" and "b->d = 1.0".
The point is that "b" doesn't point to what you're claiming it does.
The model goes like this:
(1) When you see ->, check that the object on the left of the -> has
an effective type compatible with its static type. If not, blow up.
(2) Having done that, access the data.
You're reversing the two steps, in some sense.
Another way to say this is that "x->y" is really short-hand for "(*x).y".
The C++ stnadard explicitly says that the -> is just short-hand.
--
Mark Mitchell mark@codesourcery.com
CodeSourcery, LLC http://www.codesourcery.com
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: ISO Aliasing rules question
2003-02-21 19:33 ` Michael Matz
@ 2003-02-22 0:53 ` Joseph S. Myers
2003-02-24 21:37 ` law
0 siblings, 1 reply; 17+ messages in thread
From: Joseph S. Myers @ 2003-02-22 0:53 UTC (permalink / raw)
To: Michael Matz; +Cc: law, gcc
On Fri, 21 Feb 2003, Michael Matz wrote:
> Hi,
>
> On Fri, 21 Feb 2003 law@redhat.com wrote:
>
> > struct s1 { double d; };
> > struct s2 { double d; };
> >
> > double f(struct s1 *a, struct s2 *b)
> > {
> > a->d = 1.0;
> > return b->d + 1.0;
> > }
> >
> > int main()
> > {
> > struct s1 a;
> > a.d = 0.0;
> > if (f (&a, (struct s2 *)&a) != 2.0)
> > abort ();
> > return 0;
> > }
> >
> >
> > Does this code produce undefined behavior according to ISO standard,
> > particularly in regards to aliasing issues.
>
> I asked myself also repeatedly similar things. Is 'a->d' a whole object
> or not? If yes, then 'a->d' and 'b->d' alias because they have the same
> type. I not, i.e. they are only part of the objects *a and *b, then they
> can not alias, because as you notice 'struct s1' and 'struct s2' are not
> compatible types as defined in 6.2.7 #1.
The basic "what is an object?" question is discussed in Nick Maclaren's
discussion with a title something like that, posted to the WG14 reflector
some time ago, required reading for anyone contemplating such issues; ask
him for a copy if you don't have one.
In this case, a (in main) has declared type (so effective type) struct s1,
so _if_ the structure is the relevant object then access through the type
struct s2 would be undefined. But if you declared a as double, and then
cast &a to each pointer type, then I think all accesses in f would be
legitimate: an object of effective type double is accessed through
structure types with an element of that type.
DR#236 discusses some problems with the type-based aliasing rules that are
far from resolved. A proper resolution of such problems requires the
underlying issues with the concept of an object to be resolved first.
--
Joseph S. Myers
jsm28@cam.ac.uk
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: ISO Aliasing rules question
2003-02-21 20:01 ` Michael Matz
2003-02-21 20:17 ` Mark Mitchell
@ 2003-02-22 1:22 ` Geoff Keating
1 sibling, 0 replies; 17+ messages in thread
From: Geoff Keating @ 2003-02-22 1:22 UTC (permalink / raw)
To: Michael Matz; +Cc: law, gcc
Michael Matz <matz@suse.de> writes:
> Hi,
>
> On Fri, 21 Feb 2003, Mark Mitchell wrote:
>
> > This is tricky. In general, you're right -- the structure of the type
> > doesn't matter, only the name.
>
> Yes, but he's accessing a member, not the whole struct. And that access
> has type 'double'. 6.5 #7 only speaks about accessing "an object". Is
> somewhere defined, that a->d is not such an object, but merely a part of a
> bigger one (and b->d too, so 6.5 #7 would apply to the whole struct, which
> indeed can't alias).
Yes, both '*a' and 'a->d' are objects. When you write '(*a).d', you
access *a then you access d, and 'a->d' is the same as '(*a).d'.
> Hmm, I can construct a funny example:
>
> struct s1 {int i1, i2; };
> struct s2 {int i1, i2; };
> int g(struct s1 *a, struct s2* b);
> int f()
> {
> struct s1 * p = malloc (sizeof (struct s1));
> // P1
> p->i1 = 2;
> // P2
> ((struct s2 *)p)->i2 = 3;
> // P3
> g (p, (struct s2* )p);
> }
>
> As per 6.5 #4 (effective type of objects);
> At P1 *p does not have an effective type yet. At P2 the object
> 'p->i1' does have effective type double. But what is the effective type
> of *p?
It's 'struct s1'. "If a value is stored into an object ... the type
of the lvalue becomes the effective type of the object ... for
subsequent accesses that do not modify the stored value."
> If you can answer that, then which type has *p at P3?
At P3, it has 'struct s2': "for all other accesses, the effective
type... is the type used". (The sentence I quoted earlier don't apply
because this is an access which does "modify the stored value" of *p.)
--
- Geoffrey Keating <geoffk@geoffk.org>
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: ISO Aliasing rules question
2003-02-22 0:53 ` Joseph S. Myers
@ 2003-02-24 21:37 ` law
2003-02-24 23:13 ` Joseph S. Myers
` (2 more replies)
0 siblings, 3 replies; 17+ messages in thread
From: law @ 2003-02-24 21:37 UTC (permalink / raw)
To: Joseph S. Myers; +Cc: Michael Matz, gcc
In message <Pine.LNX.4.33.0302220019400.4365-100000@kern.srcf.societies.cam.ac.
uk>, "Joseph S. Myers" writes:
>> I asked myself also repeatedly similar things. Is 'a->d' a whole object
>> or not? If yes, then 'a->d' and 'b->d' alias because they have the same
>> type. I not, i.e. they are only part of the objects *a and *b, then they
>> can not alias, because as you notice 'struct s1' and 'struct s2' are not
>> compatible types as defined in 6.2.7 #1.
>
>The basic "what is an object?" question is discussed in Nick Maclaren's
>discussion with a title something like that, posted to the WG14 reflector
>some time ago, required reading for anyone contemplating such issues; ask
>him for a copy if you don't have one.
Do you have a contact address for Nick? I wandered
http://std.dkuug.dk/jtc1/sc22/wg14
But couldn't find a reference to that paper.
>In this case, a (in main) has declared type (so effective type) struct s1,
>so _if_ the structure is the relevant object then access through the type
>struct s2 would be undefined. But if you declared a as double, and then
>cast &a to each pointer type, then I think all accesses in f would be
>legitimate: an object of effective type double is accessed through
>structure types with an element of that type.
But in "f" we have the following
a->d = 1.0
return b->d + 1.0;
According to an earlier message, that is just "shorthand" for:
(*a).d = 1.0
return (*b).d + 1.0
Which seems to me to clearly access "a" and "b" first, then their
appropriate field, which it would seem to me to run afoul of the
aliasing rules.
FWIW, the tree-ssa code uses the model above. First you indirect the
pointer, then you look at the appropriate field.
>DR#236 discusses some problems with the type-based aliasing rules that are
>far from resolved. A proper resolution of such problems requires the
>underlying issues with the concept of an object to be resolved first.
Yup, but I didn't see how DR236 directly related to this issue. Or maybe
I just didn't think about it hard enough :-)
jeff
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: ISO Aliasing rules question
2003-02-24 21:37 ` law
@ 2003-02-24 23:13 ` Joseph S. Myers
2003-02-24 23:23 ` Toon Moene
2003-02-25 3:20 ` Fergus Henderson
2 siblings, 0 replies; 17+ messages in thread
From: Joseph S. Myers @ 2003-02-24 23:13 UTC (permalink / raw)
To: law; +Cc: Michael Matz, gcc
On Mon, 24 Feb 2003 law@redhat.com wrote:
> >The basic "what is an object?" question is discussed in Nick Maclaren's
> >discussion with a title something like that, posted to the WG14 reflector
> >some time ago, required reading for anyone contemplating such issues; ask
> >him for a copy if you don't have one.
> Do you have a contact address for Nick? I wandered
>
> http://std.dkuug.dk/jtc1/sc22/wg14
>
> But couldn't find a reference to that paper.
nmm1@cus.cam.ac.uk. I don't think it made a formal WG14 paper, just a
mail to the reflector.
> >In this case, a (in main) has declared type (so effective type) struct s1,
> >so _if_ the structure is the relevant object then access through the type
> >struct s2 would be undefined. But if you declared a as double, and then
> >cast &a to each pointer type, then I think all accesses in f would be
> >legitimate: an object of effective type double is accessed through
> >structure types with an element of that type.
> But in "f" we have the following
>
> a->d = 1.0
> return b->d + 1.0;
>
> According to an earlier message, that is just "shorthand" for:
>
> (*a).d = 1.0
> return (*b).d + 1.0
>
> Which seems to me to clearly access "a" and "b" first, then their
> appropriate field, which it would seem to me to run afoul of the
> aliasing rules.
If the effective type is double, then the accesses to a and b are OK,
since those structs contain a double. And if the effective type is double
because the declared type is double (in the variant example I gave),
accesses and modifications cannot change the effective type to something
else.
--
Joseph S. Myers
jsm28@cam.ac.uk
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: ISO Aliasing rules question
2003-02-24 21:37 ` law
2003-02-24 23:13 ` Joseph S. Myers
@ 2003-02-24 23:23 ` Toon Moene
2003-02-25 3:20 ` Fergus Henderson
2 siblings, 0 replies; 17+ messages in thread
From: Toon Moene @ 2003-02-24 23:23 UTC (permalink / raw)
To: law; +Cc: Joseph S. Myers, Michael Matz, gcc
law@redhat.com wrote:
> Do you have a contact address for Nick? I wandered
>
> http://std.dkuug.dk/jtc1/sc22/wg14
>
> But couldn't find a reference to that paper.
Google's your friend.
"nick maclaren" gives ("I'm feeling lucky"):
nmm1@cus.cam.ac.uk
[ Watch out - Nick's a Fortran supporter ;-) ]
--
Toon Moene - mailto:toon@moene.indiv.nluug.nl - phoneto: +31 346 214290
Saturnushof 14, 3738 XG Maartensdijk, The Netherlands
Maintainer, GNU Fortran 77: http://gcc.gnu.org/onlinedocs/g77_news.html
GNU Fortran 95: http://gcc-g95.sourceforge.net/ (under construction)
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: ISO Aliasing rules question
2003-02-24 21:37 ` law
2003-02-24 23:13 ` Joseph S. Myers
2003-02-24 23:23 ` Toon Moene
@ 2003-02-25 3:20 ` Fergus Henderson
2 siblings, 0 replies; 17+ messages in thread
From: Fergus Henderson @ 2003-02-25 3:20 UTC (permalink / raw)
To: law; +Cc: Joseph S. Myers, Michael Matz, gcc
On 24-Feb-2003, law@redhat.com <law@redhat.com> wrote:
> But in "f" we have the following
>
> a->d = 1.0
> return b->d + 1.0;
>
> According to an earlier message, that is just "shorthand" for:
>
> (*a).d = 1.0
> return (*b).d + 1.0
In C++ yes, but not in C.
--
Fergus Henderson <fjh@cs.mu.oz.au> | "I have always known that the pursuit
The University of Melbourne | of excellence is a lethal habit"
WWW: <http://www.cs.mu.oz.au/~fjh> | -- the last words of T. S. Garp.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: ISO Aliasing rules question
2003-02-21 17:18 ISO Aliasing rules question law
2003-02-21 19:16 ` Mark Mitchell
2003-02-21 19:33 ` Michael Matz
@ 2003-02-27 18:47 ` David Carlton
2 siblings, 0 replies; 17+ messages in thread
From: David Carlton @ 2003-02-27 18:47 UTC (permalink / raw)
To: law; +Cc: gcc
On Fri, 21 Feb 2003 10:16:02 -0700, law@redhat.com said:
> struct s1 { double d; };
> struct s2 { double d; };
> double f(struct s1 *a, struct s2 *b)
> int main()
> {
> struct s1 a;
> f (&a, (struct s2 *) &a);
> }
(I've chopped the test case.)
I have a few related questions:
1) What if the call to f were changed to
f (&a, (struct s2 *) &a.d);
or to
f (&a, (struct s2 *) (double *) &a);
Would that make a difference?
2) What if we have a sequence like this (with the same s1 as above):
void f (struct s1 *s1p);
void g (double *dp)
{
f ((struct s1 *) dp);
}
void h (void)
{
struct s1 a;
#ifdef SWITCH
f (&a);
#else
g (&p.d);
#endif
}
Does the behavior depend on whether or not SWITCH is defined?
I confess that I don't have a copy of the C standard; I'm just curious
what lies behind the statement in K&R that "If a pointer to a
structure is cast to the type of a pointer to its first member, the
result refers to the first member."
The reason why I ask is that there are places in GDB where we get a
(clumsy) analogue of C++ subclassing by creating a struct whose first
member is another struct (which acts like a superclass). I think that
everything we do currently in that regard is legit, but I'd like to
augment this by doing a sort of Java-style generic container, where
the container contains a pointer to the first member (the
"superclass") that I'd like to be able to cast back to a pointer to
the entire struct (the "subclass"). I would hope that this is legal
because the K&R quote above suggests that the pointer to the first
member is the same as casting to the superclass, so all I'd be doing
is casting to the superclass and then back to the subclass. But these
sorts of discussions are making me a bit paranoid about when casts are
ever reliable.
David Carlton
carlton@math.stanford.edu
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2003-02-27 17:23 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-02-21 17:18 ISO Aliasing rules question law
2003-02-21 19:16 ` Mark Mitchell
2003-02-21 19:38 ` law
2003-02-21 20:03 ` Mark Mitchell
2003-02-21 20:10 ` Michael Matz
2003-02-21 20:01 ` Michael Matz
2003-02-21 20:17 ` Mark Mitchell
2003-02-21 20:29 ` Michael Matz
2003-02-21 21:26 ` Mark Mitchell
2003-02-22 1:22 ` Geoff Keating
2003-02-21 19:33 ` Michael Matz
2003-02-22 0:53 ` Joseph S. Myers
2003-02-24 21:37 ` law
2003-02-24 23:13 ` Joseph S. Myers
2003-02-24 23:23 ` Toon Moene
2003-02-25 3:20 ` Fergus Henderson
2003-02-27 18:47 ` David Carlton
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).