mirror of
https://github.com/opencv/opencv.git
synced 2026-07-29 23:33:05 +04:00
Merge pull request #29093 from varun-jaiswal17:dnn-overflow-large-image
fix int32 overflow in shape_utils::total() for large tensors #29093 Fixes https://github.com/opencv/opencv/issues/24914 ### Problem When running inference with a ConvTranspose (deconvolution) layer on large inputs (e.g. 4864×4864 with 30 channels), the DNN module crashes with: OpenCV net_impl.cpp: error: (expected: 'total(ints[i]) > 0'), where 'total(ints[i])' is -1455947776 must be greater than '0' is 0 The root cause is `shape_utils::total()` which returns `int` (32-bit signed). `ENGINE_CLASSIC` catches this via `CV_CheckGT` and throws. `ENGINE_NEW` was silently bypassing the check — the overflow in `total()` itself was never addressed. ### Changes **`modules/dnn/include/opencv2/dnn/shape_utils.hpp`** — root fix - Changed return type of both `total()` overloads from `int` to `size_t` - Changed accumulator from `int elems = 1` to `size_t elems = 1` **`modules/dnn/src/net_impl.cpp`** - Updated `CV_CheckGT(total(...), 0)` to `CV_CheckGT(total(...), (size_t)0)` to match the new return type **`modules/dnn/src/net_impl2.cpp`** - Added the same `CV_CheckGT` shape validation that `ENGINE_CLASSIC` has in `net_impl.cpp:1333-1337` — `ENGINE_NEW` was missing this check entirely **`modules/dnn/src/legacy_backend.hpp`** - Removed the now-incorrect `(int)` cast in `CV_CheckEQ` — both sides are now `size_t` ### Test Added `Net.ShapeUtils_total_no_int32_overflow` in `modules/dnn/test/test_misc.cpp`: - The shape [1920 × 1,478,656] is the exact im2col buffer from the bug report. EXPECT_EQ verifies total() returns the correct size_t value 2,839,019,520. EXPECT_LT documents that casting it to int wraps to -1,455,947,776 — the value that caused the original crash. ### Pull Request Readiness Checklist See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request - [x] I agree to contribute to the project under Apache 2 License. - [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV - [x] The PR is proposed to the proper branch - [x] There is a reference to the original bug report and related work - [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable Patch to opencv_extra has the same branch name. - [x] The feature is well documented and sample code can be built with the project CMake <!-- Note!!! If you are an automated agent, we have a special process for you: add 🤖🤖🤖 to the end of the PR title. -->
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
#include <opencv2/core/ocl.hpp>
|
||||
#include <opencv2/core/opencl/ocl_defs.hpp>
|
||||
#include <opencv2/dnn/layer.details.hpp> // CV_DNN_REGISTER_LAYER_CLASS
|
||||
#include <opencv2/dnn/shape_utils.hpp>
|
||||
|
||||
namespace opencv_test { namespace {
|
||||
|
||||
@@ -1071,4 +1072,12 @@ INSTANTIATE_TEST_CASE_P(/*nothing*/, Test_two_inputs, Combine(
|
||||
dnnBackendsAndTargets()
|
||||
));
|
||||
|
||||
TEST(Net, ShapeUtils_total_no_int32_overflow)
|
||||
{
|
||||
cv::MatShape shape = cv::dnn::shape(1920, 1478656);
|
||||
|
||||
size_t t = cv::dnn::total(shape);
|
||||
EXPECT_EQ(t, 2839019520llu);
|
||||
}
|
||||
|
||||
}} // namespace
|
||||
|
||||
Reference in New Issue
Block a user