Fix a potential bug of ParallelLoopBodyWrapper::operator(Range)
authorpeng xiao <hisenxpress@gmail.com>
Fri, 23 Aug 2013 07:35:55 +0000 (15:35 +0800)
committerpeng xiao <hisenxpress@gmail.com>
Fri, 23 Aug 2013 07:35:55 +0000 (15:35 +0800)
On a 32-bit compiler the calculation may result in data (size_t) overflow when running some paralleled algorithms (which can safely run on a 64-bit compiler).
This bug is found when running OpenCV's Retina tutorial on 32bit VS2010.

modules/core/src/parallel.cpp

index 1ae8c96..27d7ecc 100644 (file)
@@ -144,9 +144,9 @@ namespace
         {
             cv::Range r;
             r.start = (int)(wholeRange.start +
-                            ((size_t)sr.start*(wholeRange.end - wholeRange.start) + nstripes/2)/nstripes);
+                            ((uint64)sr.start*(wholeRange.end - wholeRange.start) + nstripes/2)/nstripes);
             r.end = sr.end >= nstripes ? wholeRange.end : (int)(wholeRange.start +
-                            ((size_t)sr.end*(wholeRange.end - wholeRange.start) + nstripes/2)/nstripes);
+                            ((uint64)sr.end*(wholeRange.end - wholeRange.start) + nstripes/2)/nstripes);
             (*body)(r);
         }
         cv::Range stripeRange() const { return cv::Range(0, nstripes); }