Size: a a a

2021 March 28

ПК

Побитый Кирпич... in pro.cxx
Boris Usievich
Они не сишные, они такие везде :)
Везде их можно возвращать из функции, принимать в параметрах, а в С это недоразумение, которое юзали потому что не было альтернатив
источник

СК

Сергей Казьмин... in pro.cxx
Всем привет. Никто не сталкивался с таким багом(?), странным поведением(??) линковщика в MSVC: каким-то непонятным хреном на сборочном конвейере он вместо нормального адреса локальной переменной вставляет нулевое смещение в push перед вызовом функции, получается такая дичь:
```
68 00 00 00 10       push    offset __ModuleEntry
E8 DD EF FE FF      call    foo
```

Потом при загрузке либы (dll), это место естественно преобразуется в адрес на начало модуля ну и всё -  падаем с access violation.

Есть идеи каким образом до такого можно было дойти, если только не багом линкера?
источник

C

Chuvi in pro.cxx
Сергей Казьмин
Всем привет. Никто не сталкивался с таким багом(?), странным поведением(??) линковщика в MSVC: каким-то непонятным хреном на сборочном конвейере он вместо нормального адреса локальной переменной вставляет нулевое смещение в push перед вызовом функции, получается такая дичь:
```
68 00 00 00 10       push    offset __ModuleEntry
E8 DD EF FE FF      call    foo
```

Потом при загрузке либы (dll), это место естественно преобразуется в адрес на начало модуля ну и всё -  падаем с access violation.

Есть идеи каким образом до такого можно было дойти, если только не багом линкера?
Может он ожидал что-то вроде отложенной загрузки dll?
источник

СК

Сергей Казьмин... in pro.cxx
А как это связано с проблемой? Там локальная переменная с нулевым адресом, вряд ли дело во времени загрузки...
источник

АК

Александр Караев... in pro.cxx
Сергей Казьмин
А как это связано с проблемой? Там локальная переменная с нулевым адресом, вряд ли дело во времени загрузки...
А переменная точно локальная? И не static?
источник

СК

Сергей Казьмин... in pro.cxx
OSVERSIONINFOEXW* oi; <--- переменная
uint32_t retCode;

if (OK == (retCode = detail::GetOSVersionInfoPtr(&oi))) ....

Ну и функция ещё помечена inline, но вряд ли это имеет значение
источник

IZ

Ilia Zviagin in pro.cxx
Сергей Казьмин
Всем привет. Никто не сталкивался с таким багом(?), странным поведением(??) линковщика в MSVC: каким-то непонятным хреном на сборочном конвейере он вместо нормального адреса локальной переменной вставляет нулевое смещение в push перед вызовом функции, получается такая дичь:
```
68 00 00 00 10       push    offset __ModuleEntry
E8 DD EF FE FF      call    foo
```

Потом при загрузке либы (dll), это место естественно преобразуется в адрес на начало модуля ну и всё -  падаем с access violation.

Есть идеи каким образом до такого можно было дойти, если только не багом линкера?
Надо код
источник

IZ

Ilia Zviagin in pro.cxx
Сергей Казьмин
OSVERSIONINFOEXW* oi; <--- переменная
uint32_t retCode;

if (OK == (retCode = detail::GetOSVersionInfoPtr(&oi))) ....

Ну и функция ещё помечена inline, но вряд ли это имеет значение
Которая функция помечена?
источник

СК

Сергей Казьмин... in pro.cxx
Ilia Zviagin
Надо код
https://godbolt.org/z/c5rxPedMj

Ну и ещё забыл сказать, что такие спецэффекты наблюдаются только при отключенной оптимизации
источник

АК

Александр Караев... in pro.cxx
Сергей Казьмин
OSVERSIONINFOEXW* oi; <--- переменная
uint32_t retCode;

if (OK == (retCode = detail::GetOSVersionInfoPtr(&oi))) ....

Ну и функция ещё помечена inline, но вряд ли это имеет значение
static OSVERSIONINFOEXW oiCache;
Больше похоже, что дело всё-таки в ней
источник

АВ

Александр Водянников... in pro.cxx
Кстати да, посмотри описание функции своей
источник

СК

Сергей Казьмин... in pro.cxx
Александр Караев
static OSVERSIONINFOEXW oiCache;
Больше похоже, что дело всё-таки в ней
А в чём примерно может быть проблема со статической переменной здесь? Не могу просто понять, что может идти не так
источник

АК

Александр Караев... in pro.cxx
Сергей Казьмин
А в чём примерно может быть проблема со статической переменной здесь? Не могу просто понять, что может идти не так
Статическая переменная ~= глобальная. DLL грузится по неопределенному адресу в памяти, поэтому и адреса всех глобальных переменных заранее неизвестны. Чтобы их определить, используется механизм relocation table. Так что на дизасм не стоит полагаться, пока DLL не прогрузилась и все адреса не пофиксились.

Кстати, до Windows Vista есть некоторые проблемы со статическими переменными (с их thread-safe инициализацией).
источник

СК

Сергей Казьмин... in pro.cxx
Так дело не только в дизасме. В студийном дебаггере смотрел тоже. Там загрузчик действительно просуммировал адрес с базовым адресом загрузки модуля, только вот беда в том, что ModuleEntry + 0 = ModuleEntry

Следовательно, там просто лежит адрес на начало модуля

В этом и проблема, так как стреляет access violation-ом очень больно
источник

s

shadow krutoi🍀 in pro.cxx
всем здравствуйте!
подскажите, кто работает в VS Code, как изменить стандарт языка на C++20? уже всё перепробовал, ничего не помогает...
источник

LA

Liber Azerate in pro.cxx
shadow krutoi🍀
всем здравствуйте!
подскажите, кто работает в VS Code, как изменить стандарт языка на C++20? уже всё перепробовал, ничего не помогает...
@supapro Зайти в параметры проекта -> С/С++ -> стандарт языка(примерно)
источник

D

Danya in pro.cxx
Liber Azerate
@supapro Зайти в параметры проекта -> С/С++ -> стандарт языка(примерно)
Это ты про VS, а не VSCode
источник

s

shadow krutoi🍀 in pro.cxx
если бы это была Visual Studio, то я так и поступил бы))
источник

s

shadow krutoi🍀 in pro.cxx
тут же миллион конфигов, уже везде всё выставил, но версия всё та же - 201402...
источник

Е

Егор in pro.cxx
shadow krutoi🍀
тут же миллион конфигов, уже везде всё выставил, но версия всё та же - 201402...
Проверяешь с помощью __cplusplus?
источник