Tesseractред рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдиреЛ



Tesseract Google рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рдлреНрд░реАрд╡реЗрдпрд░ рдЯреЗрдХреНрд╕реНрдЯ рд░рд┐рдХрдЧреНрдирд┐рд╢рди рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╣реИред рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд┐рд╡рд░рдг рдХрд╣рддрд╛ рд╣реИ: "рдЯреЗрд╕рд░реИрдХреНрдЯ рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рд╕рдЯреАрдХ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдУрд╕реАрдЖрд░ рдЗрдВрдЬрди рдЙрдкрд▓рдмреНрдз рд╣реИред" рдФрд░ рдЖрдЗрдП рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рд╕реНрдЯреИрдЯрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрд┐рд╕реА рднреА рддреНрд░реБрдЯрд┐ рдХреЛ рдкрд╣рдЪрд╛рди рд╕рдХрддреЗ рд╣реИрдВред



Tesseract



рдЯреЗрд╕рд░реЗрдХреНрдЯ 1980 рдХреЗ рджрд╢рдХ рдХреЗ рдордзреНрдп рд╕реЗ 1990 рдХреЗ рдордзреНрдп рддрдХ рд╣реЗрд╡рд▓реЗрдЯ-рдкреИрдХрд░реНрдб рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдХрд╕рд┐рдд рдПрдХ рдирд┐рд╢реБрд▓реНрдХ рдкрд╛рда рдкрд╣рдЪрд╛рди рдХрдВрдкреНрдпреВрдЯрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ, рдФрд░ рдлрд┐рд░ 10 рд╡рд░реНрд╖реЛрдВ рддрдХ "рд╢реЗрд▓реНрдл рдкрд░ рдкрдбрд╝рд╛" рд░рд╣рд╛ред рдЕрдЧрд╕реНрдд 2006 рдореЗрдВ, Google рдиреЗ рдЗрд╕реЗ рдЦрд░реАрджрд╛ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП Apache 2.0 рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рддрд╣рдд рд╕реНрд░реЛрдд рдХреЛрдб рдЦреЛрд▓рд╛ред рдлрд┐рд▓рд╣рд╛рд▓, рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА UTF-8 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЕрддрд┐рд░рд┐рдХреНрдд рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рднрд╛рд╖рд╛ рд╕рдорд░реНрдерди (рд░реВрд╕реА рд╕рд╣рд┐рдд) рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред [рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╡рд░реНрдгрди ]



рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб Google рдХреЛрдб рдХреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ: https://code.google.com/p/tesseract-ocr/



рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдорд╛рддреНрд░рд╛ рд▓рдЧрднрдЧ 16 рдореЗрдЧрд╛рдмрд╛рдЗрдЯ рд╣реИред



рдорд╛рдиреНрдпрддрд╛ рдкрд░рд┐рдгрд╛рдо



рдпрд╣рд╛рдВ рдХреБрдЫ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рджреЗрдЦрд╛ рдерд╛ред рд╢рд╛рдпрдж рдореБрдЭреЗ рдХреБрдЫ рдпрд╛рдж рдЖрдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдЯреЗрд╕реЗрд░реИрдХреНрдЯ рдХреЗ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рд╡реЗ рдЕрдкрдиреЗ рджрдо рдкрд░ рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рдкрд░реАрдХреНрд╖рдг рд╕рдВрд╕реНрдХрд░рдг 7 рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рд╣реИ, рдЬреЛ рдЗрд╕ рддрд░рд╣ рдХреА рдПрдХ рдЫреЛрдЯреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдареАрдХ рд╣реИ, рдлрд┐рд░ рд╡реЗ рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЯрд╛рдЗрдкреЛ рдвреВрдВрдврддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред



рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдореИрдВ рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВред рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рд╕рд╛рд░ рдПрдХ рдмрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рдпрдорд┐рдд рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИред



рдмреБрд░рд╛ рд╡рд┐рднрд╛рдЬрди



