Page 1 of 2

Поиск в Просмотрщике (Viewer): не учитывается [x] Whole words, если выставлено [x] Case sensitive

Posted: Tue 03 Sep, 2019 19:19
by HaRT
Как воспроизвести:
0. Сохранить файл с текстом audiovideo video.
1. Открыть Фар без плагинов (проверял только в x86).
2. Открыть тот файл в Просмотрщике.
3. Запустить поиск строки video с выставленными [x] Whole words и [x] Case sensitive.

Ожидаю, что будет найдено сразу второе слово.
Получаю, что находится вторая часть первого.

Если убрать [x] Case sensitive, то ошибка не проявляется.

В сборке 5362 ошибки ещё нет, в — уже есть.

Поиск в Просмотрщике (Viewer): не учитывается [x] Whole words, если выставлено [x] Case sensitive

Posted: Tue 03 Sep, 2019 19:31
by 2useven10
попробовал 5364 x64 - находит второе слово.

Поиск в Просмотрщике (Viewer): не учитывается [x] Whole words, если выставлено [x] Case sensitive

Posted: Tue 03 Sep, 2019 19:36
by Shmuel
2useven10, полностью подтверждаю описание, данное HaRT. x86.

Поиск в Просмотрщике (Viewer): не учитывается [x] Whole words, если выставлено [x] Case sensitive

Posted: Tue 03 Sep, 2019 19:38
by 2useven10
может 5462/64 ?

Поиск в Просмотрщике (Viewer): не учитывается [x] Whole words, если выставлено [x] Case sensitive

Posted: Tue 03 Sep, 2019 19:40
by 2useven10
у меня 5462 х86 тоже находит второе слово...
покажите все настройки просмотра.

Поиск в Просмотрщике (Viewer): не учитывается [x] Whole words, если выставлено [x] Case sensitive

Posted: Tue 03 Sep, 2019 19:41
by Shmuel
2useven10 wrote: Tue 03 Sep, 2019 19:38 может 5462/64 ?
В 5454 не повторяется.

Поиск в Просмотрщике (Viewer): не учитывается [x] Whole words, если выставлено [x] Case sensitive

Posted: Tue 03 Sep, 2019 19:43
by HaRT
2useven10 wrote: Tue 03 Sep, 2019 19:31 попробовал 5364 x64 - находит второе слово.
Проверил x64 на чистом профиле — тоже второе, а в x86 (тоже на чистом) — хвост первого.
2useven10 wrote: Tue 03 Sep, 2019 19:40 покажите все настройки просмотра.
, притом [x] Save file position вроде не влияет.

Но ведь в x86 воспроизводится.

Поиск в Просмотрщике (Viewer): не учитывается [x] Whole words, если выставлено [x] Case sensitive

Posted: Tue 03 Sep, 2019 19:47
by 2useven10
в транке на чистом профиле есть?
ок. попробую сам...

Поиск в Просмотрщике (Viewer): не учитывается [x] Whole words, если выставлено [x] Case sensitive

Posted: Tue 03 Sep, 2019 20:44
by 2useven10
да на x86 удалось повторить...

Поиск в Просмотрщике (Viewer): не учитывается [x] Whole words, если выставлено [x] Case sensitive

Posted: Thu 05 Sep, 2019 11:33
by 2useven10
Как-то там всё неочевидно.
Попытки отладки - компиляция с дебугом, вставка отладочных OutputDebugString() ошибку убирают.
По коду таких последствий вроде быть не должно.
За пару часов проблему мне решить не удалось, больше пока времени нет.
Так что позже, если кто-то возьмётся раньше - велкам...

Поиск в Просмотрщике (Viewer): не учитывается [x] Whole words, если выставлено [x] Case sensitive

Posted: Fri 06 Sep, 2019 13:57
by 2useven10
Проблема в том, что компилятор инлайнит код

Code: Select all

static bool is_word_div(const wchar_t ch)
{
	static const wchar_t extra_div[] = { Utf::BOM_CHAR, Utf::REPLACE_CHAR };
	return !ch || std::iswspace(ch) || contains(Global->Opt->strWordDiv.Get(), ch) || contains(extra_div, ch);
}
так что для проверки принадлежности extra_div зовётся wcschr(ch, extra_div), а поскольку терминирующий '\0' там отсутствует, результат получается неожиданным.

Поиск в Просмотрщике (Viewer): не учитывается [x] Whole words, если выставлено [x] Case sensitive

Posted: Fri 06 Sep, 2019 14:01
by 2useven10
Хотя собственно так contains и определён в string_utils.hpp

Поиск в Просмотрщике (Viewer): не учитывается [x] Whole words, если выставлено [x] Case sensitive

Posted: Fri 06 Sep, 2019 17:09
by HaRT
Спасибо, что разобрались в причинах!
2useven10 wrote: Fri 06 Sep, 2019 13:57 Проблема в том, что компилятор инлайнит код
По последующему описанию выходит, что проблема не столько в этом, сколько в том, что
2useven10 wrote: Fri 06 Sep, 2019 13:57 для проверки принадлежности extra_div зовётся wcschr(ch, extra_div)
Значит, ошибка в том, что вызывается contains(const wchar_t* const Str, wchar_t const What).
Получается, нужна ещё одна специализация — для массива. (Точнее, две, потому что для массивов charов тоже.)

Вообще странно, что оно не падало, при поиске символа выходя за границы массива и впоследствии за границы страницы памяти.

Поиск в Просмотрщике (Viewer): не учитывается [x] Whole words, если выставлено [x] Case sensitive

Posted: Fri 06 Sep, 2019 18:21
by DrKnS
HaRT wrote: Fri 06 Sep, 2019 17:09 Получается, нужна ещё одна специализация — для массива. (Точнее, две, потому что для массивов charов тоже.)
Уже есть, но там всё немного сложнее.

Поиск в Просмотрщике (Viewer): не учитывается [x] Whole words, если выставлено [x] Case sensitive

Posted: Fri 06 Sep, 2019 20:00
by HaRT
DrKnS wrote: Fri 06 Sep, 2019 18:21 Уже есть, но там всё немного сложнее.
Да, почитал я поподробнее на эту тему и немного расстроился. Получается, надо либо в той или иной форме явно указывать, что вызываем проверку именно для массива, либо завершать массивы нулями, чтобы они могли обрабатываться как строки.