LINUX.ORG.RU

Пример, когда с std::launder действительно работает иначе

 , , ,


0

6

Вопрос чисто практический. Пытаюсь собрать примеры кода, которые работают по разному с std::launder и без него.

На cppreference подано 3 примера (в моем понимании):

  1. Подменяется обьект (struct X) с const member (const int X::n) в куче через placement new и доступ к его данным через старый указатель (p) есть UB
  2. Обьект (struct Y) создается в заранее алоцированном пространстве, но с другим типом (std::byte[] s). Использование созданного обьекта используя только reinterpret_cast есть UB.
  3. Метод обьекта подменяет *this, использование обьекта (struct A) по старой ссылке есть UB.

У меня получилось только для пункта 3 собрать пример, когда работа кода отличается: https://wandbox.org/permlink/qi5yoGmIPgeset9I

Для пункта 1 у меня не удается «обмануть» компилятор (я хочу, чтоб он закешировал значение root.next и код вошел в вечный цикл): https://wandbox.org/permlink/A1DDj7KInEKRP4uG

Для пункта 2 пока нет идей откуда может произойти UB.

Есть у кого идеи как увидеть UB из-за неиспользования std::launder? (UBSAN в планах тоже)

Ответ на: комментарий от KennyMinigun

https://stackoverflow.com/a/39382728/2519202 вот тут вроде неплохо расписано. Но сам я этот код не пробовал, смогу часа через три посмотреть, как дома буду.

roof ★★ ()
Последнее исправление: roof (всего исправлений: 1)

Дай время. Только что launder не было, компиляторы затачивались генерировать ожидаемый код и без него. Через время может и появятся оптимизации, которые это сломают.

anonymous ()