From a7c4ee9ae1ad0aecb1892ef3b8073ca62ffef628 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Mon, 18 Mar 2019 17:47:07 +0300 Subject: [PATCH] core: add iterations limit check in eigenNonSymmetric() --- modules/core/src/lda.cpp | 6 +++++- modules/core/test/test_eigen.cpp | 11 +++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/modules/core/src/lda.cpp b/modules/core/src/lda.cpp index abbb43ecd3..80c97c03d2 100644 --- a/modules/core/src/lda.cpp +++ b/modules/core/src/lda.cpp @@ -322,6 +322,8 @@ private: // Fortran subroutine in EISPACK. // Initialize + const int max_iters_count = 1000 * this->n; + int nn = this->n; int n1 = nn - 1; int low = 0; @@ -487,7 +489,9 @@ private: } } - iter = iter + 1; // (Could check iteration count here.) + iter = iter + 1; + if (iter > max_iters_count) + CV_Error(Error::StsNoConv, "Algorithm doesn't converge (complex eigen values?)"); // Look for two consecutive small sub-diagonal elements int m = n1 - 2; diff --git a/modules/core/test/test_eigen.cpp b/modules/core/test/test_eigen.cpp index b2f09ea48c..a5b9c3ad1f 100644 --- a/modules/core/test/test_eigen.cpp +++ b/modules/core/test/test_eigen.cpp @@ -519,4 +519,15 @@ TEST_P(Core_EigenZero, double) } INSTANTIATE_TEST_CASE_P(/**/, Core_EigenZero, testing::Values(2, 3, 5)); +TEST(Core_EigenNonSymmetric, convergence) +{ + Matx33d m( + 0, -1, 0, + 1, 0, 1, + 0, -1, 0); + Mat eigenvalues, eigenvectors; + // eigen values are complex, algorithm doesn't converge + EXPECT_THROW(cv::eigenNonSymmetric(m, eigenvalues, eigenvectors), cv::Exception); // exception instead of hang +} + }} // namespace