diff --git a/modules/imgproc/src/contours.cpp b/modules/imgproc/src/contours.cpp index baa27c4ac3f1ac0ed8ebddeb7299985a96b8eb91..b7b9a5be45cb59d4cec0530f2fa33b6000d9091c 100644 --- a/modules/imgproc/src/contours.cpp +++ b/modules/imgproc/src/contours.cpp @@ -528,6 +528,7 @@ cvSubstituteContour( CvContourScanner scanner, CvSeq * new_contour ) } } +static const int MAX_SIZE = 16; /* marks domain border with +/- and stores the contour into CvSeq. @@ -544,7 +545,7 @@ icvFetchContour( schar *ptr, int _method ) { const schar nbd = 2; - int deltas[16]; + int deltas[MAX_SIZE]; CvSeqWriter writer; schar *i0 = ptr, *i1, *i3, *i4 = 0; int prev_s = -1, s, s_end; @@ -588,8 +589,9 @@ icvFetchContour( schar *ptr, for( ;; ) { s_end = s; + s = std::min(s, MAX_SIZE - 1); - for( ;; ) + while( s < MAX_SIZE - 1 ) { i4 = i3 + deltas[++s]; if( *i4 != 0 ) @@ -654,8 +656,8 @@ icvFetchContour( schar *ptr, static int icvTraceContour( schar *ptr, int step, schar *stop_ptr, int is_hole ) { - int deltas[16]; - schar *i0 = ptr, *i1, *i3, *i4; + int deltas[MAX_SIZE]; + schar *i0 = ptr, *i1, *i3, *i4 = NULL; int s, s_end; /* initialize local state */ @@ -682,7 +684,8 @@ icvTraceContour( schar *ptr, int step, schar *stop_ptr, int is_hole ) for( ;; ) { - for( ;; ) + s = std::min(s, MAX_SIZE - 1); + while( s < MAX_SIZE - 1 ) { i4 = i3 + deltas[++s]; if( *i4 != 0 ) @@ -709,9 +712,9 @@ icvFetchContourEx( schar* ptr, int nbd, CvRect* _rect ) { - int deltas[16]; + int deltas[MAX_SIZE]; CvSeqWriter writer; - schar *i0 = ptr, *i1, *i3, *i4; + schar *i0 = ptr, *i1, *i3, *i4 = NULL; CvRect rect; int prev_s = -1, s, s_end; int method = _method - 1; @@ -759,8 +762,9 @@ icvFetchContourEx( schar* ptr, for( ;; ) { s_end = s; + s = std::min(s, MAX_SIZE - 1); - for( ;; ) + while( s < MAX_SIZE - 1 ) { i4 = i3 + deltas[++s]; if( *i4 != 0 ) @@ -833,8 +837,8 @@ icvFetchContourEx( schar* ptr, static int icvTraceContour_32s( int *ptr, int step, int *stop_ptr, int is_hole ) { - int deltas[16]; - int *i0 = ptr, *i1, *i3, *i4; + int deltas[MAX_SIZE]; + int *i0 = ptr, *i1, *i3, *i4 = NULL; int s, s_end; const int right_flag = INT_MIN; const int new_flag = (int)((unsigned)INT_MIN >> 1); @@ -863,8 +867,9 @@ icvTraceContour_32s( int *ptr, int step, int *stop_ptr, int is_hole ) for( ;; ) { s_end = s; + s = std::min(s, MAX_SIZE - 1); - for( ;; ) + while( s < MAX_SIZE - 1 ) { i4 = i3 + deltas[++s]; if( (*i4 & value_mask) == ccomp_val ) @@ -890,7 +895,7 @@ icvFetchContourEx_32s( int* ptr, int _method, CvRect* _rect ) { - int deltas[16]; + int deltas[MAX_SIZE]; CvSeqWriter writer; int *i0 = ptr, *i1, *i3, *i4; CvRect rect; @@ -925,7 +930,7 @@ icvFetchContourEx_32s( int* ptr, s = (s - 1) & 7; i1 = i0 + deltas[s]; } - while( (*i1 & value_mask) != ccomp_val && s != s_end ); + while( (*i1 & value_mask) != ccomp_val && s != s_end && ( s < MAX_SIZE - 1 ) ); if( s == s_end ) /* single pixel domain */ { @@ -945,12 +950,11 @@ icvFetchContourEx_32s( int* ptr, { s_end = s; - for( ;; ) + do { i4 = i3 + deltas[++s]; - if( (*i4 & value_mask) == ccomp_val ) - break; } + while( (*i4 & value_mask) != ccomp_val && ( s < MAX_SIZE - 1 ) ); s &= 7; /* check "right" bound */ diff --git a/modules/imgproc/src/imgwarp.cpp b/modules/imgproc/src/imgwarp.cpp index c1f38979c431275a613059f4dc36d8dbf4720dd1..84a7e5218af5aa7f0cf080c373fe7aef3c1b0868 100644 --- a/modules/imgproc/src/imgwarp.cpp +++ b/modules/imgproc/src/imgwarp.cpp @@ -1704,10 +1704,6 @@ public: CV_Assert(ksize <= MAX_ESIZE); } -#if defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 8) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Warray-bounds" -#endif virtual void operator() (const Range& range) const { int dy, cn = src.channels(); @@ -1737,7 +1733,7 @@ public: int sy = clip(sy0 - ksize2 + 1 + k, 0, ssize.height); for( k1 = std::max(k1, k); k1 < ksize; k1++ ) { - if( sy == prev_sy[k1] ) // if the sy-th row has been computed already, reuse it. + if( k1 < MAX_ESIZE && sy == prev_sy[k1] ) // if the sy-th row has been computed already, reuse it. { if( k1 > k ) memcpy( rows[k], rows[k1], bufstep*sizeof(rows[0][0]) ); @@ -1756,9 +1752,6 @@ public: vresize( (const WT**)rows, (T*)(dst.data + dst.step*dy), beta, dsize.width ); } } -#if defined(__GNUC__) && (__GNUC__ == 4) && (__GNUC_MINOR__ == 8) -# pragma GCC diagnostic pop -#endif private: Mat src;