2010-11-16 36 views
1

Mon fichier de base prétend qu'un SIGFPE a été jeté deNoyau complet de non-sens ou ce code aurait-il vraiment jeté un SIGFPE?

gcc-4.3.4/include/C++/4.3.4/bits/stl_iterator_base_funcs.h

sur la ligne 176. C'est ici:

template<typename _InputIterator, typename _Distance> 
    inline void 
    advance(_InputIterator& __i, _Distance __n) 
    { 
      // concept requirements -- taken care of in __advance 
176----> typename iterator_traits<_InputIterator>::difference_type __d = __n; 
      std::__advance(__i, __d, std::__iterator_category(__i)); 
    } 

C'est dans une autre fonction que j'ai qui appelle l'avance entourant le code qui ne fait aucune arithmétique en virgule flottante. Le code est compilé avec des optimisations (mais a des symboles de débogage), donc les choses peuvent être un peu obscurcies.

Est-ce que mon fichier de base me dit simplement un non-sens complet ou y a-t-il un moyen de le faire?

+2

SIGFPE ne correspond pas nécessairement à l'arithmétique en virgule flottante: http://en.wikipedia.org/wiki/SIGFPE. –

+1

Pourriez-vous afficher la sortie 'bt full'? –

+0

@Oli Merci de me montrer à regarder les bugs mathématiques générales, et pas seulement les bogues en virgule flottante. Il se trouve que '% 0' peut aussi augmenter SIGFPE. –

Répondre

2

En réponse à ma propre question, ce qui est arrivé est que optimiseur a pris du code qui ressemblait à ceci:

int which = RANDOM % somecontainer.size(); 
std::advance(it, which); 

et les combinés. C'est pourquoi il semble que le signal a été soulevé depuis l'intérieur de std :: advance. Suite au commentaire d'Oli, SIGFPE peut se produire lorsque vous prenez le module par rapport à 0, même s'il ne s'agit pas d'une opération en virgule flottante. Il y avait un bug différent qui permettait somecontainer d'être vide dans un cas de coin.