Size: a a a

2020 May 05

CD

Constantine Drozdov in pro.cxx
Alex
std::vector<char> buf;
DWORD size;
GetTokenInformation(nullptr, &size);
buf.resize(size);
GetTokenInformation(buf.data(), &size);
auto* info = (TOKEN_INFO*)buf.data(); // <- !!!UB!!!!
Во-первых каст это не UB
источник

A

Alex in pro.cxx
Sergey Skvortsov
Там запрещен доступ через lvalue неправильного типа, а кастовать сами указатели можно
ну мы кастуем, чтобы разыменовать, а не для красоты же
источник

ПК

Побитый Кирпич... in pro.cxx
Sergey Skvortsov
Там запрещен доступ через lvalue неправильного типа, а кастовать сами указатели можно
Ну после каста подразумевается доступ
источник

CD

Constantine Drozdov in pro.cxx
Alex
ну мы кастуем, чтобы разыменовать, а не для красоты же
void GetTokenInfo(char* buf, size_t size) {
  new(buf) TOKEN_INFO{};
}
источник

A

Alex in pro.cxx
Constantine Drozdov
Во-первых каст это не UB
окей, разыменование info - UB. Я предполагаю, что оно дальше в коде есть, иначе это всё бессмысленные действия
источник

A

Alex in pro.cxx
Constantine Drozdov
void GetTokenInfo(char* buf, size_t size) {
  new(buf) TOKEN_INFO{};
}
и как это относится к теме обсуждения?
источник

CD

Constantine Drozdov in pro.cxx
Alex
и как это относится к теме обсуждения?
ну ваш код убает при такой реализации GetTokenInfo?
источник

AT

Andrew Titov in pro.cxx
источник

A

Alex in pro.cxx
реализация компилятору не видна, так что это не важно. И я думаю, что да, убает
источник

CD

Constantine Drozdov in pro.cxx
Alex
реализация компилятору не видна, так что это не важно. И я думаю, что да, убает
ну тогда у вас std::vector убает
источник

A

Alex in pro.cxx
спорно, вся реализация вектора компилятору видна. Но это интересный вопрос, я не знаю, как вектор из char* получает T*
источник

CD

Constantine Drozdov in pro.cxx
Alex
спорно, вся реализация вектора компилятору видна. Но это интересный вопрос, я не знаю, как вектор из char* получает T*
я читаю по указателю info область памяти, в которой процветает лайфтайм TOKEN_INFO, в чем проблема-то
источник

A

Alex in pro.cxx
и есть ли там вообще char*. Он может выделять new T[N]
источник

CD

Constantine Drozdov in pro.cxx
Alex
и есть ли там вообще char*. Он может выделять new T[N]
я уклонюсь от вызова деструктора char-ов, если он обязателен
источник

A

Alex in pro.cxx
Constantine Drozdov
я читаю по указателю info область памяти, в которой процветает лайфтайм TOKEN_INFO, в чем проблема-то
нельзя кастить char* в TOKEN_INFO*, и точка. В правилах strict aliasing нет вординга про лайфтайм.
источник

CD

Constantine Drozdov in pro.cxx
Alex
нельзя кастить char* в TOKEN_INFO*, и точка. В правилах strict aliasing нет вординга про лайфтайм.
а можно цитату из правил пожалуйста?
источник

CD

Constantine Drozdov in pro.cxx
я не зря про доступ говорил, strict aliasing это правила чтения/записи памяти
источник

A

Alex in pro.cxx
Constantine Drozdov
а можно цитату из правил пожалуйста?
https://gist.github.com/shafik/848ae25ee209f698763cffee272a58f8
пункт "What the C++17 Draft Standard say"
источник

A

Alex in pro.cxx
так мы всё это делаем для type punning, чтобы читать массив байт как TOKEN_INFO
источник

CD

Constantine Drozdov in pro.cxx
Alex
https://gist.github.com/shafik/848ae25ee209f698763cffee272a58f8
пункт "What the C++17 Draft Standard say"
If a program attempts to access the stored value of an object through a glvalue of other than one of the following types the behavior is undefined
 a cv-qualified version of the dynamic type of the object,
источник