gcc 11 warns on a varibale from SelfadjointMatrixVector.h that may be used uninitialized with -O3 -Wall flags
Summary
GCC 11 warns on a probable use of an uninitialized variable with -Wall -O3 (SelfadjointMatrixVector.h:227:7: warning: ‘result’ may be used uninitialized).
Environment
- Operating System : Linux (Arch, Slackware)
- Architecture : x86_64
- Eigen Version : 3.3.9
- Compiler Version : gcc 11.2
- Compile Flags : -O3 -Wall
- Vector Extension : not specified
Minimal Example
#include "Eigen/Core"
using matrix_t = Eigen::Matrix<std::complex<double>, Eigen::Dynamic,
Eigen::Dynamic>;
using vector_t = Eigen::Matrix<std::complex<double>, Eigen::Dynamic, 1>;
double braMket (const vector_t &bra, const matrix_t &M, const vector_t &ket)
{
const auto H = M.selfadjointView<Eigen::Lower> ();
return std::real (ket.dot (bra.transpose ()*H));
}
Steps to reproduce
- compile the code above with g++ 11 with -Wall -O3 flags
- get rid of -O3 for comparison
- with g++ 10 this warning doesn't show up even if -O3 is set
Warning Messages
In file included from /usr/include/eigen3/Eigen/Core:503,
from initialize.cpp:1:
/usr/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h: In function ‘static void Eigen::internal::selfadjoint_product_impl<Lhs, LhsMode, false, Rhs, 0, true>::run(Dest&, const Lhs&, const Rhs&, const Scalar&) [with Dest = Eigen::Transpose<Eigen::Matrix<std::complex<double>, 1, -1> >; Lhs = Eigen::Transpose<const Eigen::Matrix<std::complex<double>, -1, -1> >; int LhsMode = 2; Rhs = Eigen::Transpose<const Eigen::Transpose<const Eigen::Matrix<std::complex<double>, -1, 1> > >]’:
/usr/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h:227:7: warning: ‘result’ may be used uninitialized [-Wmaybe-uninitialized]
225 | internal::selfadjoint_matrix_vector_product<Scalar, Index, (internal::traits<ActualLhsTypeCleaned>::Flags&RowMajorBit) ? RowMajor : ColMajor,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
226 | int(LhsUpLo), bool(LhsBlasTraits::NeedToConjugate), bool(RhsBlasTraits::NeedToConjugate)>::run
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
227 | (
| ^
228 | lhs.rows(), // size
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
229 | &lhs.coeffRef(0,0), lhs.outerStride(), // lhs info
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
230 | actualRhsPtr, // rhs info
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
231 | actualDestPtr, // result info
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
232 | actualAlpha // scale factor
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
233 | );
| ~
/usr/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h:39:24: note: by argument 4 of type ‘const std::complex<double>*’ to ‘static void Eigen::internal::selfadjoint_matrix_vector_product<Scalar, Index, StorageOrder, UpLo, ConjugateLhs, ConjugateRhs, Version>::run(Index, const Scalar*, Index, const Scalar*, Scalar*, Scalar) [with Scalar = std::complex<double>; Index = long int; int StorageOrder = 1; int UpLo = 2; bool ConjugateLhs = false; bool ConjugateRhs = false; int Version = 0]’ declared here
39 | EIGEN_DONT_INLINE void selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,Version>::run(
|
Anything else that might help
It might be a strange optimization of g++ rather than Eigen causing this behaviour, but it would be interesting to find which particular part of Eigen internals creates this warning. Also, it looks like this warning is connected with the issue no 2266 somehow.