Bug in the viewer search found

4 views
Skip to first unread message

Sergey Cheban

unread,
Mar 14, 2010, 8:21:38 PM3/14/10
to fardev
Здравствуйте.

У меня возникли проблемы с поиском строки в текстовом файле, открытом
во viewer'е в кодировке UTF-8. Я не поленился разобраться и, похоже,
нашёл причину этого бага.

Для демонстрации бага я подготовил тестовый файл
ftp://people.drweb.com/people/s.cheban/FarSearchBug/test

Баг заключается в следующем:
1. Функция vread(), которая используется для чтения файла в процессе
поиска, возвращает количество прочитанных символов.
2. Внутри функция vread() устроена так, что в случае UTF-8 она может
вернуть меньше символов, чем предложенный ей размер буфера.
3. Алгоритм поиска в настоящее время завершается по критерию
"последний прочитанный кусок был меньше, чем размер буфера". (После
предлагаемого патча поиск завершается по критерию "мы не смогли
прочитать ничего" - это мне кажется более правильным).

Этот баг можно, в частности, исправить с помощью предлагаемого патча:
----------------------------------------------------------
Index: viewer.cpp
===================================================================
--- viewer.cpp (revision 4367)
+++ viewer.cpp (working copy)
@@ -2526,7 +2526,7 @@
}
}

- if ((ReverseSearch && CurPos <= 0) || (!ReverseSearch && ReadSize
< BufSize))
+ if ((ReverseSearch && CurPos <= 0) /*|| (!ReverseSearch &&
ReadSize < BufSize)*/)
break;

if (ReverseSearch)
----------------------------------------------------------

Вместо этого можно также переписать функцию vread() так, чтобы она:
- корректно вела себя, если читает, начиная с середины многобайтового
символа. Хотя бы для тех кодировок, для которых это возможно (UTF-8 -
из их числа);
- пыталась полностью заполнить предложенный ей буфер;
- не забывала бы при этом про look ahead chars.
Делать этого я не стал, поскольку в этой функции и так много странного
написано (например, чтение одиночного символа в UTF-8 вынесено в
отдельную ветку). Тем не менее, я думаю, что этот вариант
разработчикам стоит рассмотреть.

С уважением,
Sergey Cheban

Reply all
Reply to author
Forward
0 new messages