2010-03-11 3 views
12

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

+1

Я рекомендую сообщество wiki для этого. У меня есть способность редактирования, поэтому я установлю это сам, если никто не возражает. – Joshua

+6

@Joshua: Почему сообщество wiki? Это не кажется мне субъективным. Это либо возможно, либо нет. –

+4

Если есть, его следует отправить по адресу http://gcc.gnu.org/bugs/, где он может быть исправлен. – ephemient

ответ

7

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

EDIT: Я только что нашел новый способ, который также вылетает из Комо. На данный момент это более удовлетворительный ответ. Конечно, это should also be fixed soon.

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

int main() { 
    a<0>()->x; 
} 
+0

Мне нравится этот ответ. Я подожду, если будет еще что-то, но, вероятно, я его приму. –

0

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

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

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

+1

Это было бы легко проверить, не так ли? – 2010-03-11 21:59:17

+0

Нет, он обнаруживает круговую зависимость. – NomeN

+0

gcc в конечном итоге завершится неудачей с ошибкой '#include inested too deep', а не бесконечным циклом. Быстрый тест показывает, что это так. gcc не обнаруживает круговую зависимость (gcc на OS X Snow Leopard), но она не бесконечна –

1

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

0

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

11

Да.

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

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

UPDATE

В this particular case, моя теория кажется правильным. Компилятор продолжает выделять ОЗУ, и оптимизатор, похоже, уязвим. Ответ - да. Да, ты можешь.

+3

Комментарий '/ * Теоретически возможно, но * очень маловероятно. */'в этом отчете об ошибке стоит тысячи изображений. – 2010-03-20 19:35:05

0

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

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

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

+0

Отсутствие бесконечного цикла во время компиляции моего компилятора (GCC 4.x) :( –

4

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

Например:

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

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

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

+0

Хмм. В прошлый раз я проверяю ' man gcc' У него была опция, определяющая максимальный размер «стека», поэтому это невозможно, так как это не способ работать вокруг бесконечности итераций. –

+0

'' глубина экземпляра шаблона превышает максимум 500'. –

Смежные вопросы