Bonjour,

Je suis actuellement en train de développer un code pour générer des fractales, fortement inspiré du code de Yan pour le défis, mais utilisant Qt plutôt que la stl, bref, c'est pas le problème .

Le problème est le suivant : j'ai des warning qui apparaissent quand je compile un fichier en mode release et pas en mode debug. Après vérification, c'est l'ajout de l'option -O2 qui entraine l'apparition.

Voici le code :

fractal.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
 #ifndef FRACTAL_H
 #define FRACTAL_H
 
 #include <QPointF>
 #include <QVector>
 
 typedef QVector<QPointF> Sequence;
 
 class Fractal
 {
 public:
     Fractal(uint nbIterations = 1024);
     virtual ~Fractal();
 
     const Sequence& sequence() const;
     const Sequence& computePoint(const QPointF& point);
 
     virtual Fractal* clone() const = 0;
 
 protected:
 
     virtual void begin(const QPointF& point) = 0;
     virtual void next() = 0;
     virtual bool end() const = 0;
 
     uint m_n;
     QPointF m_currentPoint;
     Sequence m_sequence;
 };
 
 #endif // FRACTAL_H
et fractal.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
 #include "fractal.h"
 
 Fractal::Fractal(uint nbIterations) :
         m_n(nbIterations)
 {
 }
 
 Fractal::~Fractal()
 {
 }
 
 const Sequence& Fractal::sequence() const
 {
     return m_sequence;
 }
 
 const Sequence& Fractal::computePoint(const QPointF& point)
 {
     uint i;
 
     m_sequence.clear();
 
     begin(point);
     for(i=0; !end() && i<m_n; i++)
     {
         next();
         m_sequence << m_currentPoint;
     }
 
     if(i==m_n)
         m_sequence.clear();
 
     return m_sequence;
 }
Le résultat de la compilation est :

g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -Iinclude -Imoc -o obj/fractal.o src/fractal.cpp
/usr/include/qt4/QtCore/qvector.h: In member function ‘const Sequence& Fractal::computePoint(const QPointF&)’:
/usr/include/qt4/QtCore/qvector.h:421: warning: dereferencing pointer ‘<anonymous>’ does break strict-aliasing rules
/usr/include/qt4/QtCore/qvector.h:114: note: initialized from here
/usr/include/qt4/QtCore/qvector.h:421: warning: dereferencing pointer ‘<anonymous>’ does break strict-aliasing rules
/usr/include/qt4/QtCore/qvector.h:114: note: initialized from here
/usr/include/qt4/QtCore/qvector.h:421: warning: dereferencing pointer ‘<anonymous>’ does break strict-aliasing rules
/usr/include/qt4/QtCore/qvector.h:114: note: initialized from here
/usr/include/qt4/QtCore/qvector.h:421: warning: dereferencing pointer ‘<anonymous>’ does break strict-aliasing rules
/usr/include/qt4/QtCore/qvector.h:114: note: initialized from here
/usr/include/qt4/QtCore/qvector.h:315: warning: dereferencing pointer ‘pretmp.442’ does break strict-aliasing rules
/usr/include/qt4/QtCore/qvector.h:315: warning: dereferencing pointer ‘pretmp.442’ does break strict-aliasing rules
/usr/include/qt4/QtCore/qvector.h:315: warning: dereferencing pointer ‘pretmp.442’ does break strict-aliasing rules
/usr/include/qt4/QtCore/qvector.h:315: warning: dereferencing pointer ‘pretmp.442’ does break strict-aliasing rules
/usr/include/qt4/QtCore/qvector.h:374: warning: dereferencing pointer ‘pretmp.442’ does break strict-aliasing rules
/usr/include/qt4/QtCore/qvector.h:374: warning: dereferencing pointer ‘pretmp.442’ does break strict-aliasing rules
cc1plus: note: initialized from here
Désolé pour la longueur, mais je pense que c'est mieux s'il y a tout d'entrée.

J'ai tapé cette erreur dans google, mais je n'ai rien trouvé de satisfaisant, la solution est en général de rajouter une option pour retirer le strict-aliasing, mais j'aimerais savoir un peu mieux pourquoi ce warning apparait, et comment l'enlever.

Voici ma config, vu qu'il s'agit peut-etre d'un problème de compilateur :

g++ -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.4.1-4ubuntu9' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4 --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)

et pour Qt : version dépot de ubuntu karmic :

qmake -v
QMake version 2.01a
Using Qt version 4.5.2
Merci d'avance pour les lumières que vous pourrez m'apportez

PS : je précise que le code fonctionne quand meme, mais c'est pas une raison