void LanguageModel::FillConsistencyInfo(....) { .... float gap_ratio = expected_gap / actual_gap; if (gap_ratio < 1/2 || gap_ratio > 2) { consistency_info->num_inconsistent_spaces++; .... }
      
      





PVS-Studio рдЪреЗрддрд╛рд╡рдирд┐рдпрд╛рдБ: V636 '1/2' рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ 'int' рдкреНрд░рдХрд╛рд░ рд╕реЗ 'рдлреНрд▓реЛрдЯ' рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рдерд╛ред рдПрдХ рдЖрдВрд╢рд┐рдХ рднрд╛рдЧ рдХреЗ рдиреБрдХрд╕рд╛рди рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд▓рд╛рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдПрдХ рдЙрджрд╛рд╣рд░рдг: рдбрдмрд▓ рдП = (рдбрдмрд▓) (рдПрдХреНрд╕) / рд╡рд╛рдИ ;; language_model.cpp 1163



рд╡реЗ рдЪрд░ compare gap_ratio тАЩрдХреА рддреБрд▓рдирд╛ 0.5 рдХреЗ рдорд╛рди рд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, 0.5 рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдЕрд╕рдлрд▓ рддрд░реАрдХрд╛ рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ред рдбрд┐рд╡реАрдЬрди 1/2 рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИ рдФрд░ рдкреИрджрд╛рд╡рд╛рд░ 0 рд╣реИред



рд╕рд╣реА рдХреЛрдб рдЗрд╕ рддрд░рд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

 if (gap_ratio < 1.0f/2 || gap_ratio > 2) {
      
      





рдпрд╛ рдЗрд╕ рддрд░рд╣:

 if (gap_ratio < 0.5f || gap_ratio > 2) {
      
      





рдРрд╕реЗ рдЕрдиреНрдп рд╕реНрдерд╛рди рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕рдВрджрд┐рдЧреНрдз рдкреВрд░реНрдгрд╛рдВрдХ рд╡рд┐рднрд╛рдЬрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢рд╛рдпрдж рдЙрдирдореЗрдВ рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдкреНрд░рд┐рдп рдЧрд▓рддрд┐рдпрд╛рдБ рд╣реИрдВред



рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рджреЗрдЦрдиреЗ рд▓рд╛рдпрдХ рд╣реИ:

рддреБрд▓рдирд╛ рдореЗрдВ рдЯрд╛рдЗрдкреЛ



 uintmax_t streamtoumax(FILE* s, int base) { int d, c = 0; .... c = fgetc(s); if (c == 'x' && c == 'X') c = fgetc(s); .... }
      
      





PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V547 рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 'c ==' x '&& c ==' X '' рд╣рдореЗрд╢рд╛ рдЧрд▓рдд рд╣реИред рд╢рд╛рдпрдж '||' рдСрдкрд░реЗрдЯрд░ рдХреЛ рдпрд╣рд╛рдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред Scanutils.cpp 135



рд╕рд╣реА рдЬрд╛рдБрдЪ рд╡рд┐рдХрд▓реНрдк:

 if (c == 'x' || c == 'X') c = fgetc(s);
      
      





рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░



рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдбрд┐рдЬрд╛рдЗрди рдХреА рдЦреЛрдЬ рдХреА рдЧрдИ рдереАред рдореИрдВрдиреЗ рдпрд╣ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ:

 void TabVector::Evaluate(....) { .... int num_deleted_boxes = 0; .... ++num_deleted_boxes = true; .... }
      
      





рдЪреЗрддрд╛рд╡рдиреА PVS-Studio: V567 рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ред рдЕрдиреБрдХреНрд░рдо рдЕрдВрдХреЛрдВ рдХреЗ рдмреАрдЪ рджреЛ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди 'num_deleted_boxes' рдЪрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред tabvector.cpp 735



рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд▓реЗрдЦрдХ рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдб рдПрдХ рдЯрд╛рдЗрдкреЛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред



рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдЪрд░ 'num_deleted_boxes' рдХреЛ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рдмрд╛рдж рджреЛрдиреЛрдВ рдореЗрдВ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдХреЗ рдПрдХ рд╣реА рдмрд┐рдВрджреБ рдкрд░ рдЪрд░ рджреЛ рдмрд╛рд░ рдмрджрд▓рддрд╛ рд╣реИред



рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рдгреА рдЕрдиреНрдп рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкрд╛рд▓реА рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдЬреБрдбрд╝реА рд╣реИрдВ ред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 void Dawg::init(....) { .... letter_mask_ = ~(~0 << flag_start_bit_); .... }
      
      





рдЪреЗрддрд╛рд╡рдиреА V610 рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ред рд╢рд┐рдлреНрдЯ рдСрдкрд░реЗрдЯрд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ <<ред рдмрд╛рдпрд╛рдВ рд╕рдВрдЪрд╛рд▓рдХ '~ 0' рдЛрдгрд╛рддреНрдордХ рд╣реИред dawg.cpp 187



рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ '~ 0' рдкреНрд░рдХрд╛рд░ 'int' рдХрд╛ рд╣реИ рдФрд░ '-1' рдХреЗ рдорд╛рди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдирдХрд╛рд░рд╛рддреНрдордХ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рднрд╛рдЧреНрдп рдФрд░ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИред рдЖрдк '0' рдХреЛ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдХрд░рдХреЗ рджреЛрд╖ рдХреЛ рдареАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 letter_mask_ = ~(~0u << flag_start_bit_);
      
      





рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рд╕рдм рдирд╣реАрдВ рд╣реИред рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдЗрд╕ рд▓рд╛рдЗрди рдкрд░ рдПрдХ рдФрд░ рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИ:



V629 '~ 0 << flag_start_bit_' рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред 64-рдмрд┐рдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рдж рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рде 32-рдмрд┐рдЯ рдореВрд▓реНрдп рдХрд╛ рдмрд┐рдЯ рд╢рд┐рдлреНрдЯрд┐рдВрдЧред dawg.cpp 187



рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЪрд░ 'letter_mask_' рдкреНрд░рдХрд╛рд░ 'uinT64' рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдЙрдЪреНрдЪ 32 рдмрд┐рдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЗрдХрд╛рдЗрдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдирд┐рд░реНрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЧрд▓рдд рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдХрдо рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред



рдЖрдкрдХреЛ '0' рдХреЛ 64-рдмрд┐рдЯ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕рд╣реА рд╡рд┐рдХрд▓реНрдк:

 letter_mask_ = ~(~0ull << flag_start_bit_);
      
      





рдореИрдВ рдЙрди рдЕрдиреНрдп рдХреЛрдб рдЕрдВрд╢реЛрдВ рдХреА рд╕реВрдЪреА рд╕реВрдЪреАрдмрджреНрдз рдХрд░реВрдВрдЧрд╛ рдЬрд╣рд╛рдВ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХреА рдЧрдИ рд╣реИрдВ:

рд╕рдВрджрд┐рдЧреНрдз рдбрдмрд▓ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ



 TESSLINE* ApproximateOutline(....) { EDGEPT *edgept; .... edgept = edgesteps_to_edgepts(c_outline, edgepts); fix2(edgepts, area); edgept = poly2 (edgepts, area); // 2nd approximation. .... }
      
      





PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V519 'рдХрд┐рдирд╛рд░реЗ' рдЪрд░ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рджреЛ рдмрд╛рд░ рдорд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдЧрд▓рддреА рд╣реИред рд▓рд╛рдЗрдиреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ: 76, 78. polyaprx.cpp 78



рдЗрд╕реА рддрд░рд╣ рдХрд╛ рдПрдХ рдФрд░ рдорд╛рдорд▓рд╛:

 inT32 row_words2(....) { .... this_valid = blob_box.width () >= min_width; this_valid = TRUE; .... }
      
      





PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V519 'this_valid' рдЪрд░ рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рджреЛ рдмрд╛рд░ рдорд╛рди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рдЧрд▓рддреА рд╣реИред рдЪреЗрдХ рд▓рд╛рдЗрдиреЗрдВ: 396, 397. wordseg.cpp 397



рдЕрдорд╛рдиреНрдп рд╡рд░реНрдЧ рд╕рджрд╕реНрдп рдЖрд░рдВрднрд┐рдХ рдЕрдиреБрдХреНрд░рдо



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, 'рдорд╛рд╕реНрдЯрд░рдЯреНрд░реЗрдирд░' рд╡рд░реНрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╡рд░реНрдЧ рдХрд╛ рд╕рджрд╕реНрдп 'рдирдореВрдиреЗ_' рд╕рджрд╕реНрдп рдХреЗ рд╕рд╛рдордиреЗ рд╕реНрдерд┐рдд рд╣реИ 'fontinfo_table_':

 class MasterTrainer { .... TrainingSampleSet samples_; .... FontInfoTable fontinfo_table_; .... };
      
      





рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рдЖрд░рдВрдн рдХрд╛ рдХреНрд░рдо рд╡рд░реНрдЧ рдореЗрдВ рдЙрдирдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдХреНрд░рдо рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рд╣реИ рдХрд┐ 'рдирдореВрдиреЗ_' рдХреЛ 'рдлреЙрдиреНрдЯрд┐рдирдлреЛ_рдЯреЗрдмрд▓_' рдХреЗ рдЖрд░рдВрднрд┐рдХ рд░реВрдк рд╕реЗ рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред



рдЕрдм рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 MasterTrainer::MasterTrainer(NormalizationMode norm_mode, bool shape_analysis, bool replicate_samples, int debug_level) : norm_mode_(norm_mode), samples_(fontinfo_table_), junk_samples_(fontinfo_table_), verify_samples_(fontinfo_table_), charsetsize_(0), enable_shape_anaylsis_(shape_analysis), enable_replication_(replicate_samples), fragments_(NULL), prev_unichar_id_(-1), debug_level_(debug_level) { }
      
      





рдкрд░реЗрд╢рд╛рдиреА рдпрд╣ рд╣реИ рдХрд┐ 'рдирдореВрдиреЗ_' рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП uninitialized рдЪрд░ 'fontinfo_table_' рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред



рдлрд╝реАрд▓реНрдб рдХреЗ 'рдЬрдВрдХ_рд╕реНрдореИрдореНрдкреНрд╕_' рдФрд░ 'рд╡реЗрд░рд┐рдлрд╛рдЗ_рд╕реИрдореНрдкреНрд╕_' рдХреЗ рдЖрд░рдВрдн рдХреЗ рд╕рд╛рде рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐ред



рдореИрдВ рдпрд╣ рдХрд╣рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред рдХрдХреНрд╖рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ 'fontinfo_table_' рдХреА рдШреЛрд╖рдгрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред



рд╣рд╛рд▓рдд рдореЗрдВ рдПрдХ рдЯрд╛рдЗрдкреЛ



рдПрдХ рдЯрд╛рдЗрдкреЛ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЛ рдердХрд╛рди рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИред

 class ScriptDetector { .... int korean_id_; int japanese_id_; int katakana_id_; int hiragana_id_; int han_id_; int hangul_id_; int latin_id_; int fraktur_id_; .... }; void ScriptDetector::detect_blob(BLOB_CHOICE_LIST* scores) { .... if (prev_id == katakana_id_) osr_->scripts_na[i][japanese_id_] += 1.0; if (prev_id == hiragana_id_) osr_->scripts_na[i][japanese_id_] += 1.0; if (prev_id == hangul_id_) osr_->scripts_na[i][korean_id_] += 1.0; if (prev_id == han_id_) osr_->scripts_na[i][korean_id_] += kHanRatioInKorean; if (prev_id == han_id_) <<<<==== osr_->scripts_na[i][japanese_id_] += kHanRatioInJapanese; .... }
      
      





PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V581 рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рдд 'if' рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╢рд░реНрдд рднрд╛рд╡ рд╕рдорд╛рди рд╣реИрдВред рдЬрд╛рдБрдЪ рд▓рд╛рдЗрдиреЗрдВ: 551, 553. osdetect.cpp 553



рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд╕рдмрд╕реЗ рд╣рд╛рд▓ рдХреА рддреБрд▓рдирд╛ рдЗрд╕ рддрд░рд╣ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:

 if (prev_id == japanese_id_)
      
      





рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЬрд╛рдБрдЪ



рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ 'рдирдпрд╛' рдСрдкрд░реЗрдЯрд░ рдХреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рддреЛ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдмреЗрд╢рдХ, рдЖрдк рдПрдХ рд╡рд┐рд╢реЗрд╖ рдСрдкрд░реЗрдЯрд░ 'рдирдпрд╛' рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрд╢рдХреНрдд рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдорд╛рдорд▓рд╛ ( рд╡рд┐рд╡рд░рдг ) рд╣реИред



рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 void SetLabel(char_32 label) { if (label32_ != NULL) { delete []label32_; } label32_ = new char_32[2]; if (label32_ != NULL) { label32_[0] = label; label32_[1] = 0; } }
      
      





PVS-Studio рдЪреЗрддрд╛рд╡рдиреА: V668 рдирд▓ рдХреЗ рдЦрд┐рд▓рд╛рдл 'label32_' рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдХреЛрдИ рд╕рдордЭрджрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрдореГрддрд┐ рдХреЛ 'рдирдП' рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдкрд╡рд╛рдж рдЙрддреНрдкрдиреНрди рд╣реЛрдЧрд╛ред char_samp.h 73



101 рд╕реНрдерд╛рди рдРрд╕реЗ рднреА рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕реВрдЪрдХ рдХреЛ 'рдирдпрд╛' рдСрдкрд░реЗрдЯрд░ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рд▓реЗрдЦ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдЪрд▓рд╛рдирд╛ рдЖрд╕рд╛рди рд╣реИред



рдирд┐рд╖реНрдХрд░реНрд╖



рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдФрд░ рдЖрдк рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдФрд░ рдЯрд╛рдЗрдкреЛ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реБрд▓рдЭрд╛рдиреЗ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рдмрдЪрд╛рдПрдВрдЧреЗред



рдФрд░ рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рдореБрдЭреЗ рдлреЙрд▓реЛ рдХрд░рдирд╛ рдирд╛ рднреВрд▓реЗрдВ: @Code_Analysis рдореИрдВ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╕реА ++ рд╕рдВрдмрдВрдзрд┐рдд рд▓реЗрдЦреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реВрдВред



рдХреНрдпрд╛ рдЖрдкрдиреЗ рд▓реЗрдЦ рдкрдврд╝рд╛ рд╣реИ рдФрд░ рдПрдХ рдкреНрд░рд╢реНрди рд╣реИ?
рдЕрдХреНрд╕рд░ рд╣рдорд╛рд░реЗ рд▓реЗрдЦреЛрдВ рд╕реЗ рд╡рд╣реА рдкреНрд░рд╢реНрди рдкреВрдЫреЗ рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдордиреЗ рдпрд╣рд╛рдВ рдЙрдирдХреЗ рдЙрддреНрддрд░ рдПрдХрддреНрд░ рдХрд┐рдП рд╣реИрдВ: рдкреАрд╡реАрдПрд╕-рд╕реНрдЯреВрдбрд┐рдпреЛ рдФрд░ рдХреИрдкреНрдкрдХреИрдЯ, рд╕рдВрд╕реНрдХрд░рдг 2014 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХреЗ рдкрд╛рдардХреЛрдВ рдХреЗ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм ред рдХреГрдкрдпрд╛ рд╕реВрдЪреА рджреЗрдЦреЗрдВред




All Articles