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 (всего исправлений: 2)

А канонический пример с union, где один объект содержит const-поле, а второй нет, не дает разного поведения в твоем компиляторе?

roof ★★
()
Ответ на: комментарий от roof

А канонический пример с union,

Какой? Я б попробовал.

твоем компиляторе

все, что доступно на wandbox.org, ну или по крайней мере на godbolt.org

KennyMinigun ★★★★★
() автор топика
Ответ на: комментарий от KennyMinigun

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

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

Спасибо. Тоже домой еду, посмотрю позже :)

KennyMinigun ★★★★★
() автор топика

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.