Падение при перерисовке комбобокса в диалоге

Здесь можно сообщить о найденных багах в Far.
Post Reply
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Падение при перерисовке комбобокса в диалоге

Post by Shmuel »

Данное падение наблюдается в билдах от 5845 и до последнего на данный момент. 5844 = OK.
Не стал писать в "глюки ночных сборок" ибо там всё свалено в одну общую кучу, а это баг интересный.
Не утверждаю, что именно баг Фара, возможно виноват LuaFAR.
  1. Для воспроизведения нужен Фар с профилем в %farhome%\Profile и приложенный архив, который надо распаковать в %farhome%.
  2. Запускаем Фар, переходим в панель %farhome%
  3. С комстроки запускаем lua:@separ_dialog.lua. Появляется тестовый диалог.
  4. Нажимаем Tab, переходя на поле "Replace with:" диалога.
  5. Нажимаем 2-3 раза CtrlAltRight, диалог при каждом нажатии расширяется.
  6. Нажимаем CtrlShiftR (перезагрузка макросов) с интервалом в несколько секунд. Падение обычно происходит на 1-м - 3-м нажатии.
Bug-test-case-Far-b5852.7z
(12.19 KiB) Downloaded 55 times
bug_report.txt
(34.14 KiB) Downloaded 58 times
Last edited by Shmuel on Thu 29 Jul, 2021 13:18, edited 1 time in total.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Падение при перерисовке комбобокса в диалоге

Post by DrKnS »

Shmuel, оно падает в static void PushList (lua_State *L, const struct FarList *list) и связано с 5845.6.

Немного истории:

zg 11.02.2012 15:12:15 +0200 - build 2449 4. DN_EDITCHANGE/DN_DRAWDLGITEM accepts the copy of dialog item information in Param2. · · · · · · · · · · · · · · · · · · · · · · · · · 4. DN_EDITCHANGE/DN_DRAWDLGITEM в Param2 передаётся копия на данные об элементе диалога.
 
zg 06.02.2014 23:38:11 +0200 - build 3798 1. DM_GETDLGITEM returns the current list for DI_LISTBOX and DI_COMBOBOX items, instead of the list which they were initialized by at their creation. · · · · · · · · · · · · · · · · · · · · · · · · · 1. DM_GETDLGITEM для элементов DI_LISTBOX и DI_COMBOBOX возвращает текущий список, а не список, которым они инициализировались при создании.

Изменения логичные и правильные по отдельности.
К сожалению, было упущено из виду, что внутри Far и DM_GETDLGITEM, и DN_DRAWDLGITEM работают через одну и ту же функцию.
В результате этого при каждом DN_DRAWDLGITEM делалась полная копия листбокса, показывалась плагину и удалялась. А списки иногда бывают большие. И поэтому, например, поиск по всему диску так чудовищно тормозил.

В 5845 это поведение было откорректировано: DM_GETDLGITEM как и раньше, возвращает копию списка, но в DN_DRAWDLGITEM приходит то, чем список инициализировали изначально. Если по этим адресам данных уже нет, но вы с ними пытаетесь что-то делать - будет падать, да.

Кстати, в большинстве случаев у меня при CtrlShiftR получается это:

╔═════════════════════════════════════════════ LuaMacro ══════════════════════════════════════════════╗ ║ (error object is not a string) ║ ║ stack traceback: ║ ║ [C]: in function 'AdvControl' ║ ║ ...\far\Debug.64.vc\Profile\Macros\scripts\reloadmacros.lua:9: in function <...\far\Debug.64.vc\ ║ ║ Profile\Macros\scripts\reloadmacros.lua:4> ║ ╟─────────────────────────────────────────────────────────────────────────────────────────────────────╢ ║ { OK } ║ ╚═════════════════════════════════════════════════════════════════════════════════════════════════════╝

После закрытия на экране остается невидимый диалог, после закрытия которого падает уже в другом месте.
Возможно, связано.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Падение при перерисовке комбобокса в диалоге

Post by Shmuel »

DrKnS, спасибо за проверку.
DrKnS wrote: Thu 29 Jul, 2021 16:05 В 5845 это поведение было откорректировано: DM_GETDLGITEM как и раньше, возвращает копию списка, но в DN_DRAWDLGITEM приходит то, чем список инициализировали изначально. Если по этим адресам данных уже нет, но вы с ними пытаетесь что-то делать - будет падать, да.
Если я правильно понял, то после вызова DM_SETDLGITEM (меняющего изначальные данные списка) обработка DN_DRAWDLGITEM может падать на законных основаниях?
DrKnS wrote: Thu 29 Jul, 2021 16:05 Кстати, в большинстве случаев у меня при CtrlShiftR получается это:
(опущен скриншот ошибки "(error object is not a string)")
У меня это тоже бывает, но наоборот, редко, примерно 1 раз на 10 опытов.
В этом я пока не разбирался, именно по причине редкой встречаемости. Но надо будет разобраться.
Last edited by Shmuel on Thu 29 Jul, 2021 16:43, edited 1 time in total.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Падение при перерисовке комбобокса в диалоге

Post by DrKnS »

Shmuel wrote: Thu 29 Jul, 2021 16:36 Если я правильно понял, то после вызова DM_SETDLGITEM (меняющего изначальные данные списка) обработка DN_DRAWDLGITEM может падать на законных основаниях?
Я не проверял, после DM_SETDLGITEM приходит то, что вы передали или то, что было изначально?

В принципе, можно в DN_DRAWDLGITEM просто показывать null вместо списка.
Владелец списка и так имеет доступ к своим данным, а остальных, пожалуй, лучше не вводить в искушение, показывая потенциально невалидные указатели.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Падение при перерисовке комбобокса в диалоге

Post by Shmuel »

DrKnS wrote: Thu 29 Jul, 2021 17:18 Я не проверял, после DM_SETDLGITEM приходит то, что вы передали или то, что было изначально?
Скрипт расширения диалогов не мой, взят у Alexyz21. Скрипт не меняет содержимое комбобокса, только его расположение в диалоге.
Но LuaFAR не анализирует содержимое, изменилось оно или нет. Он всегда аллоцирует новый кусок памяти для строк (и делает преобразование UTF-8 в UTF-16) при каждом вызове, при котором идёт передача из скрипта в Фар.
Shmuel
Posts: 6819
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 41 times
Been thanked: 528 times

Падение при перерисовке комбобокса в диалоге

Post by Shmuel »

Подведём итоги: падения прекратились, начиная с билда 5859.
drkns 29.07.2021 19:41:27 +0100 - build 5859 2. Continue 5845.6 - do not populate FarDialogItem.ListItems in DN_DRAWDLGITEM.
Post Reply

Return to “Глюки и баги”