C++ Logo

SG12

Advanced search

Subject: [ub] launder and aliasing
From: Robert Haberlach (rh633_at_[hidden])
Date: 2016-02-26 06:12:45


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.

Robert


SG12 list run by herb.sutter at gmail.com