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 demain()
, funciona, sin segfault. - Si elimino el comentario de la declaración de
v
enStates
y comento la inicialización de C ++ 11, entonces usev.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:
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?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)