Форум: "Прочее";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
ВнизБАГ компилятора в конструкторе с Open Array Найти похожие ветки
← →
oxffff © (2007-07-19 22:04) [0]Выявил сегодня.
Упрощенный способ выявления
TypeA=class
constructor create(SomeOpenParam:array of Trect);
end;
constructor TypeA.create(SomeOpenParam:array of Trect);
begin
end;
procedure TForm1.Button1Click(Sender: TObject);
var a:TypeA;
begin
a:=TypeA.create([]);
showmessage(a.ClassName);
end;
Проблема перед финализацией в конструкторе происходит потеря в eax нового объекта.
Способ обхода.
constructor TypeA.create(SomeOpenParam:array of Trect);
begin
inherited create;
end;
Сейчас напишу на QC
← →
oxffff © (2007-07-19 22:05) [1]Выявлен в 7 и 2006
← →
oxffff © (2007-07-19 22:22) [2]Готово
http://qc.codegear.com/wc/qcmain.aspx?d=49303
← →
Sdubaruhnul (2007-07-19 22:25) [3]ИМХО тебе сейчас придумают объяснение, почему это нормально и всё так и задумывалось.
← →
TUser © (2007-07-19 22:35) [4]Почему нормально, баг он и есть баг. Бывает. В ворде больше.
← →
vpbar © (2007-07-19 22:35) [5]нда. любопытно. Это глюк оптимизатора. Лечить можно добавив какойнить полезный код в конструктор, хоть обращение к полям (собственно пустой конструктор и не нужен). Или отключением оптимизации.
← →
TUser © (2007-07-19 22:36) [6]Хотя вру. В ворде багов нет по определению, т.к. там нет однозначно задокументированного поведения системы. Значит любое его поведение - все-таки, фича.
← →
oxffff © (2007-07-19 22:40) [7]Вот этот найденный баг не менее любопытный
http://qc.codegear.com/wc/qcmain.aspx?d=44797
Вызов виртуального метода линкуется на этапе компиляции напрямую, минуя вызов через VMT
← →
vpbar © (2007-07-19 22:43) [8]>>oxffff © (19.07.07 22:40) [7]
Тоже видимо переоптимизировали. Ведь статический вызов намного быстрее
У меня пару раз была ситуация когда оптимизация - зло.
Выключишь все работает. Включишь - глючит и не отладишь толком.
← →
oxffff © (2007-07-19 22:47) [9]
> vpbar © (19.07.07 22:35) [5]
> нда. любопытно. Это глюк оптимизатора. Лечить можно добавив
> какойнить полезный код в конструктор, хоть обращение к полям
> (собственно пустой конструктор и не нужен). Или отключением
> оптимизации.
Да нет, там где я его поймал в рабочем коде, конструктор был не пустой. Но помогал именно вызов родительского конструктора.
← →
vpbar © (2007-07-19 22:56) [10]Ну незнаю. Просто я поигрался в Вашим кодом и обнаружил, то если в конструкторе есть хоть что то что использует eax (все обращения к полям и методам классов это делают вроде), даже просто так
то оптимизатор сохраняет значение eax - результат СlassCreate
constructor TypeA.create(SomeOpenParam:array of Trect);
begin
asm
push eаx;
pop eаx;
end;
end;
если в конструкторе еаx не используется - то портит? например в этом случае
constructor TypeA.create(SomeOpenParam:array of Trect);
begin
asm
push edx;
pop edx;
end;
end;
← →
oxffff © (2007-07-19 23:02) [11]Вот код где поймал
constructor CreateParametersInterface.create(ParentControl:TWinControl;MapClasses:array of TVarTypeMap;RestrictNestedLevel:DWORD=0);
begin
self.ParentControl:=ParentControl;
self.RestrictNestedLevel:=RestrictNestedLevel;
end;
Обращение через eax происходит, но
Помогает только выключение оптимизатора. :)
Либо inherited create.
← →
vpbar © (2007-07-19 23:14) [12]я имел ввиду что в коде меняется еах. Например обращение к другому объекту.
В Вашем случае еах после СlassCreate не меняется. А далее, видимо оптимизатор забывает, что еах будет меняться и не сохраняет его.
Кстати если бы ParentControl был строкой то глюка бы не было.
перед lea eax,[...]
оптимизатор бы сохранил предидущее значение.
Вообщем шустрый таракан - не сразу поймаешь
← →
oxffff © (2007-07-19 23:20) [13]
> Вообщем шустрый таракан - не сразу поймаешь
Тараканы бывают еще на букву E (Internal Error).
Тоже надоели. Особенно с делегированием реалиазации interface cвойству.
← →
Суслик © (2007-07-19 23:32) [14]молодец
← →
oxffff © (2007-07-20 21:54) [15]Про этот еще думают. подождем
← →
Суслик © (2007-07-20 23:20) [16]когда куплю наконец MSDN Operating Systems и налажу у себя несколько virtual machines, поставлю последний билд delphi, то обяз. проверю баги - воспроизводятся ли там.
← →
oxffff © (2007-07-21 13:18) [17]
> oxffff © (20.07.07 21:54) [15]
> Про этот еще думают. подождем
Подождали. Быстро реагируют. Статус Open.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.065 c