| Deutsch English Français Italiano |
|
<20250505202038.000034b9@yahoo.com> View for Bookmarking (what is this?) Look up another Usenet article |
Path: news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: Michael S <already5chosen@yahoo.com>
Newsgroups: comp.lang.c
Subject: Re: Regarding assignment to struct
Date: Mon, 5 May 2025 20:20:38 +0300
Organization: A noiseless patient Spider
Lines: 96
Message-ID: <20250505202038.000034b9@yahoo.com>
References: <vv338b$16oam$1@dont-email.me>
<vv4j9p$33vhj$1@dont-email.me>
<86plgo7ahu.fsf@linuxsc.com>
<vv9hu7$3nomg$1@dont-email.me>
<20250505111213.00004b55@yahoo.com>
<vv9stv$2i8j$1@dont-email.me>
<20250505120145.000014f8@yahoo.com>
<vvame5$ppqp$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Injection-Date: Mon, 05 May 2025 19:20:38 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="888d6ab59df4c78ac11e99ce39880912";
logging-data="1759194"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/gKOJXxU0yyr0BTjOrr0/M50yT9vqdHlI="
Cancel-Lock: sha1:SccNqQwX6IAvHRfbtkD3pb39hLo=
X-Newsreader: Claws Mail 3.19.1 (GTK+ 2.24.33; x86_64-w64-mingw32)
On Mon, 5 May 2025 08:45:09 -0700
Andrey Tarasevich <noone@noone.net> wrote:
> On Mon 5/5/2025 2:01 AM, Michael S wrote:
> > On Mon, 5 May 2025 01:29:47 -0700
> > Andrey Tarasevich <noone@noone.net> wrote:
> >
> >> On Mon 5/5/2025 1:12 AM, Michael S wrote:
> >>>
> >>> According to my understanding, you are wrong.
> >>> Taking pointer of non-lvalue is UB, so anything compiler does is
> >>> conforming.
> >>>
> >>
> >> Er... What? What specifically do you mean by "taking pointers"?
> >>
> >> The whole functionality of `[]` operator in C is based on pointers.
> >> This expression
> >>
> >> (a = b).a[5]
> >>
> >
> >> is already doing your "taking pointers of non-lvalue" (if I
> >> understood you correctly) as part of array-to-pointer conversion.
> >> And no, it is not UB.
> >>
> >> This is not UB either
> >>
> >> struct S foo(void) { return (struct S) { 1, 2, 3 }; }
> >> ...
> >> int *p;
> >> p = &foo().a[2], printf("%d\n", *p);
> >>
> >
> >
> > That is not UB:
> > int a5 = (a = b).a[5];
> >
> > That is UB:
> > int* pa5 = &(a = b).a[5];
>
> No, it isn't.
>
> > If you read the post of Keith Thompson and it is still not clears to
> > you then I can not help.
>
> The only valid "UB" claim in Keith's post is my printing the value of
> `pc` pointer, which by that time happens to point nowhere, since the
> lifetime of the temporary is over. (And, of course, lack of
> conversion to `void *` is an issue).
>
> As for the expressions like
>
> &(a = b).a[5];
>
> and
>
> &foo().a[2]
>
Expressions by themselves a valid. But since there is no situation in
which the value produced by expressions is valid outside of expressions
the compiler can generate any value it wants, even NULL or value
completely outside of address space of current process.
> - these by themselves are are perfectly valid. There's no UB in these
> expressions. (And this is not a debate.)
>
> Here's a version of the same code that corrects the above distracting
> issues
>
> #include <stdio.h>
>
> struct S { int a[10]; };
>
> int main()
> {
> struct S a, b = { 0 };
> int *pa, *pb, *pc;
>
> pa = &a.a[5],
> pb = &b.a[5],
> pc = &(a = b).a[5],
> printf("%p %p %p\n", (void *) pa, (void *) pb, (void *) pc);
> }
>
> This version has no UB.
>
It's only not UB in the nazal demons sense.
It's UB in a sense that we can't predict values of expressions
like (pa==pc) and (pb==pc). I.e. pc is completely useless. In my book
it is form of UB.