[ub] launder and aliasing

Robert Haberlach rh633 at cam.ac.uk
Fri Feb 26 13:12:45 CET 2016


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


More information about the ub mailing list