Ух ты, ух ты... Это что ж такое творится-то :(
От: Amygdala Россия  
Дата: 05.12.18 08:40
Оценка: :))) :)
Долбился сейчас три часа об баг. И это просто жесть.

Короче, есть библиотечка. Где-то внутри нее, никак не опознаваемый и не видимый снаружи библиотечки есть некий класс с названием MySuperClass и в одном из файлов статический объект

static MySuperClass* global_super = NULL;

Сделано это было давно и уже забыто.

Но вот в основном приложении, который юзает эту библиотечку мне понадобился схожий функционал этого класса, но немного другой.

Я взял, копирнул тот класс и сам статический объект из библиотечки и класс изменил как мне надо. А вот названия класса и имя статического объекта — не изменил.

Ну и началось. Падение на любом обращении к любому члена класса.

Долбежка башкой об клавиатуру и создание пустых проектов с таким же классом (без библиотечки) приводило к тому, что все работало.
Пока мне не стрельнуло переименовать класс и статический объект. И конечно же все заработало. Он падал на обращении к полям класса, которых не было в классе внутри библиотеки.

Это что ж такое-то!!! ((

Это хорошо еще у меня были исходники библиотеки. А если б я случайно назвал класс и переменную так же как создатели библиотеки — да этот баг вообще бы никогда не поймался бы.

Вот это жесть!!! ((
Re: Ух ты, ух ты... Это что ж такое творится-то :(
От: Chorkov Россия  
Дата: 05.12.18 08:46
Оценка:
Здравствуйте, Amygdala, Вы писали:

>...


И никаких предупреждений компилятора о том что функции и переменный определены в двух единицах трансляци? Сплошные inline?
Re[2]: Ух ты, ух ты... Это что ж такое творится-то :(
От: Amygdala Россия  
Дата: 05.12.18 08:49
Оценка:
Здравствуйте, Chorkov, Вы писали:


C>И никаких предупреждений компилятора о том что функции и переменный определены в двух единицах трансляци? Сплошные inline?


Все целиком определено и заимплеменчено в cpp-файлах. Это не паблик классы, они нужны только в одном файле и в одном узком месте. Потому собственно и объект был статическим — потому что про этот класс вне этого фала, где он определен — вообще никто не знает.
Re[3]: Unnamed namespace
От: Qbit86 Кипр
Дата: 05.12.18 08:57
Оценка:
Здравствуйте, Amygdala, Вы писали:

A>Все целиком определено и заимплеменчено в cpp-файлах. Это не паблик классы, они нужны только в одном файле и в одном узком месте. Потому собственно и объект был статическим — потому что про этот класс вне этого фала, где он определен — вообще никто не знает.


A>А если б я случайно назвал класс и переменную так же как создатели библиотеки — да этот баг вообще бы никогда не поймался бы.


Класс надо поместить в безымянное пространство имён.
Глаза у меня добрые, но рубашка — смирительная!
Re[4]: Unnamed namespace
От: Amygdala Россия  
Дата: 05.12.18 08:58
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Класс надо поместить в безымянное пространство имён.


Пххх, дак это задним-то числом понятно все, что надо было сделать. Все равно это жести не отменяет.
Re[3]: Ух ты, ух ты... Это что ж такое творится-то :(
От: night beast СССР  
Дата: 05.12.18 09:01
Оценка: +1
Здравствуйте, Amygdala, Вы писали:

C>>И никаких предупреждений компилятора о том что функции и переменный определены в двух единицах трансляци? Сплошные inline?


A>Все целиком определено и заимплеменчено в cpp-файлах. Это не паблик классы, они нужны только в одном файле и в одном узком месте. Потому собственно и объект был статическим — потому что про этот класс вне этого фала, где он определен — вообще никто не знает.


в cpp нет паблик классов.
при инклуде компилятор просто вставляет содержимое h файла, поэтому принципиальной разницы где он определен (в h или cpp) с точки зрения компилятора нет.
когда появятся модули может что-то изменится...
Re[5]: Единица трансляции
От: Qbit86 Кипр
Дата: 05.12.18 09:13
Оценка: +1
Здравствуйте, Amygdala, Вы писали:

A>Все целиком определено и заимплеменчено в cpp-файлах.


Компоновщику пофигу, было ли это определено непосредственно в cpp-файле или определение туда было текстуально воткнуто препроцессором из какого-то левого файла. Он работает на другом этапе, где подобные детали уже «забыты».
Глаза у меня добрые, но рубашка — смирительная!
Re: Ух ты, ух ты... Это что ж такое творится-то :(
От: vopl Россия  
Дата: 05.12.18 09:21
Оценка: 4 (1)
Здравствуйте, Amygdala, Вы писали:

A>Это что ж такое-то!!! ((

A>Вот это жесть!!! ((

Сам не пробовал, но вот товарищ говорит что такое можно детектировать
Re[2]: Ух ты, ух ты... Это что ж такое творится-то :(
От: niXman Ниоткуда https://github.com/niXman
Дата: 05.12.18 09:50
Оценка:
Здравствуйте, vopl, Вы писали:

V>Сам не пробовал, но вот товарищ говорит что такое можно детектировать


если я ничего не путаю, то эта проверка включается автоматически при использовании LTO.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: Ух ты, ух ты... Это что ж такое творится-то :(
От: Vain Россия google.ru
Дата: 05.12.18 10:42
Оценка:
Здравствуйте, Amygdala, Вы писали:

A>Вот это жесть!!! ((

Тюю, тоже мене баг.
Вот попробуй баг в математике отыскать, где в какой-то момент времени вылетает NAN и крушит всё подряд. И этот момент времени же ещё выждать надо, да и при определённых условиях.
Конечно по сложности и времени это не расстрел памяти, но можно целый день потерять.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[6]: Единица трансляции
От: Vain Россия google.ru
Дата: 05.12.18 23:20
Оценка:
Здравствуйте, Qbit86, Вы писали:

A>>Все целиком определено и заимплеменчено в cpp-файлах.

Q>Компоновщику пофигу, было ли это определено непосредственно в cpp-файле или определение туда было текстуально воткнуто препроцессором из какого-то левого файла. Он работает на другом этапе, где подобные детали уже «забыты».
А как же Link Time Code Generation? Да даже просто перекомпиляция в другом компиляторе без всяких LTCG может дать новые сообщения об ошибках, по которым можно выявить эту шнягу. Автор по ходу забил на это и поплатился.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re: Ух ты, ух ты... Это что ж такое творится-то :(
От: ononim  
Дата: 09.12.18 08:26
Оценка: +1
ODR нарушил. Вообще линкер на такое обычно варнингами ругается. Не отключены варнинги то?
Как много веселых ребят, и все делают велосипед...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.