From 2af700aa406ad68aefa264799aaf43f6e1dced2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antonio=20S=C3=A1nchez?= Date: Tue, 1 Aug 2023 16:33:16 +0000 Subject: [PATCH] Fix nullptr dereference in SVD. --- Eigen/src/SVD/UpperBidiagonalization.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Eigen/src/SVD/UpperBidiagonalization.h b/Eigen/src/SVD/UpperBidiagonalization.h index e6c9097ea..b51bee30d 100644 --- a/Eigen/src/SVD/UpperBidiagonalization.h +++ b/Eigen/src/SVD/UpperBidiagonalization.h @@ -341,11 +341,15 @@ void upperbidiagonalization_inplace_blocked(MatrixType& A, BidiagType& bidiagona // Finally, the algorithm continue on the updated A22. // // However, if B is too small, or A22 empty, then let's use an unblocked strategy + + auto upper_diagonal = bidiagonal.template diagonal<1>(); + typename MatrixType::RealScalar* upper_diagonal_ptr = upper_diagonal.size() > 0 ? &upper_diagonal.coeffRef(k) : nullptr; + if(k+bs==cols || bcols<48) // somewhat arbitrary threshold { upperbidiagonalization_inplace_unblocked(B, &(bidiagonal.template diagonal<0>().coeffRef(k)), - &(bidiagonal.template diagonal<1>().coeffRef(k)), + upper_diagonal_ptr, X.data() ); break; // We're done @@ -354,7 +358,7 @@ void upperbidiagonalization_inplace_blocked(MatrixType& A, BidiagType& bidiagona { upperbidiagonalization_blocked_helper( B, &(bidiagonal.template diagonal<0>().coeffRef(k)), - &(bidiagonal.template diagonal<1>().coeffRef(k)), + upper_diagonal_ptr, bs, X.topLeftCorner(brows,bs), Y.topLeftCorner(bcols,bs)