un non-sens complet du fichier de base ou ce code pourrait vraiment avoir jeté un SIGFPE?
Question
Mon dossier de base allégations selon lesquelles une SIGFPE a été jeté
gcc-4.3.4 / include / c ++ / 4.3.4 / bits / stl_iterator_base_funcs.h
sur la ligne 176. Ceci 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));
}
est dans une autre fonction que j'ai qui fait appeler l'avance autour du code qui ne fait pas une arithmétique à virgule flottante. Le code est compilé avec des optimisations (mais a des symboles de débogage), donc les choses peuvent être un grand brouillées.
Mon fichier core me dire un non-sens complet ou est-il une façon dont cela pourrait avoir un sens?
La solution
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. Voilà pourquoi il semble que le signal a été élevé à l'intérieur std :: avance. A la suite du commentaire de Oli, SIGFPE peut se produire lorsque vous prenez le module par rapport à 0, même si ce n'est pas une opération à virgule flottante. Il y avait un bug différent qui a permis somecontainer
d'être vide dans une affaire d'angle.