2010-01-22 21 views
5

je le bit de code suivant:Essayer de comprendre une erreur de GCC

#include <iostream> 
#include <list> 
#include <algorithm> 
#include <iterator> 

template<typename Iterator> 
void foo(Iterator begin, Iterator end) 
{ 
    typedef typename std::iterator_traits<Iterator>::value_type type; 
    type smallest = (*std::min_element(begin,end)); 
    std::cout << smallest << std::endl; 
} 

int main() 
{ 
    std::list<int> l; 
    l.push_back(1); 
    l.push_back(2); 
    foo(l.begin(),l.end()); 
    return 0; 
} 

quand je compile comme suit:

g++ -pedantic -ansi -Wall -Werror -O2 -o test test.cpp 

Je reçois l'erreur suivante:

cc1plus: warnings being treated as errors 
In function ‘int main()’: 
cc1plus: error: dereferencing pointer ‘pretmp.163’ does break strict-aliasing rules 
cc1plus: note: initialized from here 

Cette erreur est vue avec O3, mais pas avec O1. J'ai compilé le code en utilisant le compilateur en ligne comeau, MS VC9.0 et icc v11 et dans tous les cas, le code compile sans problème.

Le code fonctionne très bien avec std::vector, std::deque, std::set, char*, int* itérateurs, semble être quelque chose de très spécifique à la mise en œuvre de std :: liste.

J'espérais que quelqu'un pourrait donner un aperçu de ce que cette erreur particulière (avertissement) signifie et comment s'y prendre pour le résoudre.

Note: La version de GCC est:

gcc (Ubuntu 4.4.1-4ubuntu9) 4.4.1 
Copyright (C) 2009 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 
+0

Impossible de le reproduire avec g ++ 4.3.3 sous Linux ... – sth

+0

Je ne le vois pas avec Apple ++. Quel système d'exploitation est-ce? J'ai tendance à penser que votre version du STL aura de l'importance. –

Répondre

0

Juste hasarder une supposition: si vous déclarez les args de foo pour être const, il peut résoudre ce problème. Le problème de "aliasing", si je le comprends correctement, se présente lorsque plus d'un pointeur dans une boucle peut pointer vers les mêmes données - ceci conduit à des bugs potentiels d'ordre d'opération avec quelques optimisations (ce à quoi l'avertissement se réfère)).

+2

J'ai essayé d'ajouter const, rien ne change Je pense que le problème est lié au code dans la stg gnu –

0

est ici un cas de Bugzilla qui semble représenter ce problème ou quelque chose de très similaire:

Il est marqué comme fixé à 4.4.0, de sorte que vous avez soit exécuté dans un autre coin cas, ou ??? Mais ce bug pourrait vous donner une longueur d'avance sur une résolution pour vous.

3

J'ai répliqué votre erreur sur gcc-4.4. C'est une erreur avec gcc-4.5 et gcc-4.6, depuis Debian "unstable".

J'ai rencontré un bug relativement spécifique à gcc-4.4, similaire à ce bug: Bug 42488 – [4.4 only] spurious strict-aliasing warning. Comme l'a souligné @ michael-burr, il existe un grand nombre de bogues de "règles strictes d'alias" contre gcc-4.4: GCC Bug List: strict aliasing rules 4.4. Je me rends compte que c'est un peu insatisfaisant, mais j'ai fini par accepter cela comme un bug dans GCC 4.4, et j'ai été capable de passer à des versions plus récentes qui n'ont pas ce problème.

+0

Je suis d'accord pour dire qu'il s'agit d'un bug du compilateur. Il se manifeste également lors de l'utilisation de la bibliothèque Boost 1.54 property_tree. Voir lists.boost.org/boost-users/2010/06/59733.php – jfritz42