powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / XE2 string double-free
91 сообщений из 91, показаны все 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
XE2 string double-free
    #39686902
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гирлионайльдо,

спасибо

я и так сильно упростил по сравнению с оригиналом.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686925
zinpub
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AriochKazantsev Alexeyпропущено...

Ты у себя-то попробуй несохранённый проект запустить, предварительно очистив дефолтный локейшн.

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

это же не Turbo Pascal 5.x где можно было Compile To Memory

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

Ariochэто же не Turbo Pascal 5.x где можно было Compile To Memory
Так это другое. Экзешник она создаёт разумеется, однако проект не создаётся если не сохранить.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686929
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zinpubAutosave - выключи...
Оно и без включенного AutoSave работать должно.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686932
nicholaos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще упростил:


Код: 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.
program StringBug;

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

uses
  IOUtils;

var
  VolatileFN: string;

procedure Test(const ConstFN: string);
begin
  VolatileFN := copy(ConstFN, 1, 12);
  TFile.ReadAllText(ConstFN);
end;

procedure Test2(const ConstFN: string);
begin
  Test(ConstFN);
end;

begin
  Test('C:\Work\test.txt');
  Test2(VolatileFN);
end.




Тестировал на Embarcadero® Delphi 10.2 Version 25.0.26309.314, 32 и 64 компиляторы.
Invalid pointer operation присутствует в обоих.

если присвоение VolatileFN делать после ReadAllText, то бага нет:


Код: pascal
1.
2.
3.
4.
5.
procedure Test(const ConstFN: string);
begin
  TFile.ReadAllText(ConstFN);
  VolatileFN := copy(ConstFN, 1, 12);
end;




есть ожидаемый The specified file was not found.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686937
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот вам буг, который работает на новом проекте (Сохранять надо в dpr, если просит сохранить при создание проекта)

Код: 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.
program Project1;

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

uses
  SysUtils, StrUtils, IOUtils;

var
  rFile, Simulated_Call: string;

procedure ReadStr(const FileName: string);
begin
  Writeln(FileName);
  TFile.ReadAllText(FileName); // Bug
end;

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

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

        ReadStr(FileName);
      end;
  end;
end;

begin
  try
    try
      rFile := ParamStr(0);
      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
    #39686947
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos,

У тебя нет бага, у тебя ошибка об отсутствие директории будет. Файла то нет в такой директории )


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

Ты получаешь ошибку на первом вызове (Test). Поменяй на валидный путь и получишь баг на вызове Test2. Это самый минимальный пример.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39686966
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сырой компилятор, 23 годика.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687012
а компот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Arioch,
неправильно ссылки считает, сволочь...а 'const' ему кто сказал?

у тебя
Код: plaintext
const FileName equ Simulated_Call
а ты внутри рекурсии
Код: plaintext
Simulated_Call := '';

или убери const или turn the const-string into a volatile var
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687024
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а компот,

с хрена ли???

const - означает, что процедура не изменяет этот параметр.
А она изменяет разве???

Так что программа правильная. А вот почему по правильной программе компилятор создает неправильный код - вопрос не ко мне.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687025
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos
Код: pascal
1.
  Test('C:\Work\test.txt');



c:\autoexec.bat ? Он почти везде есть. хотя была у меня XP самовольно перебравшаяся на диск i:....
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687035
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaos Ты получаешь ошибку на первом вызове (Test). Поменяй на валидный путь и получишь баг на вызове Test2. Это самый минимальный пример.

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

цели обмануть у меня нет.




Ariochc:\autoexec.bat
У меня нет.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687058
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochc:\autoexec.bat ? Он почти везде есть.
Издеваетесь? Его со времён XP нет.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687059
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvpAriochc:\autoexec.bat ? Он почти везде есть.
Издеваетесь? Его со времён XP нет.
Все есть. Но не у всех.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687064
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччД__alekcvpИздеваетесь? Его со времён XP нет.
Все есть. Но не у всех.
Ну у тех, кто винды как матрёшки друг-на-друга ставит, у тех есть. Если 7ку и выше с 0 поставить - не будет.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687065
чччД__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alekcvpчччД__пропущено...

Все есть. Но не у всех.
Ну у тех, кто винды как матрёшки друг-на-друга ставит, у тех есть. Если 7ку и выше с 0 поставить - не будет.
Ты просто не умеешь.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687083
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Две до плеска простых функции, которые вызывают баг

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
var
  rFile: string;

