Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2022, 14:18   #1
zur
Новичок
Джуниор
 
Регистрация: 27.10.2016
Сообщений: 4
По умолчанию Баги компилятора Delphi

С каждой новой версии вылезают новые глюки... Некоторые, типа internal error, обходятся танцами с бубном, а с некоторыми сложнее.
Может кому поможет, кто-то добавит
zur вне форума Ответить с цитированием
Старый 01.06.2022, 14:25   #2
zur
Новичок
Джуниор
 
Регистрация: 27.10.2016
Сообщений: 4
По умолчанию

Передача параметра типа OBJECT размером 8 байт в x64 как адрес, обработка как значение.
Структуры размером 8 байт для x64 и 4 байта для x86 всегда передавались как значение, при без модификатора или с const (var и out конечно по адресу), а вот в 11-ой версии и только для x64 передаются по адресу, но обрабатываются как значений. Конечно, object сейчас использовать коряво, но есть ведь старые рабочие куски кода...


type
TTestObject= object
ni:NativeInt;
End;

function Get(V:TObject):NativeInt;
begin
Result := V.ni;
end;

var O:TTestObject;
begin
O.ni := $12345678;
Assert(O.ni=Get(O));
end.

Последний раз редактировалось zur; 01.06.2022 в 14:37.
zur вне форума Ответить с цитированием
Старый 01.06.2022, 14:30   #3
zur
Новичок
Джуниор
 
Регистрация: 27.10.2016
Сообщений: 4
По умолчанию

Delphi 11
передача ShortString с модификатором CONST с копированием на стек.
В предыдущих версиях ( да и в хелпе так написано) просто передавался адрес, компилятор типа следил, чтобы переменную не меняли.
В Delphi 11 в начале функции копируется на стек, как если бы не было модификатора CONST и трюк с получением адреса не прокатывает...



function GetAddr(const s:ShortString)ointer;
begin
Result := @s;
end;

var s:ShortString;
begin
Assert( GetAddr(s)=@s );
end.
zur вне форума Ответить с цитированием
Старый 01.06.2022, 14:35   #4
zur
Новичок
Джуниор
 
Регистрация: 27.10.2016
Сообщений: 4
По умолчанию

1. Дебагер сбивается в нумерах строк

- обращение к функции inline, которая вызывает property с функцией read
- обращение к полю (в том числе через inline) типа OpenArray<T> (локальная переменная) из потомков в локальной процедуре.
Лечится обращением через нормальную функцию


2. Internal error при компиляции
- обращение к property, если функция read в другом модуле

3. FillChar в x64 - третий параметр.
Если это константа, передается как Word (r8w), а в реализации используется r8. Значит если вдруг во время вызова FillChar в старших разрядах r8 что-то было, то все плохо.
Если третий параметр переменная, то нормально - movzx r8, Byte Var
zur вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Директивы компилятора, jedi.inc и Delphi XE3 Pcrepair Общие вопросы Delphi 2 16.01.2013 21:13
Настройки компилятора Delphi по умолчанию Александр Павлович Общие вопросы Delphi 1 28.11.2012 10:22
Нетривиальный глюк компилятора Delphi 7 alexdelphi Общие вопросы Delphi 0 12.03.2012 17:29
проверить на баги serckesh Помощь студентам 1 05.02.2010 19:54
Установки для компилятора Delphi Terran Общие вопросы Delphi 2 11.08.2009 13:45