я находил там мерзкий баг с неправильной протяжкой типов через memcpy из-за чего сходит с ума aliasing analysis и начинает где попало вычищать записи в поля =)
когда ты копируешь область памяти в которой лежит нечто типа T, в другую область памяти, то анализ должен просекать, что в целевой области памяти теперь тоже лежит нечто типа Т (плюс все "атрибуты" свойственные исходному объекту тоже должны копироваться).
у нас есть место где делался memcpy указателя из одной области памяти в другую... при этом терялась информация, что исходный указатель может указывать "куда-угодно", и компилятор начинал считать, что указатель (из целевой памяти) указывает только на локальные переменные... или что-то типа того =)
суть в кратце в следующем - если у тебя есть какой-то произвольный свой аллокатор, то gcc делает какие-то свои, непонятно на чём основанные предположения касательно выравнивания возвращаемой памяти.
соответственно, потом когда ты записываешь в эту память - программа падает при попытке использовать SSE инструкции с 16-байтовым выравниванием.
если сменить выравнивание в аллокаторе или версию gcc - проблема исчезает.
если очень интересно могу попробовать сделать простой test case.
Comments 5
Reply
Reply
у нас есть место где делался memcpy указателя из одной области памяти в другую... при этом терялась информация, что исходный указатель может указывать "куда-угодно", и компилятор начинал считать, что указатель (из целевой памяти) указывает только на локальные переменные... или что-то типа того =)
Reply
там где-то между 4.1 и 4.3 грабли закопаны
суть в кратце в следующем - если у тебя есть какой-то произвольный свой аллокатор, то gcc делает какие-то свои, непонятно на чём основанные предположения касательно выравнивания возвращаемой памяти.
соответственно, потом когда ты записываешь в эту память - программа падает при попытке использовать SSE инструкции с 16-байтовым выравниванием.
если сменить выравнивание в аллокаторе или версию gcc - проблема исчезает.
если очень интересно могу попробовать сделать простой test case.
Reply
Reply
Leave a comment