LINUX.ORG.RU

gcc11 ломает Eigen с включённой -O3 -Wall

 eigen, gcc11


0

1

Если включить -Wall -O3 для selfadjointView, то gcc11 начинает громко ругаться, ну а так как у меня -Werror ещё включён, то становится ещё грустнее. На gcc10 всё работает, только что проверил. Ругается, что warning: ‘result’ may be used uninitialized, а переменной result ни в коде нет, ни в Eigen/src/Core/products/SelfadjointMatrixVector.h. Версия Eigen 3.3.9

#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>;

inline 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));
}

double bilinear_form (
        const vector_t &v,
        const matrix_t &m)
{
    return braMket (v, m, v);
}
luke@yaviniv:~/eigen-gcc11$ gcc -v
Reading specs from /usr/lib64/gcc/x86_64-slackware-linux/11.2.0/specs
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-slackware-linux/11.2.0/lto-wrapper
Target: x86_64-slackware-linux
Configured with: ../configure --prefix=/usr --libdir=/usr/lib64 --mandir=/usr/man --infodir=/usr/info --enable-shared --enable-bootstrap --enable-languages=ada,brig,c,c++,d,fortran,go,lto,objc,obj-c++ --enable-threads=posix --enable-checking=release --enable-objc-gc --with-system-zlib --enable-libstdcxx-dual-abi --with-default-libstdcxx-abi=new --disable-libstdcxx-pch --disable-libunwind-exceptions --enable-__cxa_atexit --disable-libssp --enable-gnu-unique-object --enable-plugin --enable-lto --disable-install-libiberty --disable-werror --with-gnu-ld --with-isl --verbose --with-arch-directory=amd64 --disable-gtktest --enable-clocale=gnu --disable-multilib --target=x86_64-slackware-linux --build=x86_64-slackware-linux --host=x86_64-slackware-linux
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.2.0 (GCC) 
luke@yaviniv:~/eigen-gcc11$ pkg-config --modversion eigen3
3.3.9
luke@yaviniv:~/eigen-gcc11$ g++ -c initialize.cpp -o initialize.o $(pkg-config eigen3 --cflags)  -Wall 
luke@yaviniv:~/eigen-gcc11$ g++ -c initialize.cpp -o initialize.o $(pkg-config eigen3 --cflags)  -Wall -O3
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(
      |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
luke@yaviniv:~/eigen-gcc11$ 

На арче такая же беда.

Upd. Баг подтвердили, выражение упростили до просто умножения вектора на матрицу: https://godbolt.org/z/PGjP3rz91

★★★★★

Последнее исправление: luke (всего исправлений: 1)

Более простой вариант ведёт себя так же:

luke@yaviniv:~/eigen-gcc11$ cat initialize.cpp
#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));
}
luke ★★★★★
() автор топика

Не касаясь гццпроблем, упомяну что third party инклуды можно включать через -isystem вместо -I, тогда в них не будут считаться варнинги.

slovazap ★★★★★
()

/usr/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h:227:7: warning: ‘result’ may be used uninitialized [-Wmaybe-uninitialized]

там небось используется макра в этой строчке или дефайн какой, или инлайн, оттуда result и прибежал. просто так он не будет ругаться.

alysnix ★★★
()
Ответ на: комментарий от alysnix

Eigen он такой, макросы да шаблоны.

luke ★★★★★
() автор топика
Ответ на: комментарий от annulen

Я уже написал им про 3.3.9.

Можно попробовать и новую версию.

luke ★★★★★
() автор топика
Последнее исправление: luke (всего исправлений: 1)
Ответ на: комментарий от annulen

Та же фигня

[luke@r2-d2 eigen]$ pkg-config eigen3 --modversion
3.4.0
[luke@r2-d2 eigen]$ g++ selfadjointview.cpp -c -o selfadjointview.o $(pkg-config eigen3 --cflags) -Wall -O3
In file included from /home/luke/pkg/eigen-3.4.0/include/eigen3/Eigen/Core:337,
                 from selfadjointview.cpp:1:
/home/luke/pkg/eigen-3.4.0/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> > >]’:
/home/luke/pkg/eigen-3.4.0/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h:229:7: warning: ‘result’ may be used uninitialized [-Wmaybe-uninitialized]
  227 |     internal::selfadjoint_matrix_vector_product<Scalar, Index, (internal::traits<ActualLhsTypeCleaned>::Flags&RowMajorBit) ? RowMajor : ColMajor,
      |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  228 |                                                 int(LhsUpLo), bool(LhsBlasTraits::NeedToConjugate), bool(RhsBlasTraits::NeedToConjugate)>::run
      |                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  229 |       (
      |       ^
  230 |         lhs.rows(),                             // size
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  231 |         &lhs.coeffRef(0,0),  lhs.outerStride(), // lhs info
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  232 |         actualRhsPtr,                           // rhs info
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  233 |         actualDestPtr,                          // result info
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  234 |         actualAlpha                             // scale factor
      |         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  235 |       );
      |       ~
/home/luke/pkg/eigen-3.4.0/include/eigen3/Eigen/src/Core/products/SelfadjointMatrixVector.h:41:6: 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
   41 | void selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,Version>::run(
      |      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[luke@r2-d2 eigen]$ g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-linux-gnu/11.1.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /build/gcc/src/gcc/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++,d --with-isl --with-linker-hash-style=gnu --with-system-zlib --enable-__cxa_atexit --enable-cet=auto --enable-checking=release --enable-clocale=gnu --enable-default-pie --enable-default-ssp --enable-gnu-indirect-function --enable-gnu-unique-object --enable-install-libiberty --enable-linker-build-id --enable-lto --enable-multilib --enable-plugin --enable-shared --enable-threads=posix --disable-libssp --disable-libstdcxx-pch --disable-libunwind-exceptions --disable-werror gdc_include_dir=/usr/include/dlang/gdc
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 11.1.0 (GCC) 

Правда проверял на необновлённом арче на этот раз.

luke ★★★★★
() автор топика
Ответ на: Та же фигня от luke

ну это варнинг, но лучше писать разрабам, поскольку его быть не должно.

wxWidgets тоже усыпает варнингами из хидеров, даже в -Og. то есть без оптимизаций особенных вообще.

просто писали код под старыми компиляторами, которые варнинг не давали, а новые поливают варнингами как из ведра.

alysnix ★★★
()
Ответ на: комментарий от alysnix

Я отрепортил это как «баг», но судя по истории в гите у них там людей маловато, поэтому реакции никакой пока.

Я тут ещё проскроллил историю, интересно, что похожий варнинг всплывает с gcc 4.7 при инверсии матрицы 3x3: https://gitlab.com/libeigen/eigen/-/commit/5ad8b9bfe2bf75620bc89467c5cc051fc2a597df

luke ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.