cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

std::bit_cast<T*> должен проверять выравнивание #318

Closed apolukhin closed 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +3, -1 Автор идеи: ilnurkh

в текущем предложение к C++20 std::bit_cast<T> не отличается от reintrepret_cast<T>

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

apolukhin commented 3 years ago

yndx-antoshkka, 9 января 2019, 21:45 Мне ответил автор bit_cast приблизительно следующее:

Ему не кажется данное предложение хорошей идеей, т.к. bit_cast это no-op меняющий тип у битов. Alignment ортогонален bit_cast, так как проблема не возникает при представлении битов, а лишь при попытке такой указатель разадресовать. Подобное ловится санитайзерами, и может быть вполне валидным кодом в ряде случаев, где полученные указатели не разадресоввываются. В добавок, добавление подобного SFINAE пагубно повлияет на переносимость кода, так как alignment сильно различается на ряде платформ.

У кого какие идеяи/коментарии?

Andrey Davydov, 23 января 2019, 0:07 yndx-antoshkka, в первой ревизии bit_cast ведь в принципе не мог работать с указателями. И хотя от этого решили отказаться, конвертирование указателей по-прежнему не имеет смысла, разыменование сконвертированного указателя все так же нарушает aliasing rules, так что какой смысл накладывать ограничения на alignment?

yndx-antoshkka, 24 января 2019, 17:12 Andrey Davydov, может не нарушать aliasing rules если конвертирование идёт от/к char/unsigned char/byte. Но это скорее граничные случаи.

Кажется что имеет смысл наложить ограничение и на aliasing... Но получается как-то стрёмненько. Может просто забанить конвертирование указателей?

Andrey Davydov, 24 января 2019, 17:30

Может просто забанить конвертирование указателей?

Так в R0 оно было забанено, но от этого отказались в R1. Мотивация тут: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0476r1.html#rev, то что заворачивание указателя в структуру ломает этот запрет.

yndx-antoshkka, 20 июля 2020, 20:08 Предложение отклонили, сказав что заворачивание в структуру слишком легко ломает этот кейс. Так же сказали, что кастование из std::byte например в int является нормой, и проверять должна не эта функция, а сам пользователь (функция низкоуровневая и не должна иметь оверхед)