TGViewer
Бестиарий программирования Бестиарий программирования @programming_tales · 1.14K subscribers
Post #517 750
Тяжела и неказиста жизнь ложных срабатываний анализатора. Встретился вот такой необычный случай при проверке Java проекта LanguageTool:
public String getEnclitic(AnalyzedToken token) {
....
if (word.endsWith("ه")) {
suffix = "ه";
....
else if ((word.equals("عني") ||
word.equals("مني")) &&
word.endsWith("ني") // <=
) {
suffix = "ني";
}
....
}

Предупреждение PVS-Studio: V6007 Expression 'word.endsWith("ني")' is always false. ArabicTagger.java 428

Если смотреть на строковые константы так, как привыкли носители английского, французского, немецкого или русского языка – сообщение анализатора действительно кажется справедливым. Однако, здесь стоит помнить о том, что в арабском языке написание и чтение происходит справа-налево. А значит, там, где не носитель арабского языка ожидает конец литерала, на самом деле столкнётся с его началом. И в этой ситуации анализатор оказался не носителем арабского языка.

К слову, если учесть RTL (right-to-left, справа-налево) написание слова, здесь окажется, что условие на самом деле всегда истинно, а не ложно.

А как Java обрабатывает языки с письмом справа налево? Секрет в том, что Java работает не с "визуальным" представлением текста, а с его Unicode-кодировкой. В Unicode символы любых языков — как с направлением слева направо, так и справа налево — хранятся в логическом порядке, то есть в том порядке, в котором они вводятся и читаются носителями языка.

Это означает, что Java не требуется выполнять какие-либо специальные преобразования для работы с RTL-текстом. Строка остаётся обычной последовательностью Unicode-кодовых точек, а такие операции, как получение длины строки, доступ к символам или выделение подстроки, работают одинаково для всех языков.

Поэтому, для вот такой проверки:
System.out.println("مرحباً بالجميع".endsWith("بالجميع"));

Результатом будет true, хотя если читать слева направо, то строка начинается, а не закачивается с "بالجميع".

Случай познавательный и интересный для нас, хотя с ходу пока не понятно, как быть с такими ситуациями. Выписали в todo на обдумывание.
  • 👀 8
More from @programming_tales
  1. Oct 2, 2026Запись вебинара: Go vet не поможет... Как сделать свой анализатор кода для Go?
  2. Oct 2, 2026В целях нетворкинга и просто так приглашаю коннектиться в TenChat — что-то типа LinkedIn.…
  3. Sep 29, 2026Сегодня коллега демонстрирует, как визуально проявляют себя баги в Java коде: Нашёл ошибки…
  4. Sep 29, 2026photo post
  5. Sep 28, 2026На днях выступал с докладом на форуме "Безопасность транспортных средств", организованном…
  6. Sep 28, 2026photo post
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →