Size: a a a

2020 June 22

ПК

Побитый Кирпич... in pro.cxx
Serg
Если в функцию поступает указатель, компилятор не встраивает проверок что указатель валидный
Компилятор может выпилить проверку на null, если перед ней ты сделал разыменование (а такое разыменование может прийти из inline фукнции, которая перед этим вызвалась). Вообщем, минус нога обеспечена
источник

m

magras in pro.cxx
Serg
Сравнением не ограничиваются.   Еще есть выравнивание, то есть делимость численных значений указателя на 2,4,8...
На сколько я помню, обратно в указатель можно преобразовать только то значение, которое было получено из указателя. То есть
std::byte* buf = new std::buf[2];
std::uintptr_t i = static_cast<std::uintptr_t>(buf);
std::byte* b0 = static_cast<std::byte*>(i); // OK
std::byte* b1 = static_cast<std::byte*>(i+1); // UB
источник

S

Serg in pro.cxx
Побитый Кирпич
Когда валидность кода зависит от оптимизаций это гавнокод, очевидно)
Нет, C - системный язык, и на нём пишут платформенно-зависимые вещи
в библиотеке msvcrt есть участки где оптимизацию выключают , потому что поведение меняется
источник

ПК

Побитый Кирпич... in pro.cxx
Serg
Нет, C - системный язык, и на нём пишут платформенно-зависимые вещи
в библиотеке msvcrt есть участки где оптимизацию выключают , потому что поведение меняется
Я более чем уверен, что писать на системном языке можно по стандарту, а не через гавнокод и отключение оптимизаций
источник

⛧ ᛡᚢᚾᛁ Connor41 ᚳᚩᛞ ... in pro.cxx
Побитый Кирпич
Я более чем уверен, что писать на системном языке можно по стандарту, а не через гавнокод и отключение оптимизаций
+
источник

IK

Ildar Khabatulin in pro.cxx
Serg
Нет, C - системный язык, и на нём пишут платформенно-зависимые вещи
в библиотеке msvcrt есть участки где оптимизацию выключают , потому что поведение меняется
Вы путаете UB и implementation defined. UB может меняться хоть от минорной к минорной версиям компилятора, а то и вообще от контекста зависеть. То, что вам когда-то повезло, ничего не гарантирует
источник

S

Serg in pro.cxx
Побитый Кирпич
Я более чем уверен, что писать на системном языке можно по стандарту, а не через гавнокод и отключение оптимизаций
в стандарт включено только поведение которое удалось обобщить для разных платформ
это не должно ограничивать использование платформенозависимых фич
источник

IK

Ildar Khabatulin in pro.cxx
Serg
в стандарт включено только поведение которое удалось обобщить для разных платформ
это не должно ограничивать использование платформенозависимых фич
UB тоже стандартизировано, просто стандарт говорит, что в таких случаях компилятор может делать всё, что ему вздумается, т.к. стандарт предполагает, что такого быть не может.
источник

S

Serg in pro.cxx
magras
На сколько я помню, обратно в указатель можно преобразовать только то значение, которое было получено из указателя. То есть
std::byte* buf = new std::buf[2];
std::uintptr_t i = static_cast<std::uintptr_t>(buf);
std::byte* b0 = static_cast<std::byte*>(i); // OK
std::byte* b1 = static_cast<std::byte*>(i+1); // UB
ну уж не static_cast а reinterpret_cast
источник

m

magras in pro.cxx
Serg
в стандарт включено только поведение которое удалось обобщить для разных платформ
это не должно ограничивать использование платформенозависимых фич
Так то что nullptr в битовом представлении может быть не равен нулю никак не ограничивает. Оно именно что позволяет использовать любой платформозависимый адресс в качестве nullptr.
источник

IK

Ildar Khabatulin in pro.cxx
К слову, насколько "что угодно" может быть: https://feross.org/gcc-ownage/
источник

S

Serg in pro.cxx
magras
Так то что nullptr в битовом представлении может быть не равен нулю никак не ограничивает. Оно именно что позволяет использовать любой платформозависимый адресс в качестве nullptr.
позволяет, но смысла делать реализцию где   nullptr предстваляется не нулевыми битами нет
это затруднит и написание компилятора и написание программ
источник

m

magras in pro.cxx
Serg
позволяет, но смысла делать реализцию где   nullptr предстваляется не нулевыми битами нет
это затруднит и написание компилятора и написание программ
Программам по фигу, потому что когда ты пишешь if (p) или if (p != 0) компилятор будет делать сравнение с nullptr, а не битовыым нулем.
источник

AD

Andrey Davydov in pro.cxx
Если я усну и проснусь через сто лет и меня спросят, что сейчас обсуждают в pro.cxx, я отвечу: равен ли 0 nullptr и можно ли его разыменовывать.
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
И вла
источник

S

Serg in pro.cxx
magras
Программам по фигу, потому что когда ты пишешь if (p) или if (p != 0) компилятор будет делать сравнение с nullptr, а не битовыым нулем.
этими шаблонами код не ограничивается
источник

AB

Artöm Bakri Al-Sarmi... in pro.cxx
Serg
позволяет, но смысла делать реализцию где   nullptr предстваляется не нулевыми битами нет
это затруднит и написание компилятора и написание программ
Это никак не влияет на написание ни того, ни другого
источник

m

magras in pro.cxx
Serg
этими шаблонами код не ограничивается
Ну окей, можно писать код с UB. Я не думаю, что кому-то в этом чате такое интересно.
источник

S

Serg in pro.cxx
Ildar Khabatulin
Вы путаете UB и implementation defined. UB может меняться хоть от минорной к минорной версиям компилятора, а то и вообще от контекста зависеть. То, что вам когда-то повезло, ничего не гарантирует
Ну если уж уточнять, то  взаимное преобразование  pointer <->  integer types  именно "Implementation-defined", а не UB
источник

S

Serg in pro.cxx
вот еще аргумент почему реализациям плохо делать ненулевой nullptr:
инициализация структур через  calloc() не будет работать
источник