Основной файл полная чепуха или этот код действительно бросил SIGFPE?

StackOverflow https://stackoverflow.com/questions/4198770

Вопрос

Мой основной файл утверждает, что 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 быть пустым в угловом случае.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top