|
|
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
Гирлионайльдо, тут бага нет! Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2018, 09:56 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
Гирлионайльдо, бага компилятора нет - есть бага программиста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2018, 10:12 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
Так проблема в способе передачи const строки в delphi. Когда строка передается как const параметр, происходит передача непосредственно адреса блока памяти, в котором лежит строка, без увеличения счетчика ссылок. Если мы внутри процедуры меняем переменную, которую передали как const параметр (хоть глобальную, хоть поле класса, хоть переданную через другой параметр ка var), значение const параметра может испортится, если счетчик ссылок обнулится. Так что вывод - нельзя менять внутри процедуры переменную, значение которой передано туда же как const параметр. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2018, 10:34 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
BarloneТак что вывод - нельзя менять внутри процедуры переменную, значение которой передано туда же как const параметр. const вообще для этого и предусмотрен. А воспроизводящим неплохо бы привести листинги сгенерироованного кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2018, 10:57 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
schiBarloneТак что вывод - нельзя менять внутри процедуры переменную, значение которой передано туда же как const параметр. const вообще для этого и предусмотрен. А воспроизводящим неплохо бы привести листинги сгенерироованного кода. Ну как бы... Код: pascal 1. 2. 3. 4. 5. 6. 7. Если мы напишем вызов Test(aa), то после присвоения aa внутри Test значение параметра поломается. const - это про то, что мы не можем напрямую менять arg внутри Test. Про то, что нельзя менять переменную, связанную с const параметром, напрямую нигде в документации кажется не написано (я не нашел), но если задуматься о том, как оно внутри реализовано, то это понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2018, 13:10 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
BarloneПро то, что нельзя менять переменную, связанную с const параметром, напрямую нигде в документации кажется не написано (я не нашел). Основные негласные правила программирования: параметры функций . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2018, 14:13 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
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 и отщёлкивать его назад при выходе из функции. А иначе - мы тут пока с рекурсиями игрались, но есть же ещё многопоточность.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2018, 16:14 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
а компотArioch The, неси дрова в "как я лажанулся" я не пишу комплиятор Дельфи а компот Код: pascal 1. ну так на хрена Дельфи чистит объекты, на которые есть живая ссылка? это косяк Дельфи, очевидный есть ссылка - объект живой а компот Код: pascal 1. передаём валидную переменную то, что Дельфи за каким-то чертом в валидную переменную кладет невалидную ссылку - вопрос к авторам Дельфи, а не к пользователям Дельфи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2018, 16:19 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
AriochИ - ошибка в Delphi 10.2 которой нет в XE2 на мой вкус будет другим багом. У меня в XE2 его код тоже даёт ошибку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2018, 16:29 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
BarloneТак что вывод - нельзя менять внутри процедуры переменную, значение которой передано туда же как const параметр. как будто процедура знает, что именно в неё передается а что потом, процедура не должна трогать переменные, которые может быть в ДРУГОМ ПОТОКЕ передаются констами в другую совсем функцию из другой библиотеки ? Гирлионайльдовыкладываю самый наглядный пример бага На XE2 воспроизвёлся. https://github.com/the-Arioch/XE2_AutoOpenUnit/blob/master/Delphi_String_Bug/Girli_str_2xFree_Minimized.dpr ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2018, 16:41 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
AriochНа XE2 воспроизвёлся. https://github.com/the-Arioch/XE2_AutoOpenUnit/blob/master/Delphi_String_Bug/Girli_str_2xFree_Minimized.dpr у кого есть пароль от их Джиры - закиньте им туда баг c этой демонстрацией пжлст, у меня был только от публичного QC и заводить от приватной Джиры мне лень ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2018, 16:47 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
AriochМое текущее мнение, что единственно корректным поведением компилятора былоа бы считать const string отдельным типом данных и увеличивать счётчик при присвоении volatile string -> const string function parameter и отщёлкивать его назад при выходе из функции. Reiterating.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2018, 16:48 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
AriochМое текущее мнение, что единственно корректным поведением компилятора былоа бы считать const string отдельным типом данных и увеличивать счётчик при присвоении volatile string -> const string function parameter и отщёлкивать его назад при выходе из функции. А иначе - мы тут пока с рекурсиями игрались, но есть же ещё многопоточность....Уберите const - и получите ровно это поведение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 07:05 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
Ariochкак будто процедура знает, что именно в неё передается а что потом, процедура не должна трогать переменные, которые может быть в ДРУГОМ ПОТОКЕ передаются констами в другую совсем функцию из другой библиотеки ? Процедура ничего не знает, программист знает. И да, именно так, если в другом потоке менять переменную, переданную как const, будет тот же эффект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 07:08 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
С другим потоком - это вообще зло обращаться к переменной в тот момент, когда она меняется в другом потоке. Даже если параметр не const строка, в одном потоке счетчик ссылок уменьшается, в другом увеличивается. Есть ненулевой шанс словить проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 07:17 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
BarloneПроцедура ничего не знает, программист знает. 1) он не должен знать, есть такие вещи как структурное и объектно-ориентированной приложение. Скть клоторый в том, что когда человек пишет один кусочек программы, он не должен держать в памяти все и каждую другую строчку программы, а должно быть достаточно думать о конкретной задаче 2) ты никогда не использовал чужие библиотеки? всю RTL дельфи ты самолично с нуля переписал? нет, конечно, в школе, когда программа занимает максимум два экрана и пишется одним человеком - там да, там ты в любую секунду помнишь каждую строчку и можешь заниматься микроменеджментом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 12:04 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
BarloneУберите const - и получите ровно это поведение. очевидно же, что нет я получу ненужный мне риск опечататься (или вернуться к доработке функции месяц спустя) и изменить переменную, разрушив логику окончания функции. кроме того я получу отключение оптимизации всех вызовов ИЗ этой функции, а они для многопроцессорных систем довольно затратные. Сколько там уже потоко у тред-риппера, 64 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 12:06 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
BarloneС другим потоком - это вообще зло обращаться к переменной в тот момент, когда она меняется в другом потоке а это просто неправда точнее это сферическая правда в вакууме к этой теме вообще никак не относящаяся изменяется переменная Simulated_Call обращение идёт к переменной FileName никто в этой теме никогда не обращался к той переменной, которая изменяется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 12:13 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
Это не проблема в конкретной версии компилятора, это концептуальная проблема передачи const sting параметров - при этом не создается новая строковая переменная, а образуется алиас. Если в какой-то версии компилятора нет падения с av - это еще не говорит об отсутствии обращения к освобожденной памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 13:40 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
BarloneЭто не проблема в конкретной версии компилятора ясень пень, тут же тестировали на куче версий с xe2 до 10.2 - во всех одна проблема Barloneверсии компилятора нет падения с av - это еще не говорит об отсутствии обращения к освобожденной памяти. само собой но баги use after free и double-free - это разные баги хотя (и я с самого начала сказал) - родственные (вытекающие из общей недопроработки концепции) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 14:19 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
Barloneнет падения с av кстати, AV тут и не было, было IMO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 14:20 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
AriochAriochНа XE2 воспроизвёлся. https://github.com/the-Arioch/XE2_AutoOpenUnit/blob/master/Delphi_String_Bug/Girli_str_2xFree_Minimized.dpr у кого есть пароль от их Джиры - закиньте им туда баг c этой демонстрацией пжлст, у меня был только от публичного QC и заводить от приватной Джиры мне лень ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 14:27 |
|
||
|
XE2 string double-free
|
|||
|---|---|---|---|
|
#18+
Можно просто проверить счетчик ссылок: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. после присваивания глобальной переменной у связанного с ней параметра он обнуляется - а значит память под старое значение уже освобождена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2018, 14:52 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39687982&tid=2040522]: |
0ms |
get settings: |
9ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
67ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
92ms |
get tp. blocked users: |
2ms |
| others: | 221ms |
| total: | 432ms |

| 0 / 0 |
