He estado trabajando en mi programa, y decidí activar algunas optimizaciones usando g++ -O3
. De repente, mi programa comenzó segfaulting. He cazado el código problemático y minimicé mi programa a algo que aún falla (solo cuando utilizo optimizaciones de nivel 3). Tenía la esperanza de que alguien pudiera echar un vistazo rápido en el código (He intentado minimizar tanto como sea posible):Encender la optimización de g ++ causa segfault - No lo entiendo
// src/main.cpp
#include "rt/lights/point.hpp"
int main(int argc, char **argv)
{
rt::Light *light = new rt::light::Point(alg::vector(.0f, 5.0f, 5.0f), rt::Color(1.0f), .5f);
return 0;
}
// include/rt/lights/point.hpp
#ifndef RT_LIGHT_POINT_HPP_
#define RT_LIGHT_POINT_HPP_
#include "rt/accelerator.hpp"
#include "rt/color.hpp"
#include "rt/intersection.hpp"
#include "rt/light.hpp" // abstract
namespace rt {
namespace light {
class Point : public Light
{
public:
Point(alg::vector pos, Color color, float intensity) : Light(intensity * color), pos(pos) {}
Color get_contrib(const Intersection&, const Accelerator&, const alg::vector& toViewer) const;
private:
alg::vector pos;
};
} // namespace light
} // namespace rt
#endif
// include/rt/light.hpp
#ifndef RT_LIGHT_HPP_
#define RT_LIGHT_HPP_
#include "algebra/vector.hpp"
#include "rt/color.hpp"
namespace rt {
class Intersection;
class Accelerator;
class Light
{
public:
Light(Color intensity) : intensity(intensity) {}
virtual Color get_contrib(const Intersection&, const Accelerator&, const alg::vector& toViewer) const = 0;
Color get_intensity() const {return intensity;}
protected:
Color intensity;
};
} // namespace rt
#endif
me encantaría una idea de por qué este código sólo segfaults al utilizar optimizaciones, y cómo detenerlo de hacerlo. ¡Gracias!
$ find src/ -name "*.cpp" | xargs g++ -I include/ -O3
$ ./a.out
Segmentation fault
Editar: A petición, los constructores para alg :: vector
struct vector { float x, y, z; vector() : x(.0f), y(.0f), z(.0f) {} explicit vector(float f) : x(f), y(f), z(f) {} vector(float x, float y, float z) : x(x), y(y), z(z) {} // ...
Edit2: La adición de resultados GDB al compilar con -g
(gdb) file a.out Reading symbols from /home/rob/devel/gbug/a.out...done. (gdb) run Starting program: /home/rob/devel/gbug/a.out Program received signal SIGSEGV, Segmentation fault. rt::light::Point::Point (this=0x804b008, pos=..., color=..., intensity=0.5) at src/rt/lights/point.cpp:13 13 Point::Point(alg::vector pos, Color color, float intensity) : Light(intensity * color), pos(pos) (gdb) bt #0 rt::light::Point::Point (this=0x804b008, pos=..., color=..., intensity=0.5) at src/rt/lights/point.cpp:13 #1 0x08048898 in main (argc=1, argv=0xbffff3e4) at src/main.cpp:5
Edit3: Fuentes para RT :: color .
// include/rt/color.hpp #ifndef RT_COLOR_HPP_ #define RT_COLOR_HPP_ #include "algebra/vector.hpp" namespace rt { /******************************************************************************* * CLASS DEFINITION */ struct Color { float r, g, b; Color() : r(.0f), g(.0f), b(.0f) {} explicit Color(float f) : r(f), g(f), b(f) {} Color(float r, float g, float b) : r(r), g(g), b(b) {} Color& operator+= (const Color&); Color& operator*= (const Color&); Color& operator*= (float); }; /******************************************************************************* * MEMBER OPERATORS */ inline Color& Color::operator+= (const Color& other) { r += other.r; g += other.g; b += other.b; return *this; } inline Color& Color::operator*= (const Color& other) { r *= other.r; g *= other.g; b *= other.b; return *this; } inline Color& Color::operator*= (float f) { r *= f; g *= f; b *= f; } /******************************************************************************* * ADDITIONAL OPERATORS */ inline Color operator+ (Color lhs, const Color& rhs) { return lhs += rhs; } inline Color operator* (Color lhs, const Color& rhs) { return lhs *= rhs; } inline Color operator* (Color c, float f) { return c *= f; } inline Color operator* (float f, Color c) { return c *= f; } } // namespace rt #endif
¿Ha intentado compilar con -g así para ver si la traza inversa es en absoluto utilizable? –
Tengo curiosidad de por qué no compila con 'g ++ src/*. Cpp -Iinclude -O3'. Con el enfoque 'xargs', el compilador construiría cada archivo en' a.out', así que supongo que todos tienen 'main()'. – chrisaycock
puede publicar el constructor de copia de 'alg :: vector'? – Naveen