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

Мой основной файл утверждает, что SIGFPE был брошен из

GCC-4.3.4/ включать / C++/4.3.4/ бит /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 ответ

Решение

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

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

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

Другие вопросы по тегам