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


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