Когда это наконец станет defined behavior?
От: Ip Man Китай  
Дата: 27.04.23 10:53
Оценка:
Из p0593, который был принят в C++20:

void process(Stream *stream) {
  unique_ptr<char[]> buffer = stream->read();
  if (buffer[0] == FOO)
    process_foo(reinterpret_cast<Foo*>(buffer.get())); // #1
  else
    process_bar(reinterpret_cast<Bar*>(buffer.get())); // #2
}


(Естественно, принимается что вопрос alignment Foo и Bar решён (или они оба packed)).

Однако я не нашёл в стандарте C++20 упоминания, что reinterpret_cast может начать lifetime объекта. Хотя malloc и memcpy теперь легальны с этой точки зрения, т.е. этот пропозал был включён в стандарт, но обошли reinterpret_cast.
Re: Когда это наконец станет defined behavior?
От: Zhendos  
Дата: 27.04.23 10:59
Оценка: 14 (2)
Здравствуйте, Ip Man, Вы писали:

IM>Однако я не нашёл в стандарте C++20 упоминания, что reinterpret_cast может начать lifetime объекта. Хотя malloc и memcpy теперь легальны с этой точки зрения, т.е. этот пропозал был включён в стандарт, но обошли reinterpret_cast.



Вроде для этого предложили новую функцию std::start_lifetime_as ,
но не знаю принята она в стандарт или нет.
Re[2]: Когда это наконец станет defined behavior?
От: Ip Man Китай  
Дата: 27.04.23 11:04
Оценка:
Здравствуйте, Zhendos, Вы писали:

Z>Вроде для этого предложили новую функцию std::start_lifetime_as ,

Z>но не знаю принята она в стандарт или нет.

Нашёл её в C++23 draft.
Re[2]: Когда это наконец станет defined behavior?
От: kov_serg Россия  
Дата: 27.04.23 12:47
Оценка:
Здравствуйте, Zhendos, Вы писали:

IM>>Однако я не нашёл в стандарте C++20 упоминания, что reinterpret_cast может начать lifetime объекта. Хотя malloc и memcpy теперь легальны с этой точки зрения, т.е. этот пропозал был включён в стандарт, но обошли reinterpret_cast.


Z>Вроде для этого предложили новую функцию std::start_lifetime_as ,


Надо больше обрядов. Что это за религия если мало странных обрядов

ps: пара уже добавлять std::bless<function_name>
Отредактировано 27.04.2023 13:02 kov_serg . Предыдущая версия .
Re: Когда это наконец станет defined behavior?
От: reversecode google
Дата: 27.04.23 12:58
Оценка: :)
это бред
у гугла до черта кода которые делаю такие касты
их uint8_t* в какой то объект(структуру)

и если это УБ
то прощай весь софт, так же ?

есть где то на ютубе презентация автора этого лафт-тайм-аз
и по моему там чуть чуть другой пример, как мне кажется(могу ошибаться)
Re[2]: Когда это наконец станет defined behavior?
От: Ip Man Китай  
Дата: 27.04.23 13:42
Оценка:
Здравствуйте, reversecode, Вы писали:

R>это бред

R>у гугла до черта кода которые делаю такие касты
R>их uint8_t* в какой то объект(структуру)

R>и если это УБ

R>то прощай весь софт, так же ?

Все так делают. Но формально это UB.
Re[3]: Когда это наконец станет defined behavior?
От: T4r4sB Россия  
Дата: 27.04.23 14:01
Оценка:
Здравствуйте, Ip Man, Вы писали:

IM>Все так делают. Но формально это UB.


В тему приглашается 45й который на скиле по хардкору пояснит что нет никаких проблем писать код, не содержащий уб, и что его достало нытьё неосиляторов и что нет ничего сложного пофиксить старый проект и пересобрать более новым компилятором.
Re[3]: Когда это наконец станет defined behavior?
От: reversecode google
Дата: 27.04.23 14:13
Оценка: 1 (1)
хм
нашел видео
у думлера тотже пример
https://youtu.be/_qzMpk-22cc?t=2606

еще до кучи
https://habr.com/ru/articles/680008/

в коментах lifetime там ребята чуть чуть обсуждали когда все таки не так уж и страшно

https://youtu.be/pbkQG09grFw?t=1467
Re[4]: Когда это наконец станет defined behavior?
От: B0FEE664  
Дата: 27.04.23 16:35
Оценка:
Здравствуйте, T4r4sB, Вы писали:

IM>>Все так делают. Но формально это UB.

TB>В тему приглашается 45й который на скиле по хардкору пояснит что нет никаких проблем писать код, не содержащий уб, и что его достало нытьё неосиляторов и что нет ничего сложного пофиксить старый проект и пересобрать более новым компилятором.

Пока ждем 45-ого могу сказать: такой исходный код
Автор: Ip Man
Дата: 27.04.23
code review обычно не пройдёт: big-endian/little-endian, проверка размера прочитанных данных, проверка диапазонов значений — где всё это? А без таких проверок reinterpret_cast смысла не имеет.
И каждый день — без права на ошибку...
Re[4]: Когда это наконец станет defined behavior?
От: T4r4sB Россия  
Дата: 27.04.23 17:21
Оценка:
Здравствуйте, reversecode, Вы писали:

R>https://habr.com/ru/articles/680008/


Офигеть

Modifying a const object through a non-const access path and referring to a volatile object through a non-volatile glvalue results in undefined behavior.

То есть этот код содержит УБ?
int g=0;

int bar() {
  ++g;
  return g;
}

int foo(const int& a) {
  return a + bar() + a;
}

int main() {
  printf("%i\n", foo(g));
}
Отредактировано 27.04.2023 17:22 T4r4sB . Предыдущая версия .
Re[5]: Когда это наконец станет defined behavior?
От: reversecode google
Дата: 27.04.23 17:34
Оценка:
какой ответа от меня ожидают ?

вон гугл reinterpet_cast пользуется и даже ЕМ пользуются всякими уб и деньгу зашибают оба

а про уб же написано — нужно что бы пугать детей

или к примеру из народного

И незаряженное ружье один раз в году само стреляет

тоже ведь УБ, только народное
Re[5]: Когда это наконец станет defined behavior?
От: σ  
Дата: 27.04.23 17:51
Оценка: +1
TB>

Modifying a const object through a non-const access path and referring to a volatile object through a non-volatile glvalue results in undefined behavior

TB>То есть этот код содержит УБ?

А где в нём происходи что-нибудь из цитируемого?
Re: Когда это наконец станет defined behavior?
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 27.04.23 17:56
Оценка:
Здравствуйте, Ip Man, Вы писали:

IM>(Естественно, принимается что вопрос alignment Foo и Bar решён (или они оба packed)).

А почему placement new тут не используется с параметром выравнивания?
Sic luceat lux!
Re: Когда это наконец станет defined behavior?
От: σ  
Дата: 27.04.23 18:06
Оценка: -2
Тебе зачем?
Re[6]: Когда это наконец станет defined behavior?
От: T4r4sB Россия  
Дата: 27.04.23 18:13
Оценка:
Здравствуйте, σ, Вы писали:

σ>А где в нём происходи что-нибудь из цитируемого?


Модификация константного объекта через неконстантный доступ.
Или "константный объект" это только то, что изначально объявлено с модификатором const, а не результат разыменования const&?
Re[2]: Когда это наконец станет defined behavior?
От: Ip Man Китай  
Дата: 27.04.23 18:24
Оценка:
Здравствуйте, Kernan, Вы писали:

K>А почему placement new тут не используется с параметром выравнивания?


Стандарт не гарантирует. Объект-то будет создан и даже default initialized, но нигде не сказано, что там останутся те же байты.
Re[7]: Когда это наконец станет defined behavior?
От: watchmaker  
Дата: 27.04.23 18:35
Оценка: +1
Здравствуйте, T4r4sB, Вы писали:

TB>Или "константный объект" это только то, что изначально объявлено с модификатором const, а не результат разыменования const&?


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

На одной пратформе компилятор может расположить его в обычной оперативной памяти, на другой — помеместить в области памяти с защитой от записи, на третьей — вообще оставить в ROM. Универсального ответа что произойдёт при попытке изменить такой объект нет — поэтому декларируется неопределённое поведение.
Re[3]: Когда это наконец станет defined behavior?
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 27.04.23 18:43
Оценка:
Здравствуйте, Ip Man, Вы писали:

IM>Здравствуйте, Kernan, Вы писали:


K>>А почему placement new тут не используется с параметром выравнивания?


IM>Стандарт не гарантирует. Объект-то будет создан и даже default initialized, но нигде не сказано, что там останутся те же байты.

Погоди. Это как? placement new же не меняет память, а работает поверх того что есть. Кроме того, вроде с POD точно должно быть нормально. Разве нет?
Sic luceat lux!
Re[4]: Когда это наконец станет defined behavior?
От: σ  
Дата: 27.04.23 18:54
Оценка: +1
IM>>Стандарт не гарантирует. Объект-то будет создан и даже default initialized, но нигде не сказано, что там останутся те же байты.
K>Погоди. Это как? placement new же не меняет память, а работает поверх того что есть.
https://timsong-cpp.github.io/cppwp/n4868/basic.indet#1
Re[5]: Когда это наконец станет defined behavior?
От: _NN_ www.nemerleweb.com
Дата: 27.04.23 18:58
Оценка: -1
Здравствуйте, T4r4sB, Вы писали:

TB>Здравствуйте, reversecode, Вы писали:


R>>https://habr.com/ru/articles/680008/


TB>Офигеть

TB>

TB>Modifying a const object through a non-const access path and referring to a volatile object through a non-volatile glvalue results in undefined behavior.

TB>То есть этот код содержит УБ?
TB>
TB>int g=0;

TB>int bar() {
TB>  ++g;
TB>  return g;
TB>}

TB>int foo(const int& a) {
TB>  return a + bar() + a;
TB>}

TB>int main() {
TB>  printf("%i\n", foo(g));
TB>}
TB>


Насколько я понимаю неопределённое поведение у нас только из-за разного порядка вычисления подвыражений в "a + bar() + a".

Если переписать как:
auto x = a + a;
auto y = bar();
return x + y;


То у нас будет всё определенно.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.