Долбился сейчас три часа об баг. И это просто жесть.
Короче, есть библиотечка. Где-то внутри нее, никак не опознаваемый и не видимый снаружи библиотечки есть некий класс с названием MySuperClass и в одном из файлов статический объект
static MySuperClass* global_super = NULL;
Сделано это было давно и уже забыто.
Но вот в основном приложении, который юзает эту библиотечку мне понадобился схожий функционал этого класса, но немного другой.
Я взял, копирнул тот класс и сам статический объект из библиотечки и класс изменил как мне надо. А вот названия класса и имя статического объекта — не изменил.
Ну и началось. Падение на любом обращении к любому члена класса.
Долбежка башкой об клавиатуру и создание пустых проектов с таким же классом (без библиотечки) приводило к тому, что все работало.
Пока мне не стрельнуло переименовать класс и статический объект. И конечно же все заработало. Он падал на обращении к полям класса, которых не было в классе внутри библиотеки.
Это что ж такое-то!!! ((
Это хорошо еще у меня были исходники библиотеки. А если б я случайно назвал класс и переменную так же как создатели библиотеки — да этот баг вообще бы никогда не поймался бы.
Вот это жесть!!! ((
Re: Ух ты, ух ты... Это что ж такое творится-то :(
C>И никаких предупреждений компилятора о том что функции и переменный определены в двух единицах трансляци? Сплошные inline?
Все целиком определено и заимплеменчено в cpp-файлах. Это не паблик классы, они нужны только в одном файле и в одном узком месте. Потому собственно и объект был статическим — потому что про этот класс вне этого фала, где он определен — вообще никто не знает.
Здравствуйте, Amygdala, Вы писали:
A>Все целиком определено и заимплеменчено в cpp-файлах. Это не паблик классы, они нужны только в одном файле и в одном узком месте. Потому собственно и объект был статическим — потому что про этот класс вне этого фала, где он определен — вообще никто не знает.
A>А если б я случайно назвал класс и переменную так же как создатели библиотеки — да этот баг вообще бы никогда не поймался бы.
Здравствуйте, Amygdala, Вы писали:
C>>И никаких предупреждений компилятора о том что функции и переменный определены в двух единицах трансляци? Сплошные inline?
A>Все целиком определено и заимплеменчено в cpp-файлах. Это не паблик классы, они нужны только в одном файле и в одном узком месте. Потому собственно и объект был статическим — потому что про этот класс вне этого фала, где он определен — вообще никто не знает.
в cpp нет паблик классов.
при инклуде компилятор просто вставляет содержимое h файла, поэтому принципиальной разницы где он определен (в h или cpp) с точки зрения компилятора нет.
когда появятся модули может что-то изменится...
Здравствуйте, Amygdala, Вы писали:
A>Все целиком определено и заимплеменчено в cpp-файлах.
Компоновщику пофигу, было ли это определено непосредственно в cpp-файле или определение туда было текстуально воткнуто препроцессором из какого-то левого файла. Он работает на другом этапе, где подобные детали уже «забыты».
Глаза у меня добрые, но рубашка — смирительная!
Re: Ух ты, ух ты... Это что ж такое творится-то :(
Здравствуйте, Amygdala, Вы писали:
A>Вот это жесть!!! ((
Тюю, тоже мене баг.
Вот попробуй баг в математике отыскать, где в какой-то момент времени вылетает NAN и крушит всё подряд. И этот момент времени же ещё выждать надо, да и при определённых условиях.
Конечно по сложности и времени это не расстрел памяти, но можно целый день потерять.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Здравствуйте, 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: Ух ты, ух ты... Это что ж такое творится-то :(