SASGIS - SAS.Планета
View Issue Details
0003395SAS.Планета[All Projects] Багpublic11-01-2019 16:1714-01-2019 12:55
Helpmister 
zed 
normalminoralways
resolvedfixed 
181221 
1906xx1906xx 
0003395: Вылет ошибки при удалении категории меток
Ошибка будет, если метка - JPG
Импорт фотографий JPG(создаётся новая категория)
Удаляем "Новая категория", закрываем окно "Управление метками", закрываем SAS,
ОшибкИ программы
No tags attached.
jpg Bag.jpg (66,874) 11-01-2019 16:45
http://www.sasgis.org/mantis/file_download.php?file_id=2259&type=bug
jpg

? SASPlanet.Debug.elf (44,365) 11-01-2019 16:59
http://www.sasgis.org/mantis/file_download.php?file_id=2260&type=bug
? SASPlanet.NonUnicode.Debug.elf (43,417) 11-01-2019 17:21
http://www.sasgis.org/mantis/file_download.php?file_id=2261&type=bug
Issue History
11-01-2019 16:17HelpmisterNew Issue
11-01-2019 16:31zedNote Added: 0018493
11-01-2019 16:45HelpmisterFile Added: Bag.jpg
11-01-2019 16:49HelpmisterNote Added: 0018494
11-01-2019 16:51zedNote Added: 0018495
11-01-2019 16:52zedNote Edited: 0018495bug_revision_view_page.php?bugnote_id=18495#r7342
11-01-2019 16:59HelpmisterFile Added: SASPlanet.Debug.elf
11-01-2019 16:59HelpmisterNote Added: 0018496
11-01-2019 17:09zedNote Added: 0018497
11-01-2019 17:13HelpmisterNote Added: 0018498
11-01-2019 17:21HelpmisterFile Added: SASPlanet.NonUnicode.Debug.elf
11-01-2019 17:21HelpmisterNote Added: 0018499
11-01-2019 17:34zedNote Added: 0018500
11-01-2019 17:37HelpmisterNote Added: 0018501
13-01-2019 11:08zedStatusnew => feedback
13-01-2019 22:10HelpmisterNote Added: 0018506
13-01-2019 22:10HelpmisterStatusfeedback => new
14-01-2019 06:07zedNote Added: 0018507
14-01-2019 06:47vdemidovStatusnew => feedback
14-01-2019 12:00zedNote Added: 0018508
14-01-2019 12:00zedStatusfeedback => resolved
14-01-2019 12:00zedFixed in Version => 1906xx
14-01-2019 12:00zedResolutionopen => fixed
14-01-2019 12:00zedAssigned To => zed
14-01-2019 12:01zedTarget Version => 1906xx
14-01-2019 12:55vdemidovNote Added: 0018509

Notes
(0018493)
zed   
11-01-2019 16:31   
Какие ошибкИ? Дебажная версия создаёт лог?
(0018494)
Helpmister   
11-01-2019 16:49   
Добавил картинки. Пойдёт?
(0018495)
zed   
11-01-2019 16:51   
(edited on: 11-01-2019 16:52)
Не пойдёт.

0. Скачать крайнюю ночную версию;
1. Запустить SASPlanet.NonUnicode.Debug.exe;
2. Воспроизвести ошибку;
3. Приложить создавшийся *.elf файл с логом.

(0018496)
Helpmister   
11-01-2019 16:59   
Вложил
(0018497)
zed   
11-01-2019 17:09   
Метки в SML формате храните?

У меня никак не воспроизводится...
(0018498)
Helpmister   
11-01-2019 17:13   
Да, в SML

Дайте время, протестю ещё раз
(0018499)
Helpmister   
11-01-2019 17:21   
На крайней ночнушке тоже самое
Эльфа вложил
(0018500)
zed   
11-01-2019 17:34   
Можете записать видео того, как вы воспроизводите ошибку на чистой ночной сборке?
(0018501)
Helpmister   
11-01-2019 17:37   
Попробую.
(0018506)
Helpmister   
13-01-2019 22:10   
Zed Я Вам отправил ЛС, получили?
(0018507)
zed   
14-01-2019 06:07   
Нет. По определённым причинам со мной невозможно связаться через форум.

Пишите мне на почту [email protected], если надо что-то обсудить в привате.
(0018508)
zed   
14-01-2019 12:00   
Получил видео, воспроизвёл ошибку и нашёл баг в TIDInterfaceList.

Как воспроизвести:
- создать пустую SML базу меток;
- добавить 2 метки в одну вновь созданную категорию;
- удалить категорию;
- закрыть программу - произойдёт AV в методе TIDInterfaceList.SetCapacity на строке SetLength(FList, NewCapacity) (NewCapacity = 0, т.е. идёт очистка списка).

Сам баг живёт в методе TIDInterfaceList.Delete, когда происходит удаление НЕ последнего элемента, т.е. когда вызывается метод Move.

Засада в том, что элемент содержит интерфейсную переменную и после Move остаётся её мусорная копия. Всё бы ничего, мы же в коде к той переменной не обращаемся и RefCount работает как надо, но вот когда вызывается SetLength, который обнаруживает там интерфейсную переменную не равную nil, вот тогда он и пытается её удалить и вываливается в AV.

Есть 2 решение проблемы:
- подчищать мусор после Move в Delete;
- использовать Realloc и указатель на массив, вместо SetLength в SetCapacity.

Первый метод проще, его и применил.
(0018509)
vdemidov   
14-01-2019 12:55   
> Первый метод проще, его и применил.
Все правильно. Похожий код есть при вставке элемента.

Но я совсем не понимаю, как эта бяка прожила там так долго. Капец.