Size: a a a

2020 May 05

CD

Constantine Drozdov in pro.cxx
Побитый Кирпич
Хмм, в случае GetTokenInformation у нас Nominal это не тип TOKEN_MY_INFO, а массив байт как раз. В этом и заключается особенность. Там не обычная структура, а с хвостом из данных
Да не важно, оно все равно может там кастануть в массив байт и писать. А еще после GetTokenInformation может указатель сохранить, так что любой следующий вызов может в неё писать.
источник

ПК

Побитый Кирпич... in pro.cxx
Constantine Drozdov
Да не важно, оно все равно может там кастануть в массив байт и писать. А еще после GetTokenInformation может указатель сохранить, так что любой следующий вызов может в неё писать.
Ну дак получается любой массив байт можно кастить в любой тип теперь (если перед эти туда сделать placement new того типа), как это соотносится с алиасингом?
источник

CD

Constantine Drozdov in pro.cxx
Побитый Кирпич
Ну дак получается любой массив байт можно кастить в любой тип теперь (если перед эти туда сделать placement new того типа), как это соотносится с алиасингом?
Любое уб фактически перестает таким быть, если компилятор не увидел обе его компоненты
источник

ПК

Побитый Кирпич... in pro.cxx
Constantine Drozdov
Любое уб фактически перестает таким быть, если компилятор не увидел обе его компоненты
В данном случае компилятор видит создание массива из байт и каст этого массива в T. GetTokenInformation никак не влияет тут на уб-ость
источник

ПК

Побитый Кирпич... in pro.cxx
У нас все в с++ коде происходит как я и говорил
источник

CD

Constantine Drozdov in pro.cxx
Побитый Кирпич
В данном случае компилятор видит создание массива из байт и каст этого массива в T. GetTokenInformation никак не влияет тут на уб-ость
Ещё раз, почему не существует валидного для C++ способа реализовать GetTokenInformation?
источник

CD

Constantine Drozdov in pro.cxx
Сам по себе каст не убает, убает использование его результата
источник

ПК

Побитый Кирпич... in pro.cxx
Constantine Drozdov
Ещё раз, почему не существует валидного для C++ способа реализовать GetTokenInformation?
Потому что её интерфейс заставляет тебя делать каст char* -> T*
источник

ПК

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

CD

Constantine Drozdov in pro.cxx
Побитый Кирпич
Потому что её интерфейс заставляет тебя делать каст char* -> T*
Почему функция не может сделать обратный каст?
источник

ПК

Побитый Кирпич... in pro.cxx
Constantine Drozdov
Почему функция не может сделать обратный каст?
Не важно что делает функция, у нас char* на входе и char* на выходе
источник

ПК

Побитый Кирпич... in pro.cxx
Там такой пример примерно:

std::vector<char> buf;
DWORD size;
GetTokenInformation(nullptr, &size);
buf.resize(size);
GetTokenInformation(buf.data(), &size);
auto* info = (TOKEN_INFO*)buf.data();
источник

CD

Constantine Drozdov in pro.cxx
Побитый Кирпич
Там такой пример примерно:

std::vector<char> buf;
DWORD size;
GetTokenInformation(nullptr, &size);
buf.resize(size);
GetTokenInformation(buf.data(), &size);
auto* info = (TOKEN_INFO*)buf.data();
Там плейсмент нью
источник

ПК

Побитый Кирпич... in pro.cxx
Constantine Drozdov
Там плейсмент нью
Ну, то есть то что я написал выше правильно?
источник

ПК

Побитый Кирпич... in pro.cxx
Переслано от Побитый Кирпич...
Ну дак получается любой массив байт можно кастить в любой тип теперь (если перед эти туда сделать placement new того типа), как это соотносится с алиасингом?
источник

CD

Constantine Drozdov in pro.cxx
Побитый Кирпич
Переслано от Побитый Кирпич
Ну дак получается любой массив байт можно кастить в любой тип теперь (если перед эти туда сделать placement new того типа), как это соотносится с алиасингом?
Ну вектор если что аллокает массив байт и делает плейсмент нью, это валидный код же
источник

CD

Constantine Drozdov in pro.cxx
И я не знаю, надо ли номинально вызывать деструктора чаров в коде выше в рамках любого из стандартов C++
источник

CD

Constantine Drozdov in pro.cxx
Побитый Кирпич
Переслано от Побитый Кирпич
Ну дак получается любой массив байт можно кастить в любой тип теперь (если перед эти туда сделать placement new того типа), как это соотносится с алиасингом?
вот это все еще валидный код
std::vector<uint32_t> buf;
DWORD size;
GetTokenInformation(nullptr, &size);
buf.resize(size);
GetTokenInformation(buf.data(), &size);
auto* info = (TOKEN_INFO*)buf.data();
источник

CD

Constantine Drozdov in pro.cxx
да, заметь, что strict aliasing запрещает тебе одновременно использовать buf и info в моей версии (и не запрещает в твоей)
источник

ПК

Побитый Кирпич... in pro.cxx
Constantine Drozdov
вот это все еще валидный код
std::vector<uint32_t> buf;
DWORD size;
GetTokenInformation(nullptr, &size);
buf.resize(size);
GetTokenInformation(buf.data(), &size);
auto* info = (TOKEN_INFO*)buf.data();
А это валидный?

float* f = new float(0.0f);
hack_cxx(f);
auto* i = (int*)f;
*i = 0;

Где hack_cxx это extern C функция
источник