function TestBUG(const S: string): string;
begin
  Exit(S);
end;

procedure Test(const EventKind: Byte; const FileName: string);
begin
  rFile := '';

  if EndsText('.exe', FileName) then
    rFile := ChangeFileExt(FileName, '.dpr');

  if TestBUG(FileName) <> '' then
  begin
  end;
end;




Код: 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.
program Project1;

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

uses
  SysUtils, StrUtils, IOUtils;

var
  rFile: string;

function TestBUG(const S: string): string;
begin
  Exit(S);
end;

procedure Test(const EventKind: Byte; const FileName: string);
begin
  rFile := '';

  if EndsText('.exe', FileName) then
    rFile := ChangeFileExt(FileName, '.dpr');

  if TestBUG(FileName) <> '' then
  begin
  end;
end;

begin
  try
    try
      rFile := ParamStr(0);
      Test(1, rFile);

    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
    #39687085
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно ещё короче записать. Что тоже будет багом

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure Test(const EventKind: Byte; const FileName: string);
begin
  rFile := ChangeFileExt(FileName, '.dpr');

  if TestBUG(FileName) <> '' then
  begin
  end;
end;
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687086
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глобальные переменные - в локальных переменных зло!!! Вывод, не использовать const
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687148
Arioch The
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TWIMC

Один иностранец отозвался тут: https://plus.google.com/ AriochThe/posts/WB3toSpAdfA
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687152
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да что тут думать?

Мы передаём в функцию Один указатель.
Потом мы на этот указатель новый указатель ставим.
Старый указатель - переданный ранее уже не валидный.


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure Test(const EventKind: Byte; const FileName: string); // FileName старый указатель rFile 
begin
  rFile := ChangeFileExt(FileName, '.dpr'); // задаём для rFile  новый указатель 

  if TestBUG(FileName) <> '' then // Новый указатель <> не старый указатель. И мы получаем порчу памяти 
  begin
  end;
end; // Баг
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687161
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для окончательного подведения дискуссии, выкладываю самый наглядный пример бага

Код: 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.
program Project1;

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

uses
  SysUtils;

var
  rFile: string;

function TestBUG(const S: string): string;
begin
  Result := S;
end;

procedure Test(const EventKind: Byte; const FileName: string);
begin
  rFile := FileName.SubString(0, Length(FileName)); // Получим новую строку 

  TestBUG(FileName); // Попробуем обратится к старому указателю 
 
end; // Фаталити 

begin
  try
    try
      rFile := ParamStr(0);
      Test(1, rFile);

    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
    #39687278
а компот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гирлионайльдо, тут бага нет!
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
var
  rFile: string;

function TestBUG(const S: string): string;
begin
  Result := S;                                                                                    // RefCount строки увеличен на 1
end;

procedure Test(const EventKind: Byte; const FileName: string);
begin
  rFile := FileName.SubString(0, Length(FileName)); // Получим новую строку                       // Предыдущую строку уже зачистили, но ссылка на неё осталась в FileName

  TestBUG(FileName);                                // Попробуем обратится к старому указателю    // Передаём ссылку на невалидную строку
                                                                                                  // и получаем в Result невалидную строку, но с RefCount=1

end;                                                // Фаталити                                   // Повторная! зачистка строки

begin
  try
    try
      rFile := ParamStr(0);
      Test(1, rFile);

Arioch The, неси дрова в "как я лажанулся"
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687284
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687289
а компот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гирлионайльдо, бага компилятора нет - есть бага программиста.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687306
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так проблема в способе передачи const строки в delphi. Когда строка передается как const параметр, происходит передача непосредственно адреса блока памяти, в котором лежит строка, без увеличения счетчика ссылок. Если мы внутри процедуры меняем переменную, которую передали как const параметр (хоть глобальную, хоть поле класса, хоть переданную через другой параметр ка var), значение const параметра может испортится, если счетчик ссылок обнулится.
Так что вывод - нельзя менять внутри процедуры переменную, значение которой передано туда же как const параметр.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687323
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneТак что вывод - нельзя менять внутри процедуры переменную, значение которой передано туда же как const параметр.

const вообще для этого и предусмотрен.

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

const вообще для этого и предусмотрен.

А воспроизводящим неплохо бы привести листинги сгенерироованного кода.

Ну как бы...
Код: pascal
1.
2.
3.
4.
5.
6.
7.
var
 aa: string;
