Re[2]: Когда это наконец станет defined behavior?
От: kov_serg Россия  
Дата: 02.05.23 15:03
Оценка: :)
Здравствуйте, Кодт, Вы писали:

К>std::destroy_at(obj);

К>// obj умер

К>read_some_data(buf);

К>// obj снова жив?

Срочно нужна функция для проверки наличия души у объекта std::has_soul и изгнания демонов std::exorcise и библиотека стандартных обрядов <rituals>

Умер не умер какая разница, процессору фиолетово, там что биты переходят в Z состояние. Но компилятор надо ублажить иначе UB, а в случае UB компилятору позволено делать пакости, даже если на данной архитектуре никаких неоднозначностей не могло возникнуть. Имхо весь этот анонизм с присоединёнными сущностями к хорошему не приведёт. Если они нужны сделайте их явными и доступными по const_expr. А так в результате имеем разные данные по одинаковым указателям. И другие не наблюдаемые на железе чудеса, но которые компилятор не моргнув глазом воплощает в бинарный код.
Re[33]: Когда это наконец станет defined behavior?
От: kov_serg Россия  
Дата: 02.05.23 15:17
Оценка: -1
Здравствуйте, rg45, Вы писали:


R>Я не понимаю, какое значение это имеет в данном контексте. Из этого как-то выводится, что const -- ненужный атрибут
Автор: kov_serg
Дата: 30.04.23
?


Если это для программиста то чем
int const x[1];

Лучше
int const_x[1];


Корме того что налагает обязательства на компилятор и требует дополнительных функций для разных модификаторов.
Re[25]: Когда это наконец станет defined behavior?
От: kov_serg Россия  
Дата: 02.05.23 15:21
Оценка:
Здравствуйте, rg45, Вы писали:

R>Это const — ненужный атрибут? Боюсь, найдется немало людей с противоположным мнениеем. И я в их числе. Вообще есть мнение, что const следовало бы сделать модификатором по умолчанию, а мутабельность прописывать явно.

Для это есть erlang где все переменные не мутабельные.
Re[2]: Когда это наконец станет defined behavior?
От: Ip Man Китай  
Дата: 02.05.23 16:22
Оценка:
Здравствуйте, Кодт, Вы писали:

К>lifetime начинается с момента выделения памяти под объект типа implicitly created type, а делать реинтерпрет прямо сейчас или когда угодно позже — какая разница?


Байты пришли по сети и сохранились в буфер. Можно считать, что память выделилась? При этом тип объекта к которому мы кастуем, может меняться в зависимости от заголовка (как в примере).
Re[3]: Когда это наконец станет defined behavior?
От: Ip Man Китай  
Дата: 02.05.23 16:23
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Умер не умер какая разница, процессору фиолетово, там что биты переходят в Z состояние.


Это C++ и с ним надо считаться. Чтобы было фиолетово, можно писать на ассемблере.
Re[34]: Когда это наконец станет defined behavior?
От: rg45 СССР  
Дата: 02.05.23 16:24
Оценка:
Здравствуйте, kov_serg, Вы писали:


R>>Я не понимаю, какое значение это имеет в данном контексте. Из этого как-то выводится, что const -- ненужный атрибут
Автор: kov_serg
Дата: 30.04.23
?


_>Если это для программиста то чем

_>
_>int const x[1];
_>

_>Лучше
_>
_>int const_x[1];
_>


_>Корме того что налагает обязательства на компилятор и требует дополнительных функций для разных модификаторов.


Что-то мне все труднее и труднее отслеживаться связь между тезисами. Какова цель вообще нашей дискуссии — ты хочешь меня в чем-то убедить, или ты хочешь, чтоб я тебя в чем-то убедил?
--
Справедливость выше закона. А человечность выше справедливости.
Re[33]: Когда это наконец станет defined behavior?
От: B0FEE664  
Дата: 02.05.23 17:08
Оценка:
Здравствуйте, rg45, Вы писали:

BFE>>Почему функциональность std::start_lifetime_as<T> и std::launder нельзя было бы повесить на reinterpret_cast<T> ?

R>Я не понимаю, какое значение это имеет в данном контексте. Из этого как-то выводится, что
Автор: kov_serg
Дата: 30.04.23
?


