C++ Logo

SG12

Advanced search

Subject: Re: [ub] launder and aliasing
From: Jens Maurer (Jens.Maurer_at_[hidden])
Date: 2016-02-26 06:45:28


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


SG12 list run by herb.sutter at gmail.com