powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / XE2 string double-free
25 сообщений из 91, страница 1 из 4
XE2 string double-free
    #39686802
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот эта простенькая программка падает в XE2 c Invalid Pointer Operator.

У кого под руками есть версии до и после - ради интереса проверьте, в какой версиии исправили?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
program xe2_str_2xFree;

{$APPTYPE CONSOLE}

{$O+} // actually, irrelevant if on or off

{$R *.res}

{.$Define XE2_String_2xFree_Crash_WorkAround_1}
{.$Define XE2_String_2xFree_Crash_WorkAround_2}
{.$Define XE2_String_2xFree_Crash_WorkAround_3}
{.$Define XE2_String_2xFree_Crash_WorkAround_4}

uses
  SysUtils, StrUtils, IOUtils;

type iDummy = interface
        procedure Event(const EventKind: Byte; const FileName: string);
end;

type TDummy = class (TInterfacedObject, iDummy)
     strict private
        IDE_Call, Simulated_Call: string;
     strict protected
        procedure Event(const EventKind: Byte; const FileName: string);
end;

{ TDummy }

procedure TDummy.Event(const EventKind: Byte; const FileName: string);
var data: string;
begin
  if EventKind = 2 then begin
     if (IDE_Call > '') and (Simulated_Call > '') then
        if FileName = IDE_Call then
        begin
          IDE_Call := '';
{$IfNDef XE2_String_2xFree_Crash_WorkAround_1}
          Event(1, Simulated_Call);   // Simulate the missing IDE event
{$Else}
          data := Simulated_Call; // turn the const-string into a volatile var
          Simulated_Call := '';
          Event(1, data);              // Simulate the missing IDE event
{$EndIf}
          exit;
        end;
  end;

  if EventKind = 1 then begin

{$IfDef XE2_String_2xFree_Crash_WorkAround_3}
    if not TFile.Exists(FileName) then exit; // the mere presence of this call seem to fix it
{$EndIf}
    if not FileExists(FileName) then exit;
{$IfDef XE2_String_2xFree_Crash_WorkAround_4}
    if not TFile.Exists(FileName) then exit;
{$EndIf}

{$IfNDef XE2_String_2xFree_Crash_WorkAround_2}
    if Simulated_Call > '' then
      if FileName = Simulated_Call then // if IDE somehow got called us - do unregister the call simulation
      begin
        IDE_Call := '';
        Simulated_Call := '';  // the filename shared string var actually gets cleared here!!!
      end;
{$EndIf}

     // register late-call simulation of a missed event
     if EndsText('.dproj', FileName) then begin
        IDE_Call := FileName;
        Simulated_Call := ChangeFileExt(FileName,'.dpr');
        Exit;
     end;

     data := TFile.ReadAllText(FileName);

{$IfDef XE2_String_2xFree_Crash_WorkAround_2}
    if Simulated_Call > '' then
      if FileName = Simulated_Call then
      begin
        IDE_Call := '';
        Simulated_Call := '';  // here the shared string becomes safe to clear
      end;
{$EndIf}

     (* some processing of the text: searching for custom tags for example *)
     data := ReplaceStr(data, 'e', 'E');
     data := LeftStr(data, Pos(#13, data)-1);
     Writeln(FileName);
     Writeln(#9, data, '  - OK');
  end;
end;

var obj: iDummy;

procedure RunExpert;
var fn: string;
begin
  fn := ParamStr(0);
  fn := ReplaceText(fn, '\Win32\Debug\', '\');
  fn := ReplaceText(fn, '\Win32\Release\', '\');
  fn := ChangeFileExt(fn,'.DProj');

  obj.Event(0, fn);
  obj.Event(1, fn);
  obj.Event(2, fn);
end;

begin
  try
    try
      obj := TDummy.Create;
      RunExpert;
      obj := nil;

      Writeln('Finished w/o Illegal Pointer Operation');

    except
      on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
    end;
  finally
    Writeln;
    Writeln('Read the output. Press ENTER to terminate the program.');
    Readln;
  end;
end.

...
Рейтинг: 0 / 0
XE2 string double-free
    #39686826
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochВот эта простенькая программка падает в XE2 c Invalid Pointer Operator.
Проверил на XE2 - всё нормально.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686833
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

точно ? без единого workaround'a включенного?

XE2 Upd4 hotfix1 Win32 ?

Ибо у меня плюётся исключением.

Запускал на чистой ветке реестра, чтобы все эксперты прибить.
Могу EXE прислать, хотя х.з. как их сравнивать
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686835
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochточно ? без единого workaround'a включенного?
Абсолютно. Скопировал твой код, вырезел строчку подключения ресурсов.

AriochXE2 Upd4 hotfix1 Win32 ?
Да (16.0.4504.48759). Проверил релизы и дебаги для 32 и 64. Ничего не падает.

AriochЗапускал на чистой ветке реестра, чтобы все эксперты прибить.
У меня в IDE ничего не установлено: ни компонентов, ни экспертов ни фикспаков.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686838
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Соседи проверили в EmbarcaderoR Delphi 10.1 Berlin Version 24.0.25048.9432

Тоже падает.

Модератор: Вложение удалено.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686839
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyСкопировал твой код, вырезел строчку подключения ресурсов.

а если просто распаковать ZIP и его в delphi открыть?
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686841
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochа если просто распаковать ZIP и его в delphi открыть?
Ха, открытый dpr падает
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686844
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ась? Из-за отсутствия зависимостей или чего?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686845
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochТоже падает.

Упс, бросил скриншот не проверив. Тут обрезанный.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686846
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

из-за ошибки в компиляторе, причём какой-то очень странной и зависящей х.з. от чего
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686849
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyСкопировал твой код, вырезел строчку подключения ресурсов.

Открыл DPR, убрал смтроку {$R *.res} - падает.

Т.е. дело не в ресурсах, а в том куда ты копировал...

Предположу, что у тебя нестандартные пути ergo у тебя вообще файл исходников по EXE не находило и в функцию не заходило по сути
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686855
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это баг компилятора.


Пример, как в этом убедится (Добавляем в TDummy.Event)
Код: pascal
1.
2.
3.
4.
var
  data, TestTest: string;
begin
  TestTest := FileName;



И баг исчерпан.

Стоит убрать "TestTest := FileName;" и баг на
Код: pascal
1.
 data := TFile.ReadAllText(FileName);



Снова проявляется
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686857
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyХа, открытый dpr падает
Копируем текст dpr, создаём новый проект, вставляем текст, компилируем - не падает :). Сохраняем новый проект, компилируем - падает.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686860
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо,

ну это и был там WorkAround #1

неправильно ссылки считает, сволочь...

Есть у меня в загашнике еще более сложная вещь, требующая довольно сложной конструкции из EXE+BPL+BPL, неужели и ее могли не заткнуть? Жаль, QC убит.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686862
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyКопируем текст dpr, создаём новый проект, вставляем текст

а вот так?

https://github.com/the-Arioch/XE2_AutoOpenUnit/commit/aba71622953af0605837a4c0f67792fac4ea0a16
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686866
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Товарищи, как можно, я же ночью спать не буду.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686867
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmoker,

Гражданин! у вас вся ночь - белая!
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686870
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochа вот так?
Ну так ожидаемое file not found.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686875
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochПредположу, что у тебя нестандартные пути ergo у тебя вообще файл исходников по EXE не находило и в функцию не заходило по сути

Вот и славно, никакой мистики, никакого подземного стука.

Последняя проверка - сделай как раньше (новый проект, копи-паст), а потом в свойствах проекта убери нестандартную Output Directory
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686877
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochПоследняя проверка - сделай как раньше (новый проект, копи-паст), а потом в свойствах проекта убери нестандартную Output Directory
У меня там всё стандартное.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686882
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyAriochПоследняя проверка - сделай как раньше (новый проект, копи-паст), а потом в свойствах проекта убери нестандартную Output Directory
У меня там всё стандартное.

тогда откуда может взяться
Kazantsev Alexeyожидаемое file not found. ???
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686885
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochтогда откуда может взяться
Ты у себя-то попробуй несохранённый проект запустить, предварительно очистив дефолтный локейшн.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686887
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал пример, более короткий, с проявлением данного бага (Одна процедура)

Объясняю, почему на новом проекте не воспроизводится.
- Потому, что у вас в новом проекте нету файла dproj


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
program xe2_str_2xFree;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  SysUtils, StrUtils, IOUtils;

var
  rFile, Simulated_Call: string;

procedure Test(const EventKind: Byte; const FileName: string);
var
  data, TestTest: string;
begin
  // TestTest := FileName; // Fix bug
  case EventKind of
    2:
      begin
        Test(1, Simulated_Call);
        exit;
      end;
    1:
      begin
        Simulated_Call := '';

        if EndsText('.dproj', FileName) then
          Simulated_Call := ChangeFileExt(FileName, '.dpr');

        data := TFile.ReadAllText(FileName);
      end;
  end;
end;

begin
  try
    try
      rFile := ChangeFileExt(ParamStr(0), '.DProj');
      Test(1, rFile);
      Test(2, rFile);

      Writeln('Finished w/o Illegal Pointer Operation');

    except
      on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
    end;
  finally
    Writeln;
    Writeln('Read the output. Press ENTER to terminate the program.');
    Readln;
  end;

end.

...
Рейтинг: 0 / 0
XE2 string double-free
    #39686890
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо было exit то убрать. Он не влияет на работу бага
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
procedure Test(const EventKind: Byte; const FileName: string);
var
  data, TestTest: string;
begin
  // TestTest := FileName; // Fix bug
  case EventKind of
    2:
      Test(1, Simulated_Call);
    1:
      begin
        Simulated_Call := '';

        if EndsText('.dproj', FileName) then
          Simulated_Call := ChangeFileExt(FileName, '.dpr');

        data := TFile.ReadAllText(FileName);
      end;
  end;
end;

...
Рейтинг: 0 / 0
XE2 string double-free
    #39686899
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyAriochтогда откуда может взяться
Ты у себя-то попробуй несохранённый проект запустить, предварительно очистив дефолтный локейшн.

а я не могу несохранённый, Delphi его требует сохранить.
если не сохранять - не запускает

это же не Turbo Pascal 5.x где можно было Compile To Memory
...
Рейтинг: 0 / 0
25 сообщений из 91, страница 1 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / XE2 string double-free
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]