Основной файл полная чепуха или этот код действительно бросил SIGFPE?
Вопрос
Мой основной файл утверждает, что SIGFPE был выброшен из
gcc-4.3.4/include/c ++/4.3.4/bits/stl_iterator_base_funcs.h
в строке 176. Это здесь:
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));
}
Это находится внутри другой функции, которая у меня есть, которая действительно называет аванс, окружающий код, который не выполняет никакой арифметики с плавающей запятой. Код составлен с оптимизацией (но имеет символы отладки), поэтому все может быть большим запутанным.
Мой основной файл просто говорит мне полную ерунду или есть способ, которым это может иметь смысл?
Решение
В ответ на мой собственный вопрос, что произошло, так это то, что оптимизатор принял код, который выглядел так:
int which = RANDOM % somecontainer.size();
std::advance(it, which);
и объединил их. Вот почему кажется, что сигнал был поднят изнутри Std :: Advance. После комментариев Оли, Sigfpe может произойти, когда вы принимаете модуль относительно 0, даже если это не операция с плавающей запятой. Была другая ошибка, которая позволила somecontainer
быть пустым в угловом случае.