Не обязательно это рассматривать в контексте "const -- ненужный атрибут".
Рассмотрите, пожалуйста, этот вопрос шире: зачем мне, как программисту, иметь отдельно reinterpret_cast<T>, std::start_lifetime_as<T> и std::launder<T>?
Почему reinterpret_cast<T> не может делать работу std::start_lifetime_as<T>?
Почему reinterpret_cast<T> не может делать работу std::launder<T>?

Другими словами, почему список здесь
нельзя дополнить пунктом
12) if a pointer p represents the address A of a byte in memory
— an object X is located at the address A
— X is within its lifetime
— the type of X is the same as T, ignoring cv-qualifiers at every level
— every byte that would be reachable through the result is reachable through p
then
reinterpret_cast<T>(p) returns a pointer to the same memory that p points to, but where the referent object is assumed to have a distinct lifetime and dynamic type
?

И почему нельзя добавить аналогичный пункт для std::start_lifetime_as ?

  гуглёж кажет такое
здесь

alignas(int) char data[sizeof(int)];
new(&data) int;
int *p = std::launder(reinterpret_cast<int*>(&data));
И каждый день — без права на ошибку...
Re[2]: Когда это наконец станет defined behavior?
От: T4r4sB Россия  
Дата: 02.05.23 17:38
Оценка:
Здравствуйте, Кодт, Вы писали:


К>
К>alignas(T) char buf[sizeof(T)];
К>T* obj = (T*)buf;

К>// placement new не нужен, потому что T у нас implicitly created
К>

Удачи тебе с любым объектом, у которого есть внутренние инварианты. Например, с юником. В какой строке байтовый мусор из char[] превращается в валидный юник? Ну вот зануление указателя вот, в какой строке оно должно происходить?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[34]: Когда это наконец станет defined behavior?
От: T4r4sB Россия  
Дата: 02.05.23 17:40
Оценка:
Здравствуйте, kov_serg, Вы писали:


_>Если это для программиста то чем

_>
_>int const x[1];
_>

_>Лучше
_>
_>int const_x[1];
_>


Тут по сути ничем. А вот даже для итерирования по сету нужно жёстко запретить программисту менять ключи. Если это можно сделать на этапе компиляции, то почему б этого не сделать.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[35]: Когда это наконец станет defined behavior?
От: kov_serg Россия  
Дата: 02.05.23 20:47
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Тут по сути ничем. А вот даже для итерирования по сету нужно жёстко запретить программисту менять ключи. Если это можно сделать на этапе компиляции, то почему б этого не сделать.

Что бы запретить программисту жестко менять ключи ему надо выдавать область памяти которую он физически не сможет поменять (read only) или копию (что бы изменения ни на что не повлияли).
А так он преобразует const в не const и алга. А то что компилятор пытается это делать избыточно и не нужно. Всё равно есть обходные пути. Я к тому что не хрен указателю T* присовывать свойства которых физически нет.
Если они нужны сделайте явно complex_pointer<T> со всеми необходимыми атрибутами (выравниванием, правилами доступа, наличием "благословения" и жезненной силы) и правилами преобразования. Храните их в compile_time в шаблонах наздоровье. Но с возможность с ними взаимодействовать.
Но нет делается тоже самое, но все атрибуты скрываются под ковёр в результате сложность всплавает в компиляторе который быстро соображает что это UB и можно поиздеваться над программистом (так как можно делать что удобнее).
То есть программист должен знать не как работает железо, а что задумывает компилятор и чего там еще эти стандартизаторы напридумывали в последнем издании. И чем дальше тем более наркоманские оторванные от реального мира конструкции получаются.

ps: Если разделить виртуальное адресное пространство примерно так. То можно делать настоящие константные указатели и не только. Которые физически будут ограничивать указатели. Благо в 64битных системах свободных адресных бит более чем дофига.
[memory          , npages] data вся достпная память программе
[memory+delta_ro , npages] замаплено на data только чтение (запись игнорируется)
[memory+delta_we , npages] тоже замаплено на data только вызывает исключение при попытке записи
[memory+delta_na , npages] при любом обращении вызывает исключение
Re[36]: Когда это наконец станет defined behavior?
От: T4r4sB Россия  
Дата: 02.05.23 21:16
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>А так он преобразует const в не const и алга.


Не надо путать преднамеренную диверсию и невнимательность.
Так можно сказать что и руст ни от чего не защищает, ведь можно написать unsafe и алга.
Предполагается, что средний программист ХОЧЕТ писать безопасный безглючный код, но в силу человеческого фактора регулярно случайно косячит. Конечно, С++ программисты вовсе не такие, и никогда не ошибаются, если верить тому, что они про себя говорят , но мы будем умнее и не будем им верить.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[37]: Когда это наконец станет defined behavior?
От: kov_serg Россия  
Дата: 02.05.23 21:40
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Не надо путать преднамеренную диверсию и невнимательность.

так что мешает в названии переменной говорить программисту не менять переменную, зачем дополнительный тип.

TB>Так можно сказать что и руст ни от чего не защищает, ведь можно написать unsafe и алга.

Что самое интересное без алга не работает

TB>Предполагается, что средний программист ХОЧЕТ писать безопасный безглючный код, но в силу человеческого фактора регулярно случайно косячит.

Но стандарт разрешает компилятору верить что в коде который написал программист нет UB. То есть они никогда не косячат. И на основании этого ложного утверждения делает не вменяемые изменения в генерируемом коде. Иногда даже такие какие физически не возможны в принципе.

TB>Конечно, С++ программисты вовсе не такие, и никогда не ошибаются, если верить тому, что они про себя говорят , но мы будем умнее и не будем им верить.

Тут еще веселей правила постоянно меняются и дополняются.Так что то что раньше было норм и работало теперь лютое UB и надо помимо преобразования типа еще и благословение у компилятора выпрашивать. И программа обрастает обрядами и костылями.
Re[3]: Когда это наконец станет defined behavior?
От: kov_serg Россия  
Дата: 02.05.23 21:46
Оценка:
Здравствуйте, T4r4sB, Вы писали:

TB>Удачи тебе с любым объектом, у которого есть внутренние инварианты. Например, с юником. В какой строке байтовый мусор из char[] превращается в валидный юник? Ну вот зануление указателя вот, в какой строке оно должно происходить?

Что мешает объекту быть в не валидном состоянии и при этом не вызывать UB. Можно добавить методы валидации или даже коррекции ошибок, когда не валидные состояния меняются на ближайшие валидные.
Re[38]: Когда это наконец станет defined behavior?
От: T4r4sB Россия  
Дата: 02.05.23 21:53
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>так что мешает в названии переменной говорить программисту не менять переменную, зачем дополнительный тип.


А ещё лучше чтоб компилятор давал предупреждения, если программист меняет переменные, у которых такое специальное название! Чтоб ревью автоматизировать. А если лучше если это будут не предупреждения, а ошибки!

_>Что самое интересное без алга не работает


Как и с const_cast.

_>Но стандарт разрешает компилятору верить что в коде который написал программист нет UB. То есть они никогда не косячат. И на основании этого ложного утверждения делает не вменяемые изменения в генерируемом коде. Иногда даже такие какие физически не возможны в принципе.

_>Тут еще веселей правила постоянно меняются и дополняются.Так что то что раньше было норм и работало теперь лютое UB и надо помимо преобразования типа еще и благословение у компилятора выпрашивать. И программа обрастает обрядами и костылями.

Ну сорян, сообщество С++ полно не очень вменяемых людей . И любимый заскок крестовиков — это неадекватная переоценка своей внимательности.

_>Что мешает объекту быть в не валидном состоянии и при этом не вызывать UB. Можно добавить методы валидации или даже коррекции ошибок, когда не валидные состояния меняются на ближайшие валидные.


И как ты провалидируешь юник, собранный из битового мусора? Ну в нём какой-то набор байт, который, возможно, какой-то указатель куда-то, и? Как ты поймёшь, что он валиден? В реальном юнике это постулируется тем, что мы вызвали конструктор и верим в то, что конструктор корректный.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[39]: Когда это наконец станет defined behavior?
От: kov_serg Россия  
Дата: 02.05.23 22:16
Оценка:
Здравствуйте, T4r4sB, Вы писали:
_>>Что мешает объекту быть в не валидном состоянии и при этом не вызывать UB. Можно добавить методы валидации или даже коррекции ошибок, когда не валидные состояния меняются на ближайшие валидные.

TB>И как ты провалидируешь юник, собранный из битового мусора? Ну в нём какой-то набор байт, который, возможно, какой-то указатель куда-то, и? Как ты поймёшь, что он валиден? В реальном юнике это постулируется тем, что мы вызвали конструктор и верим в то, что конструктор корректный.

