Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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 (все обращения к полям и методам классов это делают вроде), даже просто  так

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.082 c
2-1185178959
ambhtr
2007-07-23 12:22
2007.08.19
Как из интернета скопировать таблицу


2-1185515794
click
2007-07-27 09:56
2007.08.19
FindFirst_FindNext & Filter


2-1185296308
WFS
2007-07-24 20:58
2007.08.19
Нужно сохранить данные из DBGrida в файл.


15-1184297566
макк
2007-07-13 07:32
2007.08.19
Как узнать откуда территориально такой-то ай-пи адрес?


2-1185130508
copron
2007-07-22 22:55
2007.08.19
GetNextItem





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский