From de630f1cb19aff74ae4fa929eb5648c6ccd9cb08 Mon Sep 17 00:00:00 2001 From: xulei2020 Date: Tue, 26 Jan 2021 09:31:24 +0800 Subject: [PATCH] Add parameter verification for getROI function fix c++ ut compilation failed of Asan bug --- .../dataset/kernels/image/lite_cv/lite_mat.cc | 28 ++++++++++-- tests/ut/cpp/dataset/image_process_test.cc | 44 +++++++++++++------ 2 files changed, 55 insertions(+), 17 deletions(-) diff --git a/mindspore/ccsrc/minddata/dataset/kernels/image/lite_cv/lite_mat.cc b/mindspore/ccsrc/minddata/dataset/kernels/image/lite_cv/lite_mat.cc index c587f9ad35..f5904e7151 100644 --- a/mindspore/ccsrc/minddata/dataset/kernels/image/lite_cv/lite_mat.cc +++ b/mindspore/ccsrc/minddata/dataset/kernels/image/lite_cv/lite_mat.cc @@ -299,7 +299,7 @@ void LiteMat::AlignFree(void *ptr) { inline void LiteMat::InitElemSize(LDataType data_type) { elem_size_ = data_type.SizeInBytes(); } bool LiteMat::GetROI(int x, int y, int w, int h, LiteMat &m) { - if (x < 0 || y < 0 || x + w > width_ || h + y > height_) { + if (x < 0 || y < 0 || x > width_ - w || h > height_ - y || w < 0 || h < 0) { return false; } if (!m.IsEmpty()) { @@ -374,7 +374,7 @@ inline void SubtractImpl(const uint32_t *src0, const uint32_t *src1, uint32_t *d } } -bool Subtract(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) { +inline bool CheckSubstract(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) { if (dst == NULL) { return false; } @@ -386,6 +386,13 @@ bool Subtract(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) { if (src_a.data_type_ != src_b.data_type_) { return false; } + return true; +} + +bool Subtract(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) { + if (!CheckSubstract(src_a, src_b, dst)) { + return false; + } if (dst->IsEmpty()) { dst->Init(src_a.width_, src_a.height_, src_a.channel_, src_a.data_type_); @@ -534,7 +541,7 @@ inline void DivideImpl(const uint32_t *src0, const uint32_t *src1, uint32_t *dst } } -bool Divide(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) { +inline bool CheckDivide(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) { if (dst == NULL) { return false; } @@ -546,6 +553,13 @@ bool Divide(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) { if (src_a.data_type_ != src_b.data_type_) { return false; } + return true; +} + +bool Divide(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) { + if (!CheckDivide(src_a, src_b, dst)) { + return true; + } if (dst->IsEmpty()) { dst->Init(src_a.width_, src_a.height_, src_a.channel_, src_a.data_type_); @@ -635,7 +649,7 @@ inline void MultiplyImpl(const uint32_t *src0, const uint32_t *src1, uint32_t *d } } -bool Multiply(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) { +inline bool CheckMultiply(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) { if (dst == NULL) { return false; } @@ -647,7 +661,13 @@ bool Multiply(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) { if (src_a.data_type_ != src_b.data_type_) { return false; } + return true; +} +bool Multiply(const LiteMat &src_a, const LiteMat &src_b, LiteMat *dst) { + if (!CheckMultiply(src_a, src_b, dst)) { + return false; + } if (dst->IsEmpty()) { dst->Init(src_a.width_, src_a.height_, src_a.channel_, src_a.data_type_); } else if (src_a.width_ != dst->width_ || src_a.height_ != dst->height_ || src_a.channel_ != dst->channel_) { diff --git a/tests/ut/cpp/dataset/image_process_test.cc b/tests/ut/cpp/dataset/image_process_test.cc index 01a1eecb88..37d40769e4 100644 --- a/tests/ut/cpp/dataset/image_process_test.cc +++ b/tests/ut/cpp/dataset/image_process_test.cc @@ -917,6 +917,24 @@ TEST_F(MindDataImageProcess, testROI3C) { cv::imwrite("./lite_roi.jpg", dst_imageR); } +TEST_F(MindDataImageProcess, testROI3CFalse) { + std::string filename = "data/dataset/apple.jpg"; + cv::Mat src_image = cv::imread(filename, cv::ImreadModes::IMREAD_COLOR); + + cv::Mat cv_roi = cv::Mat(src_image, cv::Rect(500, 500, 3000, 1500)); + + cv::imwrite("./cv_roi.jpg", cv_roi); + + bool ret = false; + LiteMat lite_mat_bgr; + ret = InitFromPixel(src_image.data, LPixelType::BGR, LDataType::UINT8, src_image.cols, src_image.rows, lite_mat_bgr); + EXPECT_TRUE(ret); + LiteMat lite_roi; + + ret = lite_mat_bgr.GetROI(500, 500, 1200, -100, lite_roi); + EXPECT_FALSE(ret); +} + TEST_F(MindDataImageProcess, testROI1C) { std::string filename = "data/dataset/apple.jpg"; cv::Mat src_image = cv::imread(filename, cv::ImreadModes::IMREAD_COLOR); @@ -952,9 +970,7 @@ TEST_F(MindDataImageProcess, testROI1C) { cv::imwrite("./lite_roi.jpg", dst_imageR); } - - -//warp +// warp TEST_F(MindDataImageProcess, testWarpAffineBGR) { std::string filename = "data/dataset/apple.jpg"; cv::Mat src_image = cv::imread(filename, cv::ImreadModes::IMREAD_COLOR); @@ -986,7 +1002,8 @@ TEST_F(MindDataImageProcess, testWarpAffineBGR) { borderValues.push_back(0); borderValues.push_back(0); borderValues.push_back(0); - ret = WarpAffineBilinear(lite_mat_bgr, lite_warp, lite_M, lite_mat_bgr.width_, lite_mat_bgr.height_, PADD_BORDER_CONSTANT, borderValues); + ret = WarpAffineBilinear(lite_mat_bgr, lite_warp, lite_M, lite_mat_bgr.width_, lite_mat_bgr.height_, + PADD_BORDER_CONSTANT, borderValues); EXPECT_TRUE(ret); cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC3, lite_warp.data_ptr_); @@ -1024,7 +1041,8 @@ TEST_F(MindDataImageProcess, testWarpAffineBGRScale) { borderValues.push_back(0); borderValues.push_back(0); borderValues.push_back(0); - ret = WarpAffineBilinear(lite_mat_bgr, lite_warp, lite_M, lite_mat_bgr.width_, lite_mat_bgr.height_, PADD_BORDER_CONSTANT, borderValues); + ret = WarpAffineBilinear(lite_mat_bgr, lite_warp, lite_M, lite_mat_bgr.width_, lite_mat_bgr.height_, + PADD_BORDER_CONSTANT, borderValues); EXPECT_TRUE(ret); cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC3, lite_warp.data_ptr_); @@ -1062,8 +1080,8 @@ TEST_F(MindDataImageProcess, testWarpAffineBGRResize) { borderValues.push_back(0); borderValues.push_back(0); borderValues.push_back(0); - ret = WarpAffineBilinear(lite_mat_bgr, lite_warp, lite_M, lite_mat_bgr.width_ + 200, lite_mat_bgr.height_ - 300, PADD_BORDER_CONSTANT, - borderValues); + ret = WarpAffineBilinear(lite_mat_bgr, lite_warp, lite_M, lite_mat_bgr.width_ + 200, lite_mat_bgr.height_ - 300, + PADD_BORDER_CONSTANT, borderValues); EXPECT_TRUE(ret); cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC3, lite_warp.data_ptr_); @@ -1106,8 +1124,8 @@ TEST_F(MindDataImageProcess, testWarpAffineGray) { LiteMat lite_warp; std::vector borderValues; borderValues.push_back(0); - ret = WarpAffineBilinear(lite_mat_gray, lite_warp, lite_M, lite_mat_gray.width_ + 200, lite_mat_gray.height_ - 300, PADD_BORDER_CONSTANT, - borderValues); + ret = WarpAffineBilinear(lite_mat_gray, lite_warp, lite_M, lite_mat_gray.width_ + 200, lite_mat_gray.height_ - 300, + PADD_BORDER_CONSTANT, borderValues); EXPECT_TRUE(ret); cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC1, lite_warp.data_ptr_); @@ -1153,8 +1171,8 @@ TEST_F(MindDataImageProcess, testWarpPerspectiveBGRResize) { borderValues.push_back(0); borderValues.push_back(0); borderValues.push_back(0); - ret = WarpPerspectiveBilinear(lite_mat_bgr, lite_warp, lite_M, lite_mat_bgr.width_ + 200, lite_mat_bgr.height_ - 300, PADD_BORDER_CONSTANT, - borderValues); + ret = WarpPerspectiveBilinear(lite_mat_bgr, lite_warp, lite_M, lite_mat_bgr.width_ + 200, lite_mat_bgr.height_ - 300, + PADD_BORDER_CONSTANT, borderValues); EXPECT_TRUE(ret); cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC3, lite_warp.data_ptr_); @@ -1205,8 +1223,8 @@ TEST_F(MindDataImageProcess, testWarpPerspectiveGrayResize) { LiteMat lite_warp; std::vector borderValues; borderValues.push_back(0); - ret = WarpPerspectiveBilinear(lite_mat_gray, lite_warp, lite_M, lite_mat_gray.width_ + 200, lite_mat_gray.height_ - 300, PADD_BORDER_CONSTANT, - borderValues); + ret = WarpPerspectiveBilinear(lite_mat_gray, lite_warp, lite_M, lite_mat_gray.width_ + 200, + lite_mat_gray.height_ - 300, PADD_BORDER_CONSTANT, borderValues); EXPECT_TRUE(ret); cv::Mat dst_imageR(lite_warp.height_, lite_warp.width_, CV_8UC1, lite_warp.data_ptr_);