From 10fb88d02791b33d83a3756c62e21aa1c5a1e68d Mon Sep 17 00:00:00 2001 From: cyy Date: Tue, 4 Sep 2018 21:39:19 +0800 Subject: [PATCH] Merge pull request #12391 from DEEPIR:master fix some errors found by static analyzer. (#12391) * fix possible divided by zero and by negative values * only 4 elements are used in these arrays * fix uninitialized member * use boolean type for semantic boolean variables * avoid invalid array index * to avoid exception and because base64_beg is only used in this block * use std::atomic to avoid thread control race condition --- modules/core/src/matrix_wrap.cpp | 4 ++-- modules/core/src/parallel_impl.cpp | 2 +- modules/core/src/persistence_json.cpp | 4 ++-- modules/cudaarithm/src/arithm.cpp | 3 +-- modules/imgcodecs/src/grfmt_jpeg2000.cpp | 2 +- modules/imgcodecs/src/grfmt_png.cpp | 2 +- modules/imgcodecs/src/grfmt_pxm.cpp | 4 ++-- modules/imgcodecs/src/grfmt_sunras.cpp | 2 +- modules/imgproc/src/linefit.cpp | 2 +- 9 files changed, 12 insertions(+), 13 deletions(-) diff --git a/modules/core/src/matrix_wrap.cpp b/modules/core/src/matrix_wrap.cpp index bea5c67..d39de18 100644 --- a/modules/core/src/matrix_wrap.cpp +++ b/modules/core/src/matrix_wrap.cpp @@ -939,7 +939,7 @@ bool _InputArray::isContinuous(int i) const if( k == STD_VECTOR_MAT ) { const std::vector& vv = *(const std::vector*)obj; - CV_Assert((size_t)i < vv.size()); + CV_Assert(i >= 0 && (size_t)i < vv.size()); return vv[i].isContinuous(); } @@ -953,7 +953,7 @@ bool _InputArray::isContinuous(int i) const if( k == STD_VECTOR_UMAT ) { const std::vector& vv = *(const std::vector*)obj; - CV_Assert((size_t)i < vv.size()); + CV_Assert(i >= 0 && (size_t)i < vv.size()); return vv[i].isContinuous(); } diff --git a/modules/core/src/parallel_impl.cpp b/modules/core/src/parallel_impl.cpp index 1aaa56a..58dff9d 100644 --- a/modules/core/src/parallel_impl.cpp +++ b/modules/core/src/parallel_impl.cpp @@ -337,7 +337,7 @@ public: std::atomic completed_thread_count; // number of threads completed any activities on this job int64 dummy2_[8]; // avoid cache-line reusing for the same atomics - volatile bool is_completed; // std::atomic_flag ? + std::atomic is_completed; // TODO exception handling }; diff --git a/modules/core/src/persistence_json.cpp b/modules/core/src/persistence_json.cpp index fe87647..abbd292 100644 --- a/modules/core/src/persistence_json.cpp +++ b/modules/core/src/persistence_json.cpp @@ -238,11 +238,11 @@ static char* icvJSONParseValue( CvFileStorage* fs, char* ptr, CvFileNode* node ) CV_PARSE_ERROR("Invalid `dt` in Base64 header"); } - /* set base64_beg to beginning of base64 data */ - base64_beg = &base64_buffer.at( base64::ENCODED_HEADER_SIZE ); if ( base64_buffer.size() > base64::ENCODED_HEADER_SIZE ) { + /* set base64_beg to beginning of base64 data */ + base64_beg = &base64_buffer.at( base64::ENCODED_HEADER_SIZE ); if ( !base64::base64_valid( base64_beg, 0U, base64_end - base64_beg ) ) CV_PARSE_ERROR( "Invalid Base64 data." ); diff --git a/modules/cudaarithm/src/arithm.cpp b/modules/cudaarithm/src/arithm.cpp index 01a0169..a8f70dd 100644 --- a/modules/cudaarithm/src/arithm.cpp +++ b/modules/cudaarithm/src/arithm.cpp @@ -451,7 +451,6 @@ namespace Size block_size; Size user_block_size; Size dft_size; - int spect_len; GpuMat image_spect, templ_spect, result_spect; GpuMat image_block, templ_block, result_data; @@ -484,7 +483,7 @@ namespace createContinuous(dft_size, CV_32F, templ_block); createContinuous(dft_size, CV_32F, result_data); - spect_len = dft_size.height * (dft_size.width / 2 + 1); + int spect_len = dft_size.height * (dft_size.width / 2 + 1); createContinuous(1, spect_len, CV_32FC2, image_spect); createContinuous(1, spect_len, CV_32FC2, templ_spect); createContinuous(1, spect_len, CV_32FC2, result_spect); diff --git a/modules/imgcodecs/src/grfmt_jpeg2000.cpp b/modules/imgcodecs/src/grfmt_jpeg2000.cpp index b8b70fe..be280e2 100644 --- a/modules/imgcodecs/src/grfmt_jpeg2000.cpp +++ b/modules/imgcodecs/src/grfmt_jpeg2000.cpp @@ -179,7 +179,7 @@ bool Jpeg2KDecoder::readData( Mat& img ) { Ptr close_this(this, Jpeg2KDecoder_close); bool result = false; - int color = img.channels() > 1; + bool color = img.channels() > 1; uchar* data = img.ptr(); size_t step = img.step; jas_stream_t* stream = (jas_stream_t*)m_stream; diff --git a/modules/imgcodecs/src/grfmt_png.cpp b/modules/imgcodecs/src/grfmt_png.cpp index 36324c2..f262622 100644 --- a/modules/imgcodecs/src/grfmt_png.cpp +++ b/modules/imgcodecs/src/grfmt_png.cpp @@ -226,7 +226,7 @@ bool PngDecoder::readData( Mat& img ) volatile bool result = false; AutoBuffer _buffer(m_height); uchar** buffer = _buffer.data(); - int color = img.channels() > 1; + bool color = img.channels() > 1; png_structp png_ptr = (png_structp)m_png_ptr; png_infop info_ptr = (png_infop)m_info_ptr; diff --git a/modules/imgcodecs/src/grfmt_pxm.cpp b/modules/imgcodecs/src/grfmt_pxm.cpp index 7c5c991..b41fd95 100644 --- a/modules/imgcodecs/src/grfmt_pxm.cpp +++ b/modules/imgcodecs/src/grfmt_pxm.cpp @@ -208,7 +208,7 @@ bool PxMDecoder::readHeader() bool PxMDecoder::readData( Mat& img ) { - int color = img.channels() > 1; + bool color = img.channels() > 1; uchar* data = img.ptr(); PaletteEntry palette[256]; bool result = false; @@ -225,7 +225,7 @@ bool PxMDecoder::readData( Mat& img ) // create LUT for converting colors if( bit_depth == 8 ) { - CV_Assert(m_maxval < 256); + CV_Assert(m_maxval < 256 && m_maxval > 0); for (int i = 0; i <= m_maxval; i++) gray_palette[i] = (uchar)((i*255/m_maxval)^(m_bpp == 1 ? 255 : 0)); diff --git a/modules/imgcodecs/src/grfmt_sunras.cpp b/modules/imgcodecs/src/grfmt_sunras.cpp index ec17685..4865eda 100644 --- a/modules/imgcodecs/src/grfmt_sunras.cpp +++ b/modules/imgcodecs/src/grfmt_sunras.cpp @@ -160,7 +160,7 @@ bool SunRasterDecoder::readHeader() bool SunRasterDecoder::readData( Mat& img ) { - int color = img.channels() > 1; + bool color = img.channels() > 1; uchar* data = img.ptr(); size_t step = img.step; uchar gray_palette[256] = {0}; diff --git a/modules/imgproc/src/linefit.cpp b/modules/imgproc/src/linefit.cpp index 103fa55..c6e4e4a 100644 --- a/modules/imgproc/src/linefit.cpp +++ b/modules/imgproc/src/linefit.cpp @@ -321,7 +321,7 @@ static void fitLine2D( const Point2f * points, int count, int dist, void (*calc_weights) (float *, int, float *) = 0; void (*calc_weights_param) (float *, int, float *, float) = 0; int i, j, k; - float _line[6], _lineprev[6]; + float _line[4], _lineprev[4]; float rdelta = reps != 0 ? reps : 1.0f; float adelta = aeps != 0 ? aeps : 0.01f; double min_err = DBL_MAX, err = 0; -- 2.7.4