Tesseract. Розпізнаємо помилки у системі розпізнавання

Tesseract – вільна комп'ютерна програма для розпізнавання текстів, яку розробляє Google. В описі проекту йдеться: "Tesseract is probably the most accurate open source OCR engine available". А спробуймо, чи зможе статичний аналізатор PVS-Studio розпізнати якісь помилки в цьому проекті.

розпізнаємо

Вихідний код проекту доступний на сайті Google Code: https://code.google.com/p/tesseract-ocr/

Об'єм вихідного коду близько 16 мегабайт.

Результати перевірки

Наведу фрагменти коду, на які я звернув увагу, переглядаючи звіт PVS-Studio. Можливо, я щось упустив. Тому творцям Tesseract доцільно провести перевірку самостійно. Пробна версія, активна 7 днів, що більш ніж достатньо для такого невеликого проекту. Ну а потім їм вирішувати, чи хочуть вони регулярно використовувати інструмент і знаходити друкарські помилки, чи ні.

Як завжди, нагадаю. Суть статичного аналізу над разових перевірках, а регулярному використанні.

Невдалий поділ

Попередження PVS-Studio: V636 The '1 / 2' expression був implicitly casted from 'int' type to 'float' type. Consider, використовуючи explicit тип cast to avoid the loss of a fractional part. An example: double A = (double) (X) / Y;. language_model.cpp 1163

Змінну gap_ratio хочуть порівняти зі значенням 0.5. На жаль, вибрано невдалий спосіб записати 0.5. Поділ 1/2 є цілим і дає в результаті 0.

Коректний код має бути таким:

Є й інші місця, де здійснюється підозрілий цілісний поділ. Можливо, серед них є справді неприємні помилки.

Фрагменти коду, які варто перевірити:

  • baselinedetect.cpp 110
  • bmp_8.cpp 983
  • cjkpitch.cpp 553
  • cjkpitch.cpp 564
  • mfoutline.cpp 392
  • mfoutline.cpp 393
  • normalis.cpp 454

Помилка у порівнянні

Попередження PVS-Studio: V547 Expression 'c == 'x' && c == 'X'' is always false. Probably the '' operator should be used here. scanutils.cpp 135

Правильний варіант перевірки:

Невизначена поведінка

Виявилася одна цікава конструкція. Я такого ще не бачив:

Попередження PVS-Studio: V567 Undefined behavior. The 'num_deleted_boxes' variable є зміненим, коли виконується два точці між пунктами. tabvector.cpp 735

Результат висловлення передбачити неможливо. Змінна 'num_deleted_boxes' може бути збільшена до присвоєння, так і після. Причина - змінна змінюється двічі на одній точці прямування.

Інші помилки, що призводять до невизначеної поведінки, пов'язані з використанням зрушень. Розглянемо приклад:

Попередження V610 Undefined behavior. Check the shift operator '

PVS-Studio

Знайдіть помилки у своєму C, C++, C# та Java коді

Пропонуємо перевірити код вашого проекту за допомогою аналізатора коду PVS-Studio. Одна знайдена у ньому помилка скаже вам про користь методології статичного аналізу коду більше десятка статей.