From 3b69c2bc4c3e7d689881c5af64e478ae00587fdb Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Mon, 23 Apr 2018 20:49:01 +0200 Subject: [PATCH] Fix CID 1164613 (Uninitialized pointer field) This involves removing some constructors without argument. Signed-off-by: Stefan Weil --- ccutil/elst2.h | 13 ++++++------- textord/gap_map.cpp | 5 +++-- textord/makerow.cpp | 7 +++---- textord/tabfind.cpp | 2 +- textord/topitch.cpp | 15 +++++++-------- textord/tospace.cpp | 20 ++++++++++---------- 6 files changed, 30 insertions(+), 32 deletions(-) diff --git a/ccutil/elst2.h b/ccutil/elst2.h index b62ec39cf9..9982678cd9 100644 --- a/ccutil/elst2.h +++ b/ccutil/elst2.h @@ -169,10 +169,6 @@ class DLLSYM ELIST2_ITERATOR ELIST2_ITERATOR *other_it); //to other current public: - ELIST2_ITERATOR() { //constructor - list = nullptr; - } //unassigned list - ELIST2_ITERATOR( //constructor ELIST2 *list_to_iterate); @@ -253,6 +249,9 @@ class DLLSYM ELIST2_ITERATOR int comparator ( //comparison routine const void *, const void *)); + private: + // Don't use the following constructor. + ELIST2_ITERATOR(); }; /*********************************************************************** @@ -922,13 +921,11 @@ ELIST2IZEH_C. \ class DLLSYM CLASSNAME##_IT : public ELIST2_ITERATOR { \ public: \ - CLASSNAME##_IT() : ELIST2_ITERATOR() {} \ - \ CLASSNAME##_IT(CLASSNAME##_LIST *list) : ELIST2_ITERATOR(list) {} \ \ CLASSNAME *data() { return (CLASSNAME *)ELIST2_ITERATOR::data(); } \ \ - CLASSNAME *data_relative(int8_t offset) { \ + CLASSNAME *data_relative(int8_t offset) { \ return (CLASSNAME *)ELIST2_ITERATOR::data_relative(offset); \ } \ \ @@ -945,6 +942,8 @@ ELIST2IZEH_C. CLASSNAME *move_to_last() { \ return (CLASSNAME *)ELIST2_ITERATOR::move_to_last(); \ } \ + private: \ + CLASSNAME##_IT(); \ }; #define ELIST2IZEH(CLASSNAME) \ diff --git a/textord/gap_map.cpp b/textord/gap_map.cpp index 23403728de..44a385b6af 100644 --- a/textord/gap_map.cpp +++ b/textord/gap_map.cpp @@ -35,7 +35,6 @@ EXTERN double_VAR (gapmap_big_gaps, 1.75, "xht multiplier"); GAPMAP::GAPMAP( //Constructor TO_BLOCK *block //block ) { - TO_ROW_IT row_it; //row iterator TO_ROW *row; //current row BLOBNBOX_IT blob_it; //iterator TBOX blob_box; @@ -48,7 +47,6 @@ GAPMAP::GAPMAP( //Constructor int16_t max_quantum; int16_t i; - row_it.set_to_list (block->get_rows ()); /* Find left and right extremes and bucket size */ @@ -57,6 +55,9 @@ GAPMAP::GAPMAP( //Constructor max_right = -INT16_MAX; total_rows = 0; any_tabs = FALSE; + + // row iterator + TO_ROW_IT row_it(block->get_rows()); for (row_it.mark_cycle_pt (); !row_it.cycled_list (); row_it.forward ()) { row = row_it.data (); if (!row->blob_list ()->empty ()) { diff --git a/textord/makerow.cpp b/textord/makerow.cpp index 01172d9251..ab215cc5e2 100644 --- a/textord/makerow.cpp +++ b/textord/makerow.cpp @@ -297,7 +297,6 @@ void compute_page_skew( //get average gradient int32_t row_index; //of total TO_ROW *row; //current row TO_BLOCK_IT block_it = blocks; //iterator - TO_ROW_IT row_it; row_count = 0; blob_count = 0; @@ -308,7 +307,7 @@ void compute_page_skew( //get average gradient continue; // Pretend non-text blocks don't exist. row_count += block_it.data ()->get_rows ()->length (); //count up rows - row_it.set_to_list (block_it.data ()->get_rows ()); + TO_ROW_IT row_it(block_it.data()->get_rows()); for (row_it.mark_cycle_pt (); !row_it.cycled_list (); row_it.forward ()) blob_count += row_it.data ()->blob_list ()->length (); } @@ -329,7 +328,7 @@ void compute_page_skew( //get average gradient POLY_BLOCK* pb = block_it.data()->block->pdblk.poly_block(); if (pb != nullptr && !pb->IsText()) continue; // Pretend non-text blocks don't exist. - row_it.set_to_list (block_it.data ()->get_rows ()); + TO_ROW_IT row_it(block_it.data ()->get_rows()); for (row_it.mark_cycle_pt (); !row_it.cycled_list (); row_it.forward ()) { row = row_it.data (); blob_count = row->blob_list ()->length (); @@ -359,7 +358,7 @@ void compute_page_skew( //get average gradient POLY_BLOCK* pb = block_it.data()->block->pdblk.poly_block(); if (pb != nullptr && !pb->IsText()) continue; // Pretend non-text blocks don't exist. - row_it.set_to_list (block_it.data ()->get_rows ()); + TO_ROW_IT row_it(block_it.data()->get_rows()); for (row_it.mark_cycle_pt (); !row_it.cycled_list (); row_it.forward ()) { row = row_it.data (); diff --git a/textord/tabfind.cpp b/textord/tabfind.cpp index 370023dc68..1442591990 100644 --- a/textord/tabfind.cpp +++ b/textord/tabfind.cpp @@ -67,9 +67,9 @@ TabFind::TabFind(int gridsize, const ICOORD& bleft, const ICOORD& tright, int resolution) : AlignedBlob(gridsize, bleft, tright), resolution_(resolution), + v_it_(&vectors_), image_origin_(0, tright.y() - 1) { width_cb_ = nullptr; - v_it_.set_to_list(&vectors_); v_it_.add_list_after(vlines); SetVerticalSkewAndParellelize(vertical_x, vertical_y); width_cb_ = NewPermanentTessCallback(this, &TabFind::CommonWidth); diff --git a/textord/topitch.cpp b/textord/topitch.cpp index 11d793c0b3..df4db4cfd5 100644 --- a/textord/topitch.cpp +++ b/textord/topitch.cpp @@ -77,7 +77,6 @@ void compute_fixed_pitch(ICOORD page_tr, // top right BOOL8 testing_on) { // correct orientation TO_BLOCK_IT block_it; //iterator TO_BLOCK *block; //current block; - TO_ROW_IT row_it; //row iterator TO_ROW *row; //current row int block_index; //block number int row_index; //row number @@ -115,7 +114,8 @@ void compute_fixed_pitch(ICOORD page_tr, // top right block = block_it.data (); POLY_BLOCK* pb = block->block->pdblk.poly_block(); if (pb != nullptr && !pb->IsText()) continue; // Non-text doesn't exist! - row_it.set_to_list (block->get_rows ()); + // row iterator + TO_ROW_IT row_it(block->get_rows()); row_index = 1; for (row_it.mark_cycle_pt (); !row_it.cycled_list (); row_it.forward ()) { row = row_it.data (); @@ -152,7 +152,6 @@ void fix_row_pitch(TO_ROW *bad_row, // row to fix int row_index; //number of row int maxwidth; //max pitch TO_BLOCK_IT block_it = blocks; //block iterator - TO_ROW_IT row_it; TO_BLOCK *block; //current block TO_ROW *row; //current row float sp_sd; //space deviation @@ -172,7 +171,7 @@ void fix_row_pitch(TO_ROW *bad_row, // row to fix POLY_BLOCK* pb = block->block->pdblk.poly_block(); if (pb != nullptr && !pb->IsText()) continue; // Non text doesn't exist! row_index = 1; - row_it.set_to_list (block->get_rows ()); + TO_ROW_IT row_it(block->get_rows()); for (row_it.mark_cycle_pt (); !row_it.cycled_list (); row_it.forward ()) { row = row_it.data (); @@ -406,7 +405,6 @@ BOOL8 try_doc_fixed( //determine pitch //iterator TO_BLOCK_IT block_it = port_blocks; TO_BLOCK *block; //current block; - TO_ROW_IT row_it; //row iterator TO_ROW *row; //current row int16_t projection_left; //edges int16_t projection_right; @@ -430,7 +428,8 @@ BOOL8 try_doc_fixed( //determine pitch || !textord_blockndoc_fixed) return FALSE; shift_factor = gradient / (gradient * gradient + 1); - row_it.set_to_list (block_it.data ()->get_rows ()); + // row iterator + TO_ROW_IT row_it(block_it.data ()->get_rows()); master_x = row_it.data ()->projection_left; master_y = row_it.data ()->baseline.y (master_x); projection_left = INT16_MAX; @@ -1762,7 +1761,6 @@ void find_repeated_chars(TO_BLOCK *block, // Block to search. TO_ROW *row; BLOBNBOX_IT box_it; BLOBNBOX_IT search_it; // forward search - WERD_IT word_it; // new words WERD *word; // new word TBOX word_box; // for plotting int blobcount, repeated_set; @@ -1777,7 +1775,8 @@ void find_repeated_chars(TO_BLOCK *block, // Block to search. mark_repeated_chars(row); } if (row->num_repeated_sets() == 0) continue; // nothing to do for this row - word_it.set_to_list(&row->rep_words); + // new words + WERD_IT word_it(&row->rep_words); do { if (box_it.data()->repeated_set() != 0 && !box_it.data()->joined_to_prev()) { diff --git a/textord/tospace.cpp b/textord/tospace.cpp index 4c1beda1a2..ecf298c0be 100644 --- a/textord/tospace.cpp +++ b/textord/tospace.cpp @@ -45,7 +45,6 @@ void Textord::to_spacing( ) { TO_BLOCK_IT block_it; //iterator TO_BLOCK *block; //current block; - TO_ROW_IT row_it; //row iterator TO_ROW *row; //current row int block_index; //block number int row_index; //row number @@ -77,7 +76,8 @@ void Textord::to_spacing( (float) block_space_gap_width / block_non_space_gap_width < 3.0) { block_non_space_gap_width = (int16_t) floor (block_space_gap_width / 3.0); } - row_it.set_to_list (block->get_rows ()); + // row iterator + TO_ROW_IT row_it(block->get_rows()); row_index = 1; for (row_it.mark_cycle_pt (); !row_it.cycled_list (); row_it.forward ()) { row = row_it.data (); @@ -123,7 +123,6 @@ void Textord::block_spacing_stats( int16_t &block_space_gap_width, // resulting estimate int16_t &block_non_space_gap_width // resulting estimate ) { - TO_ROW_IT row_it; // row iterator TO_ROW *row; // current row BLOBNBOX_IT blob_it; // iterator @@ -142,7 +141,8 @@ void Textord::block_spacing_stats( int32_t end_of_row; int32_t row_length; - row_it.set_to_list (block->get_rows ()); + // row iterator + TO_ROW_IT row_it(block->get_rows()); for (row_it.mark_cycle_pt (); !row_it.cycled_list (); row_it.forward ()) { row = row_it.data (); if (!row->blob_list ()->empty () && @@ -909,9 +909,7 @@ ROW *Textord::make_prop_words( C_BLOB_LIST cblobs; C_BLOB_IT cblob_it = &cblobs; WERD_LIST words; - WERD_IT word_it; // new words WERD *word; // new word - WERD_IT rep_char_it; // repeated char words int32_t next_rep_char_word_right = INT32_MAX; float repetition_spacing; // gap between repetitions int32_t xstarts[2]; // row ends @@ -929,7 +927,8 @@ ROW *Textord::make_prop_words( int16_t next_within_xht_gap = INT16_MAX; int16_t word_count = 0; - rep_char_it.set_to_list (&(row->rep_words)); + // repeated char words + WERD_IT rep_char_it(&(row->rep_words)); if (!rep_char_it.empty ()) { next_rep_char_word_right = rep_char_it.data ()->bounding_box ().right (); @@ -938,7 +937,8 @@ ROW *Textord::make_prop_words( prev_x = -INT16_MAX; cblob_it.set_to_list (&cblobs); box_it.set_to_list (row->blob_list ()); - word_it.set_to_list (&words); + // new words + WERD_IT word_it(&words); bol = TRUE; prev_blanks = 0; prev_fuzzy_sp = FALSE; @@ -1192,7 +1192,6 @@ ROW *Textord::make_blob_words( C_BLOB_LIST cblobs; C_BLOB_IT cblob_it = &cblobs; WERD_LIST words; - WERD_IT word_it; // new words WERD *word; // new word BLOBNBOX *bblob; // current blob TBOX blob_box; // bounding box @@ -1201,7 +1200,8 @@ ROW *Textord::make_blob_words( cblob_it.set_to_list(&cblobs); box_it.set_to_list(row->blob_list()); - word_it.set_to_list(&words); + // new words + WERD_IT word_it(&words); bol = TRUE; if (!box_it.empty()) {