c++ c++11 segmentation-fault eigen eigen3

c++ - Eigen segfault no optimizaciones Solaris



c++11 segmentation-fault (0)

Tengo el siguiente código:

#include <Eigen/Dense> struct States { // Eigen::VectorXd v; Eigen::VectorXd v{Eigen::VectorXd::Ones(2)}; States() { // v.resize(2); // v << 1, 1; } }; States st; int main() {}

Cada vez que construyo el proyecto en Solaris 11 (con g ++ 4.9), sin optimizaciones, obtengo un segfault (core dump) al ejecutar. Después de excavar y depurar paso a paso, creo que la línea defectuosa está en DenseCoeffBase.h , dentro de la función copyPacket , concretamente en la línea 537.

derived().template writePacket<StoreMode>(index, other.derived().template packet<LoadMode>(index));

Línea de comando que utilicé para compilar / ejecutar: g++ -std=c++11 -I ./eigen_3.2.2 example.cpp; ./a.out g++ -std=c++11 -I ./eigen_3.2.2 example.cpp; ./a.out

Algunas observaciones:

  • Si cambio la declaración a los States st; dentro de main() , funciona, sin segfault.
  • Si elimino el comentario de la declaración de v en States y comento la inicialización de C ++ 11, entonces use v.resize(2); v << 1, 1; v.resize(2); v << 1, 1; dentro del constructor, funciona
  • Si uso las optimizaciones -O2 u -O2 , funciona.
  • En todas las demás plataformas que probé (Ubuntu 14.04, Debian7, OS X 10.10) funciona, sin importar el nivel de optimización
  • El problema parece aparecer solo en Solaris, sin optimizaciones, en g ++ 4.9

Las preguntas que tengo son las siguientes:

  1. Es el código que escribí correcto? A saber, ¿puedo utilizar de forma segura la inicialización en clase de C++11 , o debería simplemente declarar el vector y luego cambiar su tamaño en el constructor?

  2. Si mi código es correcto, ¿alguien se topó con este problema? (Sé que es altamente improbable, pero todavía pregunto :))

PD: utilizo Eigen 3.2.2 (aunque el problema también aparece en 3.2.1)

Agradecería si alguien pudiera decirme si puede compilar / ejecutar el programa en Solaris11 (sin importar el compilador)