170 похожих чатов

Т.Е. Union { void* ptr; std::uintptr_t ptr_int; } un; un.ptr = nullptr auto a = un.ptr_int; будет

ли это считаться UB?

35 ответов

6 просмотров

Это UB, которое скорее всего везде работает как надо

да, вы осуществляете доступ к неактивному (мертвому) члену union http://eel.is/c++draft/class.union#general-2 http://eel.is/c++draft/basic.life#4.sentence-1

Kirill Bolshakov
Это UB, которое скорее всего везде работает как на...

Я вообще слабо представляю, как это может работать не как надо. Достаточно глянуть как оно в ассемблере выглядит (могу судить по x86, x86-64, arm, aarch64, mips). Но блин, стандарт не хочет жизнь делать проще. С одной стороны близость к машине, с другой - дичь непонятная. Будто высокоуровневая часть борется с низкоуровневой

Alexander Drozdov
Я вообще слабо представляю, как это может работать...

как то компилятор просто захочет выкинуть инструкцию и всё) В компиляторе есть дурная возможность рассуждать от обратного. Типа я знаю что ты записывал в union a, но читаешь b - так нельзя. Значит в if строчкой выше всегда false, а если в там всегда фалсе, то ... и кароче в итоге он там сам придумал себе программу, которая ничего не имеет общего с твоей.

Alex Noname
как то компилятор просто захочет выкинуть инструкц...

Я в курсе. Иногда такое в уныние вводит. Я ещё помню, когда emacs собранный с O3 падал с сегфолтом на старте. А пересобранный с O2 работал и есть не просил (хотя там не цпп). При этом ситуаций, когда, вроде, код безобидный, а там ub, очень много. И логика не совсем ясна. Так то ясно, что типа погромист пишет правильно, а если что неправильно, то он понимает, что делает, а значит можно соптимиздить... но как-то такое себе допущение, ИМХО (имею мнение, хрен оспоришь)

Alexander Drozdov
Я в курсе. Иногда такое в уныние вводит. Я ещё пом...

> код безобидный, а там ub Это противоречие, код с ub - невалиден и всё.

Kirill Bolshakov
А не надо программы с багами писать

Ты все UB знаешь/помнишь? Я же как раз про случаи, когда вроде всё логично, в том числе с точки зрения ассемблера и/или шелеза, а на самом деле - ub.

Kirill Bolshakov
> код безобидный, а там ub Это противоречие, код ...

Невалидный код не должен собираться и всё)

Alexander Drozdov
Невалидный код не должен собираться и всё)

Такой технологии пока никто не изобрёл

Kirill Bolshakov
Такой технологии пока никто не изобрёл

Так не нужно тогда декларировать UB без надобности. Тот же пример с union, с точки зрения сгенерированного кода, нет проблем с записью в одно поле, а чтение по другому, там просто адрес тот же.

Alexander Drozdov
Так не нужно тогда декларировать UB без надобности...

1) ub нужно для оптимизаций 2) это для тебя логично, а на какой-то стремной машине может что-то отвалится. уб значит что компилятор это никак не проверяет и не гарантирует никакого поведения, все зависит от машины/погоды/других факторов

Kirill Bolshakov
В С++ выпиливают часть UB постепенно.

По мне, так целый выпуск стандарта этому посвятить и нужно) и нового с UB не принимать

Alexander Drozdov
Так не нужно тогда декларировать UB без надобности...

> нет проблем с записью в одно поле, а чтение по другому Есть проблема - union не был под это задизайнен. Авторы стандарта считают, то так делать никто не будет, потому что это бред. И они дают возможность компилятору ускорить программу, применив оптимизации основанные на этом факте. После такого у тебя нет гарантий, что >там просто адрес тот же

Kirill Bolshakov
> нет проблем с записью в одно поле, а чтение по д...

Дело в том, что чаще именно такое использование и встречал, нежели оптимизацию хранения разнородных входных данных (variant).

Alexander Drozdov
По мне, так целый выпуск стандарта этому посвятить...

уб для того и нужно что мы считаем что если программист написал неправильный код то мы этому коду ничего гарантировать не будем и всё, а если правильный — на разных фактах (а-ля если разыменовывают указатель => он не null) не будем делать лишних проверок и будем делать хорошие оптимизации

Kirill Bolshakov
Я и volatile для многопоточности видел

в нем ничего плохого нет... до с++11 так и жили

Kirill Bolshakov
Ну это гавнокодеры прост писали

Ну эт мы все прекрасно знаем) говнокодер кто угодно, только не ты) ну опенсурс одно сплошное по колено в коде...

Alexander Drozdov
Ты все UB знаешь/помнишь? Я же как раз про случаи,...

Вот будет у нас разный ассемблер... Чо делать, как определять, где валидно?

Yalokin Kononov
уб для того и нужно что мы считаем что если програ...

Повторюсь, есть логические ошибки, то есть программа работает корректно, но алгоритм запрограммирован не верно, есть синтаксические, тогда компилятор ругнётся. А UB... это что-то среднее, что использует компилятор, молча проглатывая (не всегда) и что рамазано по стандарту, как манка по тарелке. При этом алгоритм вроде работает, компилятор не ругается, но вцелом, всё зависит от погоды на Марсе)

Dmitriy [Отпуск]
Вот будет у нас разный ассемблер... Чо делать, как...

Кстати, как раз актуально для volatile в рамках архитектур с TSO и без

Alexander Drozdov
Повторюсь, есть логические ошибки, то есть програм...

а есть семантические ошибки, лексические ошибки и еще Н видов ошибок..

Alexander Drozdov
Повторюсь, есть логические ошибки, то есть програм...

UB это как раз логическая ошибка и есть, у тебя есть правила, ты их нарушил

Dmitriy [Отпуск]
Кстати, как раз актуально для volatile в рамках ар...

ну так волатиль для многопоточки используют только с написанием своего ассемблера для атомиков

Yalokin Kononov
ну так волатиль для многопоточки используют только...

Меня смущает слово "своего", а в остальном соглашусь

Dmitriy [Отпуск]
Вот будет у нас разный ассемблер... Чо делать, как...

Начнём с того, насколько разный и сколько их осталось? X86 в разных ипостасях, arm, aarch64, mips, microblaze, xTensa?

Dmitriy [Отпуск]
Меня смущает слово "своего", а в остальном соглашу...

своего я имел ввиду под конкретную архитектуру учитывая модель памяти процессора, в линуксе она своя, в тбб вот была своя, они с С++03 перешли буквально год назад, до этого самописными атомиками пользовались, эх..

Dmitriy [Отпуск]
А e2k? risc-v?

Точно, e2k точно нормально енум переваривал)

Kirill Bolshakov
Ну это гавнокодеры прост писали

нет, это разрешено явно в gcc так делать.

Похожие вопросы

Обсуждают сегодня

А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Где в Астане можно купить мясо для шашлыков?
Dancing Іңұқәһүғө
21
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
Добрый день подскажите пожалуйста может кто то сталкивался с ошибками Sentry 22.10.0 развернутым из helm чарт в Kubernetes? Изначально 3 дня назад очень стало много событий ух...
Tire4 Finist Devops
1
всем привет почти закончил курс После него можно писать свою операционку? Какие библиотеки надо использовать и куда дальше копать для изучения
Linus
22
почому оно не работает?
Vi Chapmann ٩( 💢•̀ з•́)و Chapmann
19
Так а кто может спарсить всех участников чата? Идишники
Magic
18
Карта сайта