Size: a a a

2020 June 22

ПК

Побитый Кирпич... in pro.cxx
Andrew Titov
> не начинает время жизни
А это ведь поправили в C++20, так?
То ли в С++20, то ли в С++23, постоянно путаюсь
источник

VS

Vlad Serebrennikov in pro.cxx
Побитый Кирпич
То ли в С++20, то ли в С++23, постоянно путаюсь
источник

VS

Vlad Serebrennikov in pro.cxx
20
источник

AT

Andrew Titov in pro.cxx
Побитый Кирпич
То ли в С++20, то ли в С++23, постоянно путаюсь
Кажется, успели втащить в C++20:
https://habr.com/company/yandex/blog/488588/
источник

ПК

Побитый Кирпич... in pro.cxx
Ну и здорово, теперь буква закона соблюдена будет
источник

m

magras in pro.cxx
Наоборот, теперь возникает проблема с тем, что структура с указателем будет инициализированна битовым нулем, который может быть не равен nullptr.
источник

S

Serg in pro.cxx
Vlad Serebrennikov
а он у них когда-то был? я лишь помню, что на MSDN было четко написано, что си поддерживается лишь в той части, в которой он совместим с с++
cl /TC ..  будет компилить код по правилам C
например  преобразовывать неявно void*  в любые указатели
источник

ПК

Побитый Кирпич... in pro.cxx
magras
Наоборот, теперь возникает проблема с тем, что структура с указателем будет инициализированна битовым нулем, который может быть не равен nullptr.
Всмысле?
источник

m

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

ПК

Побитый Кирпич... in pro.cxx
Serg
cl /TC ..  будет компилить код по правилам C
например  преобразовывать неявно void*  в любые указатели
По сути это переключение компиляторов С/С++
источник

ПК

Побитый Кирпич... in pro.cxx
Но .c файлы он уже такими считает
источник

VS

Vlad Serebrennikov in pro.cxx
magras
Наоборот, теперь возникает проблема с тем, что структура с указателем будет инициализированна битовым нулем, который может быть не равен nullptr.
Added wording to make allocation functions implicitly produce the "correct" pointer value.
источник

VS

Vlad Serebrennikov in pro.cxx
это то, что изменили к 6 ревизии той бумаги
источник

m

magras in pro.cxx
Vlad Serebrennikov
Added wording to make allocation functions implicitly produce the "correct" pointer value.
Я не представляю какой вординг позволит компилятору угадать к какой структуре я скастую и в каком месте этой структуры он должен подменить битовый ноль на nullptr.
источник

VS

Vlad Serebrennikov in pro.cxx
magras
Я не представляю какой вординг позволит компилятору угадать к какой структуре я скастую и в каком месте этой структуры он должен подменить битовый ноль на nullptr.
я ошибся
там речь идет об указателе, который возвращает malloc
источник

ПК

Побитый Кирпич... in pro.cxx
magras
Формально это конечно проблема программиста - фактически он сделал каст битового нуля к указателю. Но это неприятные грабли.
Дак что это меняет? До этого пропозала то же самое было
источник

m

magras in pro.cxx
Побитый Кирпич
Дак что это меняет? До этого пропозала то же самое было
struct S {
 void* p;
};

S* s = reinterpret_cast<S*>(calloc(sizeof(int))); // note this memory guaranteed to be filled with zeros
assert(s->p == nullptr);

Такой код был UB. В 20ом стандарте UB нет, но срабатывание assert'а зависит от битового представления nullptr.
источник

VS

Vlad Serebrennikov in pro.cxx
magras
Я не представляю какой вординг позволит компилятору угадать к какой структуре я скастую и в каком месте этой структуры он должен подменить битовый ноль на nullptr.
он так-то знает, время жизни какого объекта в том куске памяти начинается. и еще стандарт говорит, что время жизни подобъектов, которые принадлежат к implicit-lifetime типам, начинается вместе с самим объектом. (указатели к этим типам относятся)
источник

S

Serg in pro.cxx
magras
struct S {
 void* p;
};

S* s = reinterpret_cast<S*>(calloc(sizeof(int))); // note this memory guaranteed to be filled with zeros
assert(s->p == nullptr);

Такой код был UB. В 20ом стандарте UB нет, но срабатывание assert'а зависит от битового представления nullptr.
у calloc 2 аргумента и  sizeof(int) может быть < sizeof(S*)
источник

VS

Vlad Serebrennikov in pro.cxx
поэтому что-то делать точно придется
источник