Можно ли привести GCC в бесконечный цикл?

Можно ли ввести GCC в бесконечный цикл путем ввода странного исходного кода? И если да, то как? Может быть, можно что-то сделать с метапрограммированием шаблона?

gcc
12 голосов | спросил Karl von Moor 12 MaramFri, 12 Mar 2010 00:48:59 +03002010-03-12T00:48:59+03:0012 2010, 00:48:59

7 ответов


0

Ошибки являются особенно временными, например, ответ @ Pestilence был найден в GCC 4.4.0 и исправлен в 4.4.1. Список текущих способов перевода GCC в бесконечный цикл см. В разделе их Bugzilla .

РЕДАКТИРОВАТЬ: Я только что нашел новый способ, который также приводит к сбою Comeau. Это более удовлетворительный ответ, пока. Конечно, также следует исправить в ближайшее время .

template< int n >
struct a { 
    a< n+1 > operator->() { return a< n+1 >(); }
};

int main() {
    a<0>()->x;
}
ответил Potatoswatter 19 MaramFri, 19 Mar 2010 03:15:36 +03002010-03-19T03:15:36+03:0003 2010, 03:15:36
0

Да.

Почти у каждой компьютерной программы есть проблемы с завершением цикла. Однако я думаю, что в GCC не хватило бы оперативной памяти, прежде чем бесконечный цикл станет очевидным. В его дизайне не так много «свободных» операций.

Парсер & препроцессор не создаст проблем. Готов поспорить, что вы можете настроить таргетинг на оптимизатор, который, скорее всего, будет иметь больше ошибок при реализации. Это будет не столько язык, сколько использование уязвимости, которую вы можете обнаружить из исходного кода. то есть эксплойт был бы неочевиден.

UPDATE

В этом конкретном случае моя теория кажется верной. Компилятор продолжает выделять оперативную память, а оптимизатор кажется уязвимым. Ответ - да. Да, вы можете.

ответил pestilence669 12 MaramFri, 12 Mar 2010 01:03:33 +03002010-03-12T01:03:33+03:0001 2010, 01:03:33
0

Поскольку метапрограммирование шаблона C ++ фактически завершено по Тьюрингу, вы можете выполнять бесконечную компиляцию.

Например:

template<typename T>
struct Loop {
   typedef typename Loop<Loop<T> >::Temp Temp;
};

int main(int, char**) {
   Loop<int> n;
   return 0;
}

Впрочем, как и ответ передо мной. У gcc есть флаг, чтобы остановить это от бесконечного продолжения (очень похоже на переполнение стека в бесконечной рекурсии).

ответил Shiroko 19 MarpmFri, 19 Mar 2010 16:03:49 +03002010-03-19T16:03:49+03:0004 2010, 16:03:49
0

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

ответил 12 MaramFri, 12 Mar 2010 01:01:25 +03002010-03-12T01:01:25+03:0001 2010, 01:01:25
0

Не знаю о gcc, но старый pcc раньше входил в бесконечный цикл, компилируя некоторые виды бесконечных циклов (те, которые скомпилированы в _x: jmp _x).

ответил Joshua 12 MaramFri, 12 Mar 2010 01:01:54 +03002010-03-12T01:01:54+03:0001 2010, 01:01:54
0

Я думаю, вы могли бы сделать это с помощью #include

Просто #include "file1.c" в file2.c и #include "file2.c" в file1

предложение заставляет компилятор многократно зацикливаться, а затем завершаться с ошибкой, а не зацикливаться бесконечно

ответил zellio 12 MaramFri, 12 Mar 2010 00:57:57 +03002010-03-12T00:57:57+03:0012 2010, 00:57:57
0

Бентли пишет в своей книге «Программирование жемчужин», что следующий код привел к бесконечному циклу во время оптимизированной компиляции:

void traverse(node* p) {
  traverse(p->left);
  traverse(p->right);
}

Он говорит, что «оптимизатор попытался преобразовать хвостовую рекурсию в цикл и умер, когда смог найти тест для завершения цикла». (с.139) Он не сообщает точную версию компилятора, где это произошло. Я предполагаю, что более новые компиляторы обнаружат случай.

ответил Frank 14 MarpmSun, 14 Mar 2010 21:12:14 +03002010-03-14T21:12:14+03:0009 2010, 21:12:14

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132