Базовый файл - полная чепуха, или этот код действительно может привести к SIGFPE? - PullRequest
1 голос
/ 16 ноября 2010

Мой основной файл утверждает, что 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));
    }

это внутри другой функции, которая у меня есть, которая действительно вызывает опережающий код, который не выполняет арифметику с плавающей запятой.Код скомпилирован с оптимизацией (но содержит символы отладки), поэтому все может быть запутано.

Мой основной файл просто говорит мне полную чушь или есть способ, которым это может иметь смысл?

1 Ответ

2 голосов
/ 17 ноября 2010

В ответ на мой собственный вопрос, оптимизатор взял код, который выглядел следующим образом:

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

и скомбинировал их.Вот почему кажется, что сигнал был поднят изнутри std :: advance.После комментария Оли SIGFPE может возникнуть, когда вы берете модуль относительно 0, даже если это не операция с плавающей запятой.Была другая ошибка, которая позволяла somecontainer быть пустым в угловом случае.

...