The hazard map: strict aliasing, signed overflow, placement new + manual destruction, and the memcpy idiom as the only legal pun. Lifetime rules are folklore more than API.
alignas(T) unsignedchar slot[sizeof(T)];
T* p = new (slot) T(args); // begin lifetime
p->~T(); // end it yourself
Implicit-lifetime types (P0593): malloc-ed or memcpy-ed buffers of suitable types now contain objects without placement new — network/file deserialization gains legal footing. bit_cast covers value punning.
auto* buf = static_cast<Header*>(std::malloc(sizeof(Header)));
// Header is implicit-lifetime: reading *buf after memcpy is OK (C++20)
Erroneous behavior debuts: uninitialized reads become defined-but-wrong and diagnosable instead of anything-goes UB — the first installment of shrinking the UB surface by category.
int x; // reading x is erroneous (diagnosable), not wild UBuse(x);