Sujet : Re: `atomic_fetch_add` on pointer types?
De : tr.17687 (at) *nospam* z991.linuxsc.com (Tim Rentsch)
Groupes : comp.lang.cDate : 31. Dec 2024, 15:08:31
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <868qrwaqsg.fsf@linuxsc.com>
References : 1
User-Agent : Gnus/5.11 (Gnus v5.11) Emacs/22.4 (gnu/linux)
Andrey Tarasevich <
andreytarasevich@hotmail.com> writes:
[some whitespace in quoted text was modified]
The code
>
#include <stdatomic.h>
#include <stdio.h>
>
int main()
{
int v[2], *_Atomic p = v;
atomic_fetch_add(&p, 1);
printf("%tu\n", (char *) p - (char *) v);
}
>
GCC prints 1 (https://godbolt.org/z/55Pjcnd3Y), while Clang prints 4
(https://godbolt.org/z/e4x6z85fe). Obviously, Clang performed the
"proper" pointer arithmetic, while GCC ignored the pointer type.
>
Which one is correct here?
The behavior shown by clang is obviously the more sensible choice.
The C standard is not as clear on this point as I would like it to
be, but I believe the behavior shown by clang is what was intended.
7.17.7.5 says (https://port70.net/~nsz/c/c11/n1570.html#7.17.7.5)
>
1 The following operations perform arithmetic and bitwise
computations. All of these operations are applicable to an
object of any atomic integer type. None of these operations
is applicable to atomic_bool.
>
Is this wording intended to restrict these operations to integer
types only?
I believe it was not; otherwise there is no point to the paragraph
you mention next. See also below.
But later 7.17.7.5 also says
>
3 For address types, the result may be an undefined address, but
the operations otherwise have no undefined behavior.
>
However, I was unable to find any mention of "address types" anywhere
else in the standard. This is the only spot in the entire document
mentioning "address types". What types are "address types"?
Surely "address types" should be taken as being synonymous with
"pointer types". More details to follow in comp.std.c.