Базовый файл - полная чепуха, или этот код действительно может привести к 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
быть пустым в углу дела.