Size: a a a

2020 May 05

A

Alex in pro.cxx
поиск по 0593 дал 0 результатов
источник

A

Alex in pro.cxx
Constantine Drozdov
Запрещен не каст, а использование результатов этого каста для чтения/записи, так что с вызовом винапи функции (да и любой С функции, скажем, strlen), код которой заведомо недоступен C++ компилятору, все хорошо
я так понял, проблема не передать в С, а разобрать в С++ данные, которые функция заполнила
источник

CD

Constantine Drozdov in pro.cxx
Alex
я так понял, проблема не передать в С, а разобрать в С++ данные, которые функция заполнила
С++ компилятор обязан считать, что эта функция могла изменить данные как положено, так что проблем нет
источник

ПК

Побитый Кирпич... in pro.cxx
Constantine Drozdov
Запрещен не каст, а использование результатов этого каста для чтения/записи, так что с вызовом винапи функции (да и любой С функции, скажем, strlen), код которой заведомо недоступен C++ компилятору, все хорошо
Ну вот я и говорю что либо эту функцию нельзя юзать в с++, либо (её все юзают) msvc не будет это ломать оптимизациям никогда.
источник

CD

Constantine Drozdov in pro.cxx
преобразование Nominal* -> Random* -> Nominal* через reinterpret_cast разрешено, так что компилятор никак не может предполагать, что если Random* передан как параметр в недоступный код, то исходный *(Nominal*) не изменялся
источник

CD

Constantine Drozdov in pro.cxx
Побитый Кирпич
Ну вот я и говорю что либо эту функцию нельзя юзать в с++, либо (её все юзают) msvc не будет это ломать оптимизациям никогда.
см. выше
источник

ПК

Побитый Кирпич... in pro.cxx
Constantine Drozdov
см. выше
Дак каст произойдет в с++ коде, я не понимаю к чему сообщение выше
источник

CD

Constantine Drozdov in pro.cxx
Побитый Кирпич
Дак каст произойдет в с++ коде, я не понимаю к чему сообщение выше
ну напиши пример кода и почему по-твоему это убнет
источник

CD

Constantine Drozdov in pro.cxx
а я тебе построю корректную с точки зрения С++ реализацию GetTokenInformation
источник

ПК

Побитый Кирпич... in pro.cxx
Constantine Drozdov
преобразование Nominal* -> Random* -> Nominal* через reinterpret_cast разрешено, так что компилятор никак не может предполагать, что если Random* передан как параметр в недоступный код, то исходный *(Nominal*) не изменялся
Вроде понял
источник

CD

Constantine Drozdov in pro.cxx
Побитый Кирпич
Дак каст произойдет в с++ коде, я не понимаю к чему сообщение выше
короче, принцип очень простой: extern "C" strlen грубо выходит за границы массива, это UB в C++ и не имеет никаких последствий до тех пор, пока С++ компилятор не знает код strlen
источник

CD

Constantine Drozdov in pro.cxx
при этом, увы, компилятор С++ попросту обязан предполагать совершенно любую возможную реализацию, так что extern "C" функция совершенно точно захватывает и отпускает мьютекс и записывает все переданные и глобальные переменные по их номинальному типу
источник

CD

Constantine Drozdov in pro.cxx
что характерно, это в точности то же самое, что происходит с виртуальными вызовами
источник

ПК

Побитый Кирпич... in pro.cxx
Constantine Drozdov
преобразование Nominal* -> Random* -> Nominal* через reinterpret_cast разрешено, так что компилятор никак не может предполагать, что если Random* передан как параметр в недоступный код, то исходный *(Nominal*) не изменялся
Хмм, в случае GetTokenInformation у нас Nominal это не тип TOKEN_MY_INFO, а массив байт как раз. В этом и заключается особенность. Там не обычная структура, а с хвостом из данных
источник

ПК

Побитый Кирпич... in pro.cxx
То есть тут как раз каст
char* -> char*(или void*, не помню) -> TOKEN_INFO*
источник

ПК

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

DF

Dollar Føølish in pro.cxx
Так чар не портит альясинг
источник

DF

Dollar Føølish in pro.cxx
Его хоть реинтерпретом ебашь
источник

ПК

Побитый Кирпич... in pro.cxx
Dollar Føølish
Так чар не портит альясинг
Есть мнение что каст char* -> T* некорректен
источник

DF

Dollar Føølish in pro.cxx
А, вон что
источник