• Re: `atomic_fetch_add` on pointer types?

    From Tim Rentsch@21:1/5 to Andrey Tarasevich on Tue Dec 31 06:08:31 2024
    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.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Andrey Tarasevich@21:1/5 to All on Fri Dec 27 14:28:03 2024
    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?

    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?

    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"?

    --
    Best regards,
    Andrey

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)