Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 XE2 string double-free  [new]
Arioch
Member

Откуда:
Сообщений: 10943
Вот эта простенькая программка падает в XE2 c Invalid Pointer Operator.

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

+
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.


К сообщению приложен файл (xe2_str_2xFree.zip - 1Kb) cкачать
13 авг 18, 12:43    [21640214]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3732
Arioch
Вот эта простенькая программка падает в XE2 c Invalid Pointer Operator.

Проверил на XE2 - всё нормально.
13 авг 18, 13:10    [21640280]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Arioch
Member

Откуда:
Сообщений: 10943
Kazantsev Alexey,

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

XE2 Upd4 hotfix1 Win32 ?

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

Запускал на чистой ветке реестра, чтобы все эксперты прибить.
Могу EXE прислать, хотя х.з. как их сравнивать
13 авг 18, 13:15    [21640290]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3732
Arioch
точно ? без единого workaround'a включенного?

Абсолютно. Скопировал твой код, вырезел строчку подключения ресурсов.

Arioch
XE2 Upd4 hotfix1 Win32 ?

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

Arioch
Запускал на чистой ветке реестра, чтобы все эксперты прибить.

У меня в IDE ничего не установлено: ни компонентов, ни экспертов ни фикспаков.
13 авг 18, 13:19    [21640296]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Arioch
Member

Откуда:
Сообщений: 10943
Соседи проверили в EmbarcaderoR Delphi 10.1 Berlin Version 24.0.25048.9432

Тоже падает.

Модератор: Вложение удалено.
13 авг 18, 13:25    [21640309]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Arioch
Member

Откуда:
Сообщений: 10943
Kazantsev Alexey
Скопировал твой код, вырезел строчку подключения ресурсов.


а если просто распаковать ZIP и его в delphi открыть?
13 авг 18, 13:25    [21640311]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3732
Arioch
а если просто распаковать ZIP и его в delphi открыть?

Ха, открытый dpr падает
13 авг 18, 13:29    [21640324]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Гаджимурадов Рустам
Member

Откуда:
Сообщений: 60147
Ась? Из-за отсутствия зависимостей или чего?

Posted via ActualForum NNTP Server 1.5

13 авг 18, 13:30    [21640329]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Arioch
Member

Откуда:
Сообщений: 10943
Arioch
Тоже падает.


Упс, бросил скриншот не проверив. Тут обрезанный.

К сообщению приложен файл. Размер - 29Kb
13 авг 18, 13:32    [21640334]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Arioch
Member

Откуда:
Сообщений: 10943
Гаджимурадов Рустам,

из-за ошибки в компиляторе, причём какой-то очень странной и зависящей х.з. от чего
13 авг 18, 13:33    [21640337]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Arioch
Member

Откуда:
Сообщений: 10943
Kazantsev Alexey
Скопировал твой код, вырезел строчку подключения ресурсов.


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

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

Предположу, что у тебя нестандартные пути ergo у тебя вообще файл исходников по EXE не находило и в функцию не заходило по сути
13 авг 18, 13:38    [21640348]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 426
Это баг компилятора.


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


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

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


Снова проявляется
13 авг 18, 13:42    [21640362]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3732
Kazantsev Alexey
Ха, открытый dpr падает

Копируем текст dpr, создаём новый проект, вставляем текст, компилируем - не падает :). Сохраняем новый проект, компилируем - падает.
13 авг 18, 13:44    [21640369]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Arioch
Member

Откуда:
Сообщений: 10943
Гирлионайльдо,

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

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

Есть у меня в загашнике еще более сложная вещь, требующая довольно сложной конструкции из EXE+BPL+BPL, неужели и ее могли не заткнуть? Жаль, QC убит.
13 авг 18, 13:45    [21640373]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Arioch
Member

Откуда:
Сообщений: 10943
Kazantsev Alexey
Копируем текст dpr, создаём новый проект, вставляем текст


а вот так?

https://github.com/the-Arioch/XE2_AutoOpenUnit/commit/aba71622953af0605837a4c0f67792fac4ea0a16
13 авг 18, 13:46    [21640378]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
GunSmoker
Member

Откуда:
Сообщений: 3110
Товарищи, как можно, я же ночью спать не буду.
13 авг 18, 13:48    [21640388]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Arioch
Member

Откуда:
Сообщений: 10943
GunSmoker,

Гражданин! у вас вся ночь - белая!
13 авг 18, 13:49    [21640391]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3732
Arioch
а вот так?

Ну так ожидаемое file not found.
13 авг 18, 13:54    [21640405]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Arioch
Member

Откуда:
Сообщений: 10943
Arioch
Предположу, что у тебя нестандартные пути ergo у тебя вообще файл исходников по EXE не находило и в функцию не заходило по сути


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

Последняя проверка - сделай как раньше (новый проект, копи-паст), а потом в свойствах проекта убери нестандартную Output Directory
13 авг 18, 13:56    [21640413]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3732
Arioch
Последняя проверка - сделай как раньше (новый проект, копи-паст), а потом в свойствах проекта убери нестандартную Output Directory

У меня там всё стандартное.
13 авг 18, 13:58    [21640417]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Arioch
Member

Откуда:
Сообщений: 10943
Kazantsev Alexey
Arioch
Последняя проверка - сделай как раньше (новый проект, копи-паст), а потом в свойствах проекта убери нестандартную Output Directory

У меня там всё стандартное.


тогда откуда может взяться
Kazantsev Alexey
ожидаемое file not found.
???
13 авг 18, 14:06    [21640438]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Kazantsev Alexey
Member

Откуда:
Сообщений: 3732
Arioch
тогда откуда может взяться

Ты у себя-то попробуй несохранённый проект запустить, предварительно очистив дефолтный локейшн.
13 авг 18, 14:09    [21640446]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 426
Сделал пример, более короткий, с проявлением данного бага (Одна процедура)

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


+
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.
13 авг 18, 14:10    [21640449]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Гирлионайльдо
Member

Откуда:
Сообщений: 426
Надо было exit то убрать. Он не влияет на работу бага
+
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;
13 авг 18, 14:12    [21640455]     Ответить | Цитировать Сообщить модератору
 Re: XE2 string double-free  [new]
Arioch
Member

Откуда:
Сообщений: 10943
Kazantsev Alexey
Arioch
тогда откуда может взяться

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


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

это же не Turbo Pascal 5.x где можно было Compile To Memory
13 авг 18, 14:18    [21640475]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / Delphi Ответить