Для начала можно просто контрольную сумму добавить. Во вторых так собирают POD объекты без указателей, умных объектов и виртуальных таблиц.
Re[26]: Когда это наконец станет defined behavior?
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 03.05.23 08:17
Оценка:
Здравствуйте, kov_serg, Вы писали:

R>>Это const — ненужный атрибут? Боюсь, найдется немало людей с противоположным мнениеем. И я в их числе. Вообще есть мнение, что const следовало бы сделать модификатором по умолчанию, а мутабельность прописывать явно.

_>Для это есть erlang где все переменные не мутабельные.

И где полно жизнерадостных хаков против этого типа словаря процесса, ETS, соседних процессов — хранителей состояния по своему настроению, или даже просто саморекурсии с исправленными значениями... а так да, можно сказать, что не мутабельные
The God is real, unless declared integer.
Re[22]: Когда это наконец станет defined behavior?
От: rg45 СССР  
Дата: 03.05.23 08:20
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Просто const тут многозначный атрибут и в разных ситуациях его трактуют по разному. Именно отсюда все беды.


Никаких бед нет — в каждой отельной ситуцации трактовка однозначна. Многие ключевые слова могут иметь различную трактовку, в зависимости от контекста использования: "const", "class", "typename", "using" и пр. Тебя же не смущает, что в следующих двух маленьких объявлениях ключевое слово "class" употреблено сразу в четырех(!) разных смыслах?

http://coliru.stacked-crooked.com/a/af659bbf7cbaefb0

enum class E;

template<template<class A> class B, class C&, E>
void foo();


И что, где тут беды? Если кто-то не знает как правильно трактовать то или иноее слово в том или ином случае, то это его персональная беда.
--
Справедливость выше закона. А человечность выше справедливости.
Re[8]: Когда это наконец станет defined behavior?
От: T4r4sB Россия  
Дата: 03.05.23 17:12
Оценка: -2 :))
Здравствуйте, watchmaker, Вы писали:

W>Только объект, что изнчально был const.


Ну хорошо

struct S {
    const int i;
};

void bar(const S& s);

int foo() {
    const S s{1};
    int i1 = s.i;
    bar(s);
    int i2 = s.i;
    return i1 + i2;
}



https://godbolt.org/z/fE3W1G6ss

Вот зачем там второе
mov     eax, DWORD PTR [rsp+12]

?

Константный объект с константным полем передаётся по константной ссылке!
Разве изменение такого объекта (через const_cast, placement_new итд) это не UB? Разве компилятор не вправе предположить, что после вызова bar в объекте по-прежнему останется единица?
Или тут внезапно случился конфликт высера стандартизаторов и реально существующей кодобазы, и компиляторы решили не наглеть?
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re[9]: Когда это наконец станет defined behavior?
От: watchmaker  
Дата: 03.05.23 20:31
Оценка: 4 (1)
Здравствуйте, T4r4sB, Вы писали:

  quote
TB>
TB>struct S {
TB>    const int i;
TB>};

TB>void bar(const S& s);

TB>int foo() {
TB>    const S s{1};
TB>    int i1 = s.i;
TB>    bar(s);
TB>    int i2 = s.i;
TB>    return i1 + i2;
TB>}
TB>



TB>https://godbolt.org/z/fE3W1G6ss


TB>Вот зачем там второе

TB>
TB>mov     eax, DWORD PTR [rsp+12]
TB>

TB>?




TB>Константный объект с константным полем передаётся по константной ссылке!

TB>Разве изменение такого объекта (через const_cast, placement_new итд) это не UB?

Это будет UB.


TB> Разве компилятор не вправе предположить, что после вызова bar в объекте по-прежнему останется единица?



Конечно он может это сделать: https://godbolt.org/z/T5MG743aW

        pushq   %rax
        movl    $1, (%rsp)
        movq    %rsp, %rdi
        callq   bar(S const&)@PLT
        movl    $2, %eax
        popq    %rcx
        retq
Re[10]: Когда это наконец станет defined behavior?
От: T4r4sB Россия  
Дата: 03.05.23 20:40
Оценка:
Здравствуйте, watchmaker, Вы писали:


W>Конечно он может это сделать: https://godbolt.org/z/T5MG743aW


Проверил разные версии кланга, да, он явно продвинутее, чем гцц.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Отредактировано 03.05.2023 20:42 T4r4sB . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.