Можно ли присваивать AlternateFileName нулевой адрес?
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Можно ли присваивать AlternateFileName нулевой адрес?
Речь про панель плагина. Из опыта, в некоторых случаях можно присвоить AlternateFileName нулевой адрес, и это не вызывает проблем. В энциклопедии вроде тоже говорится, что за выделение памяти тут отвечает плагин, то есть как бы дело плагина, что тут присваивать и потом освобождать.
Но есть особая ситуация, где нулевой адрес в AlternateFileName приводит к падению:
- в панели плагина вызываем поиск (AltF7), ищем все
- найденные файлы показаны в диалоге результатов
- жмем F3 на одном из найденных файлов
- в этот момент Фар вызывает GetFindData, где плагин возвращает данные с AlternateFileName = 0
- вслед за этим Фар вызывает FreeFindData, и вот тут у данных AlternateFileName не равен 0 (кажется, там указатель на пустую строку обычно, но может это и случайно)
При удалении этого ненулевого указателя происходит падение, плагин не выделял эту память.
Вопрос: это ошибка в Фаре или в такой особой ситуации плагин обязан свои данные записать в AlternateFileName?
Если выглядит как ошибка, есть готовый скрипт PowerShellFar, показывающий проблему, причешу и прикреплю. Если это требование к плагину, то надо бы в энциклопедии это описать. Мне кажется, что скорее ошибка в Фаре. Нелогично записывать свои данные в структуру плагина перед вызовом FreeFindData.
Но есть особая ситуация, где нулевой адрес в AlternateFileName приводит к падению:
- в панели плагина вызываем поиск (AltF7), ищем все
- найденные файлы показаны в диалоге результатов
- жмем F3 на одном из найденных файлов
- в этот момент Фар вызывает GetFindData, где плагин возвращает данные с AlternateFileName = 0
- вслед за этим Фар вызывает FreeFindData, и вот тут у данных AlternateFileName не равен 0 (кажется, там указатель на пустую строку обычно, но может это и случайно)
При удалении этого ненулевого указателя происходит падение, плагин не выделял эту память.
Вопрос: это ошибка в Фаре или в такой особой ситуации плагин обязан свои данные записать в AlternateFileName?
Если выглядит как ошибка, есть готовый скрипт PowerShellFar, показывающий проблему, причешу и прикреплю. Если это требование к плагину, то надо бы в энциклопедии это описать. Мне кажется, что скорее ошибка в Фаре. Нелогично записывать свои данные в структуру плагина перед вызовом FreeFindData.
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Можно ли присваивать AlternateFileName нулевой адрес?
Выкладываю скрипт. Запускать командой PowerShellFar
Для простоты лучше его в отдельную папку положить. Панель будет показывать файлы в этой папке. С одним файлом будет проще. Далее шаги, как описаны выше.
Примечание. Падать может не всегда. Но описанная проблема (чужой адрес вместо 0) имеет место.
Code: Select all
ps: .\Test-CrashFindF3-.ps1
Примечание. Падать может не всегда. Но описанная проблема (чужой адрес вместо 0) имеет место.
- Attachments
-
- Test-CrashFindF3-.ps1.7z
- (713 Bytes) Downloaded 80 times
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Можно ли присваивать AlternateFileName нулевой адрес?
Скрипт работает, не падает. Тесты отработали. Арклайт с поиском вроде работает. Старых панельных плагинов нет
Спасибо!
Есть попутный вопрос, просто из любопытства. А зачем при F3 вызывается GetFindData и FreeFindData? По идее, все данные по файлам были получены ранее во время скана, их бы вроде и использовать при F3. Или не все так просто? Или это делается, чтобы гарантированно свежие данные получить (типа мало ли что поменялось во время поиска)? Словом, полезно было бы знать.
Спасибо!
Есть попутный вопрос, просто из любопытства. А зачем при F3 вызывается GetFindData и FreeFindData? По идее, все данные по файлам были получены ранее во время скана, их бы вроде и использовать при F3. Или не все так просто? Или это делается, чтобы гарантированно свежие данные получить (типа мало ли что поменялось во время поиска)? Словом, полезно было бы знать.
- DrKnS
- Posts: 6114
- Joined: Thu 04 Aug, 2005 06:44
- Location: Kyiv
- Has thanked: 12 times
- Been thanked: 426 times
Можно ли присваивать AlternateFileName нулевой адрес?
Я тоже задался этим вопросом и попытался сделать проще, но всё начало падать.
Похоже, плагины ожидают GetFiles только в промежутке между соответствующими GetFindData и FreeFindData, а вот такой прекрасный код всё ломает: Наверное, можно сделать нормально, но это надо полпоиска переписать.
Но на багтрекер написать имеет смысл, мало ли.
Похоже, плагины ожидают GetFiles только в промежутке между соответствующими GetFindData и FreeFindData, а вот такой прекрасный код всё ломает: Наверное, можно сделать нормально, но это надо полпоиска переписать.
Но на багтрекер написать имеет смысл, мало ли.
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Можно ли присваивать AlternateFileName нулевой адрес?
Есть-таки регрессия, просто не всегда проявлялась. Где-то портится память и в результате иногда падает.
Скрипты для воспроизведения прикрепил. Указанные пути существенны. Также требуется, чтобы был плагин TmpPanel и чтобы он открывал файлы с расширением .temp на временной панели (так, вроде, по умолчанию).
- Оба скрипта из архива положить в папку C:\TEMP\test
- Перейти туда и запустить их в специальном "тестовом" режиме командой
Что при этом будет выполнено:
- Скрипт Test-Panel-OverNative..ps1 создает файл C:\TEMP\temp.temp и пишет туда путь до Far.exe
- Затем делается переход на этот файл в панели (тут, кажется, важно, что файл в другой папке)
- Делается Enter на этом файле, в результате открывается временная панель, там файл Far.exe
- Затем запускается панель другого плагина (Фарнет) поверх временной панели (это вызов второго скрипта Test-Panel-.ps1)
В этот момент падаем. Под отладчиком пишет, что память испорчена, других деталей у меня нет. С исходниками Фара, может, понятнее будет.
Если понадобится, то то же самое можно выполнять несколько другой командой с подтверждением каждого шага:
Скрипты для воспроизведения прикрепил. Указанные пути существенны. Также требуется, чтобы был плагин TmpPanel и чтобы он открывал файлы с расширением .temp на временной панели (так, вроде, по умолчанию).
- Оба скрипта из архива положить в папку C:\TEMP\test
- Перейти туда и запустить их в специальном "тестовом" режиме командой
Code: Select all
ps: Invoke-FarStepper .\Test-Panel-OverNative..ps1
- Скрипт Test-Panel-OverNative..ps1 создает файл C:\TEMP\temp.temp и пишет туда путь до Far.exe
- Затем делается переход на этот файл в панели (тут, кажется, важно, что файл в другой папке)
- Делается Enter на этом файле, в результате открывается временная панель, там файл Far.exe
- Затем запускается панель другого плагина (Фарнет) поверх временной панели (это вызов второго скрипта Test-Panel-.ps1)
В этот момент падаем. Под отладчиком пишет, что память испорчена, других деталей у меня нет. С исходниками Фара, может, понятнее будет.
Если понадобится, то то же самое можно выполнять несколько другой командой с подтверждением каждого шага:
Code: Select all
ps: Invoke-FarStepper .\Test-Panel-OverNative..ps1 -Ask
- Attachments
-
- test.7z
- (2.81 KiB) Downloaded 65 times
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Можно ли присваивать AlternateFileName нулевой адрес?
Забавно. А у меня этому тесту уже несколько лет, и проблема проявилась только со вчерашним изменением. И то не на всех машинах, вчерашнее домашнее тестирование было "успешным".
UPD. Это не так, смотри далее. Вчерашнее изменение случайно совпало с тем, что проблема, кажется, проявляется только на моей рабочей машине, а я был в отпуске и на работе не тестировал. Если бы не отпуск, то очень вероятно, что я "поймал" бы момент регрессии вовремя.
UPD. Это не так, смотри далее. Вчерашнее изменение случайно совпало с тем, что проблема, кажется, проявляется только на моей рабочей машине, а я был в отпуске и на работе не тестировал. Если бы не отпуск, то очень вероятно, что я "поймал" бы момент регрессии вовремя.
Last edited by NightRoman on Thu 07 Apr, 2016 15:54, edited 1 time in total.
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Можно ли присваивать AlternateFileName нулевой адрес?
4615
Кое-что отвалилось. Скрипт на этот раз не нужен (пока).
- Выполнить через меню: F11 \ PowerShellFar \ Power panel \ Function:
- Открывается панель функций PowerShell
Ожидается, что вначале элемент "..", потом функция "A:" (обычно). В 4615 "A:" вначале, а ".." где-то посреди панели.
Кое-что отвалилось. Скрипт на этот раз не нужен (пока).
- Выполнить через меню: F11 \ PowerShellFar \ Power panel \ Function:
- Открывается панель функций PowerShell
Ожидается, что вначале элемент "..", потом функция "A:" (обычно). В 4615 "A:" вначале, а ".." где-то посреди панели.
- DrKnS
- Posts: 6114
- Joined: Thu 04 Aug, 2005 06:44
- Location: Kyiv
- Has thanked: 12 times
- Been thanked: 426 times
Можно ли присваивать AlternateFileName нулевой адрес?
Потому что у тебя ".." - не папка (нет FILE_ATTRIBUTE_DIRECTORY), вот он и сортируется как regular file.
Это зачем-то поломали в 4613.
4616.
И да, всё это имеет очень мало отношения к исходной теме.
Это зачем-то поломали в 4613.
4616.
И да, всё это имеет очень мало отношения к исходной теме.
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Можно ли присваивать AlternateFileName нулевой адрес?
4616
Все тесты отработали. Но на этой машине и вчера не падало. Завтра проверю на других.
Все тесты отработали. Но на этой машине и вчера не падало. Завтра проверю на других.
Можно ли присваивать AlternateFileName нулевой адрес?
В 4613 чинили баги закопанные в рефакторинге 4564.
Действительно не имеющие отношения к этой теме (там было задваивание "..").
Это вылезло, потому что заодно был убран сомнительный интеллект с принудительным
выставлением флага DIRECTORY для "..", но как оказалось кому-то он нужен.
Действительно не имеющие отношения к этой теме (там было задваивание "..").
Это вылезло, потому что заодно был убран сомнительный интеллект с принудительным
выставлением флага DIRECTORY для "..", но как оказалось кому-то он нужен.
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact:
Можно ли присваивать AlternateFileName нулевой адрес?
@DrKnS, пример из test.7z у меня все еще падает на других машинах. И пока падает только 64-бит версия, стабильно. На той же машине падение на 32-бит пока не наблюдалось.
- NightRoman
- Posts: 6184
- Joined: Fri 18 Aug, 2006 13:52
- Location: Cambridge, UK
- Has thanked: 32 times
- Been thanked: 62 times
- Contact: