Skip to content

[QUESTION] pybind11+eigen warning in O2 optimization with gcc #3014

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
anciaux opened this issue May 21, 2021 · 3 comments
Open

[QUESTION] pybind11+eigen warning in O2 optimization with gcc #3014

anciaux opened this issue May 21, 2021 · 3 comments

Comments

@anciaux
Copy link

anciaux commented May 21, 2021

Thanks for maintaining this project. I love it.

When I compile the ode below, mainly involved with the use of Eigen+Pybind11 I have unexpected compilation warnings appearing:

#include <Eigen/Dense>
#include <pybind11/eigen.h>
#include <pybind11/pybind11.h>

namespace py = pybind11;

void foo() {
  py::object val;
  pybind11::cast<Eigen::Vector3d>(val);
}

I compile it with:
g++ -Wall -c -O2 -I $EIGEN_INCLUDE_PATH -I $PYBIND11_INCLUDE_PATH -I $PYTHON_INCLUDE_PATH test.cc
to obtain:

Eigen/src/Core/DenseStorage.h:211:9: warning: ‘<anonymous>’ may be used uninitialized in this function [-Wmaybe-uninitialized]
  211 |         m_data = std::move(other.m_data);

This suggest a temporary object is partially initiallized during the cast (or confuses the compiler)
I am trying to remove such worrying warnings for sanity. Any help is really appreciated.

Information of the system setup:

eigen: 391094c50743f28f9174f455661f650bf07e0177
pybind11: f61855b
python-3.8
compiler: g++ (Debian 10.2.1-6) 10.2.1 20210110

@anciaux anciaux changed the title [QUESTION] [QUESTION] pybind11+eigen warning in O2 optimization with gcc May 21, 2021
@petrochemical
Copy link

petrochemical commented Sep 19, 2022

I am having the same issue

New install of Ubuntu 22.04,

  • Eigen 3.4.0-2ubuntu2
  • Python 3.10.4
  • g++ (Ubuntu 11.2.0-19ubuntu1) 11.2.0
  • pybind11-dev 2.9.1-2
/* Simple binding which produces warnings under g++11 */

#include <stdio.h>

#include <pybind11/pybind11.h>
#include <pybind11/stl.h>
#include <pybind11/numpy.h>
#include <pybind11/eigen.h>
#include <pybind11/cast.h>

void init_bistest(pybind11::module &m)
{
    m.def(
        "PassVector3d", [](const Eigen::Vector3d& v) {
            fprintf(stderr, "test=(%9.4f,%9.4f,%9.4f)\n", v(0), v(1), v(2));
        },
        pybind11::arg("v"),
        "Test passing Eigen Vector3d using Pybind11"
    );
}
$ g++ -O3 -std=c++17 -Wall -I/usr/include/python3.10 -I/usr/lib/python3/dist-packages/pybind11/include -I /usr/include/eigen3 -c pybind/pb_bind_bistest.cpp -o ../build/rbuild/pybind/pb_bind_bistest.o

In file included from /usr/include/eigen3/Eigen/Core:294,
                from /usr/lib/python3/dist-packages/pybind11/include/pybind11/eigen.h:30,
                from pybind/pb_bind_bistest.cpp:8:
In member function ‘Eigen::PlainObjectBase<Derived>& Eigen::PlainObjectBase<Derived>::operator=(Eigen::PlainObjectBase<Derived>&&) [with Derived = Eigen::Matrix<double, 3, 1>]’,
   inlined from ‘Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>& Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::operator=(Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>&&) [with _Scalar = double; int _Rows = 3; int _Cols = 1; int _Options = 0; int _MaxRows = 3; int _MaxCols = 1]’ at /usr/include/eigen3/Eigen/src/Core/Matrix.h:281:22,
   inlined from ‘bool pybind11::detail::type_caster<Type, typename std::enable_if<std::integral_constant<bool, (pybind11::detail::negation<std::integral_constant<bool, (decltype (pybind11::detail::is_template_base_of_impl<Eigen::DenseBase>::check((typename pybind11::detail::intrinsic_type<T>::type*)(nullptr)))::value && std::is_base_of<Eigen::MapBase<Derived, 0>, T>::value)> >::value && decltype (pybind11::detail::is_template_base_of_impl<Eigen::PlainObjectBase>::check((typename pybind11::detail::intrinsic_type<T>::type*)(nullptr)))::value)>::value, void>::type>::load(pybind11::handle, bool) [with Type = Eigen::Matrix<double, 3, 1>]’ at /usr/lib/python3/dist-packages/pybind11/include/pybind11/eigen.h:276:15:
/usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h:504:7: warning: ‘*(Eigen::DenseStorage<double, 3, 3, 1, 0>*)((char*)&<unnamed> + offsetof(Eigen::Matrix<double, 3, 1, 0, 3, 1>,Eigen::Matrix<double, 3, 1, 0, 3, 1>::<unnamed>.Eigen::PlainObjectBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >::<unnamed>.Eigen::MatrixBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >::<unnamed>.Eigen::DenseBase<Eigen::Matrix<double, 3, 1, 0, 3, 1> >::<unnamed>.Eigen::DenseCoeffsBase<Eigen::Matrix<double, 3, 1, 0, 3, 1>, 3>::<unnamed>.Eigen::DenseCoeffsBase<Eigen::Matrix<double, 3, 1, 0, 3, 1>, 1>::<unnamed>.Eigen::DenseCoeffsBase<Eigen::Matrix<double, 3, 1, 0, 3, 1>, 0>::<unnamed>))’ may be used uninitialized [-Wmaybe-uninitialized]
 504 |       m_storage = std::move(other.m_storage);
     |       ^~~~~~~~~
In file included from pybind/pb_bind_bistest.cpp:8:
/usr/lib/python3/dist-packages/pybind11/include/pybind11/eigen.h: In member function ‘bool pybind11::detail::type_caster<Type, typename std::enable_if<std::integral_constant<bool, (pybind11::detail::negation<std::integral_constant<bool, (decltype (pybind11::detail::is_template_base_of_impl<Eigen::DenseBase>::check((typename pybind11::detail::intrinsic_type<T>::type*)(nullptr)))::value && std::is_base_of<Eigen::MapBase<Derived, 0>, T>::value)> >::value && decltype (pybind11::detail::is_template_base_of_impl<Eigen::PlainObjectBase>::check((typename pybind11::detail::intrinsic_type<T>::type*)(nullptr)))::value)>::value, void>::type>::load(pybind11::handle, bool) [with Type = Eigen::Matrix<double, 3, 1>]’:
/usr/lib/python3/dist-packages/pybind11/include/pybind11/eigen.h:276:17: note: ‘<anonymous>’ declared here
 276 |         value = Type(fits.rows, fits.cols);
     |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~

@cielavenir
Copy link
Contributor

@petrochemical I hit this during compiling Open3D, and I found that adding -flto fixes the issue somehow...

@NeroBurner
Copy link

A fix for this issue war merged with #5516 but not yet part of a release

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants