Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / ACHTUNG Баг в linker'e msvc!! (2 стр)

ACHTUNG Баг в linker'e msvc!! (2 стр)

Поделиться

Страницы: 1 2

-Eugene-Постоялецwww7 ноя. 201715:47#15
StiX
> TL;DR можно?
> Как всегда баг оказался в программисте, а не в компиляторе?
-Eugene-
> как обычно кто-то нарвался на UB, и жалуется на баг компилятора линкера
-Eugene-
> За каким-то хреном функция объявлена как static в хидере. Предвижу, что замена
> static на inline все вылечит.
fsmokeПостоялецwww7 ноя. 201715:52#16
а каково поведение gcc на этот счет?
Blew_zcПостоялецwww7 ноя. 201715:56#17
fsmoke
> а каково поведение gcc на этот счет?
А зачем тебе?)
fsmokeПостоялецwww7 ноя. 201715:59#18
Blew_zc
> А зачем тебе?)

спортивный интерес :)

я к тому - а точно ли это UB? ну создали мы 2 фции с одним именем - ну будем вызывать каждую в своём тю - это ж вроде как разрешено

fsmokeПостоялецwww7 ноя. 201716:03#19
-Eugene-
> Что, как обычно кто-то нарвался на UB, и жалуется на баг компилятора линкера?

ну раз ты так уверен - расскажи что именно тут UB?

-Eugene-Постоялецwww7 ноя. 201716:27#20
fsmoke
> ну раз ты так уверен - расскажи что именно тут UB?
Ну может и не UB, хз. Я не настолько хорошо знаю стандарт крестов. Но это стремненький код, который я бы не стал писать.

После раскрытия инклудов получается код вроде
class object_helper { ... }
static object_helper& get_helper() { ... }
class object { ... get_helper() ... }

get_helper в каждом модуле свой (ибо статический), а значит, object тоже в каком-то смысле в каждом модуле свой собственный (из-за каких-нибудь инлайнов)
А это уже нарушение ODR. Ты линкуешь два объектника, в которых под одним именем живут разные объекты.
И смерживая два разных object-а линкер взял init из одного объектника, а free из другого.

Правка: 7 ноя. 2017 16:32

TelVoltПостоялецwww7 ноя. 201723:29#21
Проверил на MinGW в дебаге.

При последовательности main - someone:
object_helper ctor
object_helper load
object_helper unload
object_helper dtor

При последовательности someone - main:
object_helper ctor
object_helper load
object_helper ctor
object_helper unload
object_helper dtor
object_helper dtor

Внезапно.

WraithПостоялецwww8 ноя. 20177:12#22
Я тут на свежую голову подумал, таки да, нарушение ODR для класса object. Лексическая привязка к локальному статику нарушает эквивалентность определений типа в разных translation unit'ах.
BishopПостоялецwww8 ноя. 20178:11#23
-Eugene-
> Что, как обычно кто-то нарвался на UB, и жалуется на баг компилятора линкера?
У компоновщика вроде как нету никаких UB, по идеи он даже не знает с какого языка были созданы объектные файлы.

> Я не настолько хорошо знаю стандарт крестов.
Линкер это уже вне границ ЯП. Это своя отдельная сущность с правилами общими не для ЯП, а для ОС.

> А это уже нарушение ODR.
Которую обязан обнаруживать линкер. Фокус скорее всего в том, что компилятор С++ для переменных использует несколько другие имена в реальности. Если посмотреть файлы objdump`ом, то что в них?

-Eugene-Постоялецwww8 ноя. 201710:21#24
Bishop
> У компоновщика вроде как нету никаких UB, по идеи он даже не знает с какого
> языка были созданы объектные файлы.
UB в крестовом смысле может и нет. А в смысле "никто не знает, как оно работает с malformed объектниками" может и есть.

Насколько я понял, линкер может игнорировать дублированые определения одного имени.
https://stackoverflow.com/questions/35233468/what-do-linkers-actu… ine-functions

> Которую обязан обнаруживать линкер.
Не вижу никаких гарантий такого поведения. ODR - изначальное требование для линкера, а чтобы его проверить, нужно сравнить между собой все "тела" inline-функций с одним именем. Это может быть тяжоленько.

war_zesПостоялецwww8 ноя. 201712:12#25
Попробовать сделать asm листинг и глянуть что там?
в студии же это удобно делать.
и вроде да, имена глоб переменным там с добавлением кракозябр
fsmokeПостоялецwww9 ноя. 201719:51#26
Совсем не было времени. Тут совещания нагрянули. Завтра может посмотрю листинг.

Возбудились кстати в микрософте:

Thanks for taking the time to report this issue to us. I’ve filed a bug for this issue on the C++ team here. The status on this Developer Community item will be updated as that bug is looked at. Thanks again for reporting this to us.

Ждём что скажут

TelVoltПостоялецwww9 ноя. 201721:57#27
Всё-таки больше похоже на ODR. Учитывая, что в MinGW, который почти GCC, то же самое.
/A\Постоялецwww10 ноя. 20171:29#28
Странно что кого-то еще удивляют баги в студии. Когда я нахожу очередной баг, просто обхожу его и продолжаю работать, один раз написал им баг репорт, спустя 3-4 месяца они сказали что пофиксили, но я до сих пор спокойно обращаюсь к протектед шаблонам вне класса))

Недавно словил баг со статиками: в разных цпп фалах были объявлены одинаковые статики, но с разными типами, а при запуске 2 раза вызывался один из конструкторов, только смена имени помогла...

Страницы: 1 2

/ Форум / Программирование игр / Общее

2001—2017 © GameDev.ru — Разработка игр