Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.19;
Скачать: CL | DM;

Вниз

БАГ компилятора в конструкторе с 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 (все обращения к полям и методам классов это делают вроде), даже просто  так

constructor TypeA.create(SomeOpenParam:array of Trect);
begin
asm
  push eаx;
  pop eаx;
end;
end;
то оптимизатор сохраняет значение eax - результат СlassCreate
если в конструкторе еа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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.025 c
15-1184790822
Kerk
2007-07-19 00:33
2007.08.19
Смотрел женский футбол


15-1183992453
Megabyte
2007-07-09 18:47
2007.08.19
Delphi 7 and MSSQL 2005


15-1185006460
Bratyk
2007-07-21 12:27
2007.08.19
Как сохранить проект в exe - файл


15-1184677566
Kerk
2007-07-17 17:06
2007.08.19
Автоматический перевод


15-1185278370
vasIZmax
2007-07-24 15:59
2007.08.19
Какую БД выбрать?