C++ Logo

sg12

Advanced search

Re: [ub] launder and aliasing

From: Jens Maurer <Jens.Maurer_at_[hidden]>
Date: Fri, 26 Feb 2016 13:45:28 +0100
On 02/26/2016 01:12 PM, Robert Haberlach wrote:
> I apologize in advance if this was discussed before; I didn't check the entire archive. Consider
>
> static_assert(alignof(float) >= alignof(int) && sizeof(float) >= sizeof(int));
> int foo(float f) {
> return *std::launder(reinterpret_cast<int*>(&f)); }
>
> As it stands, invocation of foo is undefined, as the argument to launder is not pointing to an object of type int (or similar) within its lifetime,
> violating launder's requirement.
>
> launder is designed to inhibit address propagation analysis, which is the only concerning optimization. Moreover, as long as all usual conditions are
> met (alignment, size & trap values), this should be fine on any implementation. If so, can we make the above formally well-defined?
> Being able to use launder in such scenarios would render circumlocutions via memcpy superfluous.

That the suggested approach not enough to make this work; see 3.10p10.

Jens

Received on 2016-02-26 13:50:44