powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / XE2 string double-free
25 сообщений из 91, страница 2 из 4
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
25 сообщений из 91, страница 2 из 4
Форумы / Delphi [игнор отключен] [закрыт для гостей] / XE2 string double-free
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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