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 '

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