procedure Test(const arg: string);
begin
  aa := 'zzzzz';
  ......
end;

Если мы напишем вызов Test(aa), то после присвоения aa внутри Test значение параметра поломается.
const - это про то, что мы не можем напрямую менять arg внутри Test. Про то, что нельзя менять переменную, связанную с const параметром, напрямую нигде в документации кажется не написано (я не нашел), но если задуматься о том, как оно внутри реализовано, то это понятно.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687496
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneПро то, что нельзя менять переменную, связанную с const параметром, напрямую нигде в документации кажется не написано (я не нашел).

Основные негласные правила программирования: параметры функций .
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687601
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nicholaosAriochc:\autoexec.bat
У меня нет.

у меня на win7 нет, а на win8.1 есть

впрочем, на гитхабе я c:\windows\win.ini открывал. Тоже впрочем не 100% панацея - никто не гарантирует существование диска c:


nicholaosцели обмануть у меня нет.
я никого в обмане и не обвинял, ни тебя (с оооочень другой версией Делфи), ни даже Казанцева (с идентичной).
Наоборот мы тут "собираем статистику", чтобы максимально точно определить причины и граничные условия.

И - ошибка в Delphi 10.2 которой нет в XE2 на мой вкус будет другим багом. Возможно родственным но другим. Regression. Будь первооткрывателем!

ГирлионайльдоГлобальные переменные - в локальных переменных зло!

Я знал, что кто-то это зачем-то скажет. Поэтому в моём заглавном посту переменная изначально локальная! Специально так сделано было. Это потом уже упрощатели до глобальной упростили. И были раскритикованы...


Arioch TheTWIMC

Один иностранец отозвался тут: https://plus.google.com/ AriochThe/posts/WB3toSpAdfA

С ним там короткая довольно забавная дискуссия была.

Мое текущее мнение, что единственно корректным поведением компилятора былоа бы считать const string отдельным типом данных и увеличивать счётчик при присвоении volatile string -> const string function parameter и отщёлкивать его назад при выходе из функции. А иначе - мы тут пока с рекурсиями игрались, но есть же ещё многопоточность....
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687604
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а компотArioch The, неси дрова в "как я лажанулся"

я не пишу комплиятор Дельфи


а компот
Код: pascal
1.
// Предыдущую строку уже зачистили, но ссылка на неё осталась в FileName



ну так на хрена Дельфи чистит объекты, на которые есть живая ссылка?
это косяк Дельфи, очевидный

есть ссылка - объект живой

а компот
Код: pascal
1.
// Передаём ссылку на невалидную строку



передаём валидную переменную

то, что Дельфи за каким-то чертом в валидную переменную кладет невалидную ссылку - вопрос к авторам Дельфи, а не к пользователям Дельфи
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687615
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochИ - ошибка в Delphi 10.2 которой нет в XE2 на мой вкус будет другим багом.
У меня в XE2 его код тоже даёт ошибку.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687625
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneТак что вывод - нельзя менять внутри процедуры переменную, значение которой передано туда же как const параметр.

как будто процедура знает, что именно в неё передается

а что потом, процедура не должна трогать переменные, которые может быть в ДРУГОМ ПОТОКЕ передаются констами в другую совсем функцию из другой библиотеки ?

Гирлионайльдовыкладываю самый наглядный пример бага

На XE2 воспроизвёлся.
https://github.com/the-Arioch/XE2_AutoOpenUnit/blob/master/Delphi_String_Bug/Girli_str_2xFree_Minimized.dpr
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687630
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochНа XE2 воспроизвёлся.
https://github.com/the-Arioch/XE2_AutoOpenUnit/blob/master/Delphi_String_Bug/Girli_str_2xFree_Minimized.dpr

у кого есть пароль от их Джиры - закиньте им туда баг c этой демонстрацией пжлст, у меня был только от публичного QC и заводить от приватной Джиры мне лень
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687631
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochМое текущее мнение, что единственно корректным поведением компилятора былоа бы считать const string отдельным типом данных и увеличивать счётчик при присвоении volatile string -> const string function parameter и отщёлкивать его назад при выходе из функции.

Reiterating....
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687817
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochМое текущее мнение, что единственно корректным поведением компилятора былоа бы считать const string отдельным типом данных и увеличивать счётчик при присвоении volatile string -> const string function parameter и отщёлкивать его назад при выходе из функции. А иначе - мы тут пока с рекурсиями игрались, но есть же ещё многопоточность....Уберите const - и получите ровно это поведение.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687819
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochкак будто процедура знает, что именно в неё передается

а что потом, процедура не должна трогать переменные, которые может быть в ДРУГОМ ПОТОКЕ передаются констами в другую совсем функцию из другой библиотеки ?
Процедура ничего не знает, программист знает.
И да, именно так, если в другом потоке менять переменную, переданную как const, будет тот же эффект.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687820
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С другим потоком - это вообще зло обращаться к переменной в тот момент, когда она меняется в другом потоке. Даже если параметр не const строка, в одном потоке счетчик ссылок уменьшается, в другом увеличивается. Есть ненулевой шанс словить проблему.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687982
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneПроцедура ничего не знает, программист знает.

1) он не должен знать, есть такие вещи как структурное и объектно-ориентированной приложение. Скть клоторый в том, что когда человек пишет один кусочек программы, он не должен держать в памяти все и каждую другую строчку программы, а должно быть достаточно думать о конкретной задаче

2) ты никогда не использовал чужие библиотеки? всю RTL дельфи ты самолично с нуля переписал?

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

очевидно же, что нет

я получу ненужный мне риск опечататься (или вернуться к доработке функции месяц спустя) и изменить переменную, разрушив логику окончания функции.

кроме того я получу отключение оптимизации всех вызовов ИЗ этой функции, а они для многопроцессорных систем довольно затратные. Сколько там уже потоко у тред-риппера, 64 ?
...
Рейтинг: 0 / 0
XE2 string double-free
    #39687994
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneС другим потоком - это вообще зло обращаться к переменной в тот момент, когда она меняется в другом потоке

а это просто неправда

точнее это сферическая правда в вакууме к этой теме вообще никак не относящаяся
изменяется переменная Simulated_Call
обращение идёт к переменной FileName

никто в этой теме никогда не обращался к той переменной, которая изменяется
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688092
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не проблема в конкретной версии компилятора, это концептуальная проблема передачи const sting параметров - при этом не создается новая строковая переменная, а образуется алиас. Если в какой-то версии компилятора нет падения с av - это еще не говорит об отсутствии обращения к освобожденной памяти.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688127
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneЭто не проблема в конкретной версии компилятора

ясень пень, тут же тестировали на куче версий с xe2 до 10.2 - во всех одна проблема


Barloneверсии компилятора нет падения с av - это еще не говорит об отсутствии обращения к освобожденной памяти.

само собой

но баги use after free и double-free - это разные баги

хотя (и я с самого начала сказал) - родственные (вытекающие из общей недопроработки концепции)
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688129
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barloneнет падения с av

кстати, AV тут и не было, было IMO
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688136
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochAriochНа XE2 воспроизвёлся.
https://github.com/the-Arioch/XE2_AutoOpenUnit/blob/master/Delphi_String_Bug/Girli_str_2xFree_Minimized.dpr

у кого есть пароль от их Джиры - закиньте им туда баг c этой демонстрацией пжлст, у меня был только от публичного QC и заводить от приватной Джиры мне лень
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688170
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно просто проверить счетчик ссылок:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
var aa: string;
procedure Test(const arg: string);
begin
  Writeln(PInteger (Integer (arg) - 8)^);
  aa := 'zzz';
  Writeln(PInteger (Integer (arg) - 8)^);
end;
begin
 aa := 'aaa';
 Test(aa);
end.

после присваивания глобальной переменной у связанного с ней параметра он обнуляется - а значит память под старое значение уже освобождена.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688176
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но это не баг, это фича.
Просто всегда изменяя в процедуре значение нелокальной переменной, надо задумываться о том, а что будет, если эта переменная связана с var/const параметром процедуры.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688181
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, что дело в не бобине. Начиная с Delphi 2 строки имеют управляемое время жизни и судя по отсутствию с 1996 года массовых проблем по двойному освобождению памяти, программы писались так, чтобы эти ситуации не проявлялись. Повод задуматься.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688232
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneМожно просто проверить счетчик ссылок

вот-вот, на каждой операции со строкой лезть в implementation details и надеяться, что они не изменились с последнего обновления компилятора

а если библиотека должна еще собираться на LLVM и на FPC - еще веселее будет

Нет, это таки баг, потому чт оничего полезного (фича) он не добавляет.

Barloneвсегда изменяя в процедуре значение нелокальной переменной

Другими словами, процедуры и функции не имеют права менять строковые переменные кроме локальных.
Другими словами, set-теры строковых свойств классов теперь под запретом.

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

избегайте использовать базовые возможности компилятора по безопасности и оптимизации (const-параметры), и ваша программа будет работать

в принципе это далеко не первая и далеко не последняя ошибка компилятора, и не самая худшая.
были for-to-циклы, в которых сверху вниз до нуля шла переменная, например.

но и хорошего тут ничего нет.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688381
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochBarloneМожно просто проверить счетчик ссылок

вот-вот, на каждой операции со строкой лезть в implementation details и надеяться, что они не изменились с последнего обновления компилятора

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

Другими словами, процедуры и функции не имеют права менять строковые переменные кроме локальных.
Другими словами, set-теры строковых свойств классов теперь под запретом.

Ну да, вышли из положения, чо.[/quot]Ну не надо преувеличивать. Так же как работает a:=a для простой строковой переменной, так и сеттер будет работать, даже если в него передать само свойство. Ну если конечно у вас в сеттере не какая-то странная необходимость сначала старое значение очистить, а потом новое присвоить.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688386
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barloneвсегда изменяя в процедуре значение нелокальной переменной

Другими словами, процедуры и функции не имеют права менять строковые переменные кроме локальных.
Другими словами, set-теры строковых свойств классов теперь под запретом.

Ну да, вышли из положения, чо.[/quot]Ну не надо преувеличивать. Так же как работает a:=a для простой строковой переменной, так и сеттер будет работать, даже если в него передать само свойство. Ну если конечно у вас в сеттере не какая-то странная необходимость сначала старое значение очистить, а потом новое присвоить.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688387
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AriochBarloneМожно просто проверить счетчик ссылок

вот-вот, на каждой операции со строкой лезть в implementation details и надеяться, что они не изменились с последнего обновления компилятора

Это вообще то было не про проверку на каждой операции, а про то, как убедиться, что фича действительно есть, даже когда программа не упала.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688432
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В 2018 году кто-то еще использует глобальные строковые переменные?
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688473
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteВ 2018 году кто-то еще использует глобальные строковые переменные?Тут не про глобальные переменные. Можно поиметь проблему, например передав одну строку через var и const параметр одновременно:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure Test(var vv: string; const arg: string);
begin
  Writeln(PInteger (Integer (arg) - 8)^);
  vv := 'zzz'; 
// после присваивания значения первому параметру второй может оказаться невалидным
  Writeln(PInteger (Integer (arg) - 8)^);
end;

procedure T1(aa: string);
begin
 aa:=aa+'bbb';
 Test(aa,aa);
end;

begin
  T1('aaa');
end.

Или как в изначальном примере через поле класса
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688783
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteВ 2018 году кто-то еще использует глобальные строковые переменные?

прочитай начало топика, там НЕТ никаких глобальных переменных
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688790
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда надо оформлять в QC, и то, запилят в роадмап на 2025 год....
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688800
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну а пока ничего не придумали, объявляем параметр (функции \ метода) как var и через var работаем с внешним указателем, не трогая внутри функции оригинальный. И таким образом прорабатываем специфику ООП создавая возможно и overload функции
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688835
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГирлионайльдоНу а пока ничего не придумали, объявляем параметр (функции \ метода) как var и через var работаем с внешним указателем, не трогая внутри функции оригинальный. И таким образом прорабатываем специфику ООП создавая возможно и overload функцииЕсли в коде из первого поста просто поменять const на var, double-free конечно не будет, но логика работы сломается.
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688858
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteТогда надо оформлять в QC, и то, запилят в роадмап на 2025 год....

21642156 и 21643136

PS. а в родмап они запилят не исправление бага, а полное убиение классики и тотальный переход на LLVM с необязательной ловлей исключений
...
Рейтинг: 0 / 0
XE2 string double-free
    #39688872
Гирлионайльдо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneЕсли в коде из первого поста просто поменять const на var, double-free конечно не будет, но логика работы сломается.

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

это была сильно упрощенная копия реальной задачи - которая в свою очередь слегка допиленная демка древне-лохматого года

как и все минимизации она надуманная. Вообще любой код, задача которого - продемонстрировтаь ошибку и больше ничего - он просто по определению надуманный

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


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