Что самый короткий код должен вызвать переполнение стека? [закрытый]

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

160
задан 19 revs, 9 users 62% 23 May 2017 в 12:26
поделиться

131 ответ

Все эти ответы и никакой Befunge? Я держал бы пари на изрядное количество, это - самое короткое решение их всех:

1

Не ребячество. Попробуйте его сами: http://www.quirkster.com/iano/js/befunge.html

РЕДАКТИРОВАНИЕ: Я предполагаю, что должен объяснить этого. 1 операнд продвигает 1 на внутренний стек Befunge, и отсутствие чего-либо еще помещает его в цикл по правилам языка.

Используя интерпретатор, если, Вы будете в конечном счете - и я имею в виду в конечном счете - поражает точку, где массив JavaScript, который представляет стек Befunge, становится слишком большим для браузера для перераспределения. Если бы у Вас был простой интерпретатор Befunge с меньшим и ограниченным стеком - как имеет место с большинством языков ниже - то эта программа вызвала бы более значимое переполнение быстрее.

212
ответ дан 4 revs 23 November 2019 в 21:27
поделиться

3 байта:

label:
  pusha
  jmp label

Обновление

Согласно (старая?) Документация Intel (?) , это - также 3 байта:

label:
  call label

5
ответ дан 2 revs 23 November 2019 в 21:27
поделиться
xor esp, esp
ret
6
ответ дан a1k0n 23 November 2019 в 21:27
поделиться

Java

Немного более короткая версия решения для Java.

class X{public static void main(String[]a){main(a);}}
7
ответ дан Misha 23 November 2019 в 21:27
поделиться

Вот является другой интересным из Схемы:

((lambda (x) (x x)) (lambda (x) (x x)))
8
ответ дан Adam Rosenfield 23 November 2019 в 21:27
поделиться

Я выбираю “best answer” после этого сообщения. Но сначала, я хотел бы подтвердить некоторые очень исходные вклады:

  1. aku. Каждый исследует новый и исходный способ вызвать переполнение стека. Идея сделать f (x) в ‡’ f (f (x)) является тем, который я исследую в своей следующей записи, ниже.:-)
  2. тот Cody, который дал компилятор Nemerle переполнение стека.
  3. И (немного неохотно), один GateKiller о броске исключения из-за переполнения стека.:-P

, Хотя я люблю вышеупомянутое, проблема, о выполнении гольфа кода, и быть справедливым респондентам, я должен присудить “best answer” самому короткому коду, который является записью Befunge; я не полагаю, что кто-либо будет в состоянии разбить это (хотя Konrad, конечно, попробовал), так поздравляю Patrick!

Наблюдение большого количества stack-overflow-by-recursion решений, я удивлен, что никто не имеет (с текущей записи), поднял Y combinator (см. эссе Dick Gabriel, Почему из Y, для краткой информации). У меня есть рекурсивное решение, которое использует Y combinator, а также f aku (f (x)) подход.:-)

((Y (lambda (f) (lambda (x) (f (f x))))) #f)
10
ответ дан 2 revs 23 November 2019 в 21:27
поделиться

Python :

so=lambda:so();so()

, Кроме того:

def so():so()
so()

И если Python оптимизировал последние вызовы...:

o=lambda:map(o,o());o()
11
ответ дан 4 revs, 2 users 86% 23 November 2019 в 21:27
поделиться

C - Это не является самым коротким, но это без рекурсий. Это также не портативно: это отказывает на Солярисе, но некоторый alloca () реализации мог бы возвратить ошибку сюда (или назвать malloc ()). Вызов к printf () необходим.

#include <stdio.h>
#include <alloca.h>
#include <sys/resource.h>
int main(int argc, char *argv[]) {
    struct rlimit rl = {0};
    getrlimit(RLIMIT_STACK, &rl);
    (void) alloca(rl.rlim_cur);
    printf("Goodbye, world\n");
    return 0;
}
12
ответ дан bk1e 23 November 2019 в 21:27
поделиться

попытайтесь поместить больше чем 4 пирожка на единственный бургер. переполнение стека.

11
ответ дан user8456 23 November 2019 в 21:27
поделиться
Person JeffAtwood;
Person JoelSpolsky;
JeffAtwood.TalkTo(JoelSpolsky);

Здесь не надеется ни на какую хвостовую рекурсию!

14
ответ дан Ryan Fox 23 November 2019 в 21:27
поделиться

Groovy:

main()

$ отличный stack.groovy:

Caught: java.lang.StackOverflowError
    at stack.main(stack.groovy)
    at stack.run(stack.groovy:1)
 ...
15
ответ дан Chris Broadfoot 23 November 2019 в 21:27
поделиться

Используя пакетный файл Окна, названный "s.bat":

call s
19
ответ дан Jude Allred 23 November 2019 в 21:27
поделиться

Javascript

, Чтобы обрезать еще несколько символов и вышибить нас из большего количества магазинов программного обеспечения, давайте пойдем с:

eval(i='eval(i)');
17
ответ дан 3 revs, 3 users 67% 23 November 2019 в 21:27
поделиться

Я любил "кучу" ответа Cody, таким образом, вот мой подобный вклад в C++:

template <int i>
class Overflow {
    typedef typename Overflow<i + 1>::type type;
};

typedef Overflow<0>::type Kaboom;

Не запись гольфа кода каким-либо образом, но тем не менее, что-либо для meta переполнения стека!:-P

26
ответ дан Chris Jester-Young 23 November 2019 в 21:27
поделиться

Вот мой вклад C, взвешивающийся в 18 символах:

void o(){o();o();}

Это , партия тяжелее к последнему вызову оптимизирует!:-P

21
ответ дан Chris Jester-Young 23 November 2019 в 21:27
поделиться

Как насчет следующего в ОСНОВНОМ:

10 GOSUB 10

(у меня нет ОСНОВНОГО интерпретатора, я боюсь, таким образом, это - предположение).

26
ответ дан stusmith 23 November 2019 в 21:27
поделиться

Другой пример PHP:

<?
require(__FILE__);
29
ответ дан 2 revs, 2 users 92% 23 November 2019 в 21:27
поделиться

На английском языке:

recursion = n. See recursion.
29
ответ дан Vinko Vrsalovic 23 November 2019 в 21:27
поделиться

Ассемблер Z-80 - в ячейке памяти 0x0000:

rst 00

один байт - 0xC7 - бесконечный цикл продвижения текущего ПК к стеку и переходу для обращения к 0x0000.

35
ответ дан Dennis Munsie 23 November 2019 в 21:27
поделиться

TeX:

\def~{~.}~

Результаты в:

! TeX capacity exceeded, sorry [input stack size=5000].
~->~
    .
~->~
    .
~->~
    .
~->~
    .
~->~
    .
~->~
    .
...
<*> \def~{~.}~

ЛАТЕКС:

\end\end

Результаты в:

! TeX capacity exceeded, sorry [input stack size=5000].
\end #1->\csname end#1
                      \endcsname \@checkend {#1}\expandafter \endgroup \if@e...
<*> \end\end
42
ответ дан 2 revs, 2 users 64% 23 November 2019 в 21:27
поделиться

Каждой задаче нужен правильный инструмент. Встретьтесь ТАК Переполнение язык, оптимизированный для создания переполнений стека:

so
55
ответ дан Konrad Rudolph 23 November 2019 в 21:27
поделиться

C#:

public int Foo { get { return Foo; } }
77
ответ дан 2 revs, 2 users 80% 23 November 2019 в 21:27
поделиться

PIC18

ответ PIC18, данный TK, приводит к следующим инструкциям (двоичный файл):

overflow
   PUSH
   0000 0000 0000 0101
   CALL overflow
   1110 1100 0000 0000
   0000 0000 0000 0000

Однако один только ВЫЗОВ выполнит переполнение стека:

CALL $
1110 1100 0000 0000
0000 0000 0000 0000

Меньший, более быстрый PIC18

, Но RCALL (относительный вызов) меньше все еще (не глобальная память, таким образом, никакая потребность в дополнительных 2 байтах):

RCALL $
1101 1000 0000 0000

, Таким образом, самой маленькой на PIC18 является единственная инструкция, 16 битов (два байта). Это взяло бы 2 командных цикла на цикл. В 4 тактах на командный цикл у Вас есть 8 тактов. PIC18 имеет 31 стопку уровня, поэтому после 32-го цикла, он переполнит стека в 256 тактах. На уровне 64 МГц Вы были бы переполнять стека за 4 микро секунды и 2 байта .

PIC16F5x (еще меньший и быстрее)

Однако серия PIC16F5x использует инструкции на 12 битов:

CALL $
1001 0000 0000

Снова, два командных цикла на цикл, 4 часов на инструкцию так 8 тактов на цикл.

Однако PIC16F5x имеет две стопки уровня, таким образом, на третьем цикле он переполнился бы в 24 инструкциях. На уровне 20 МГц это было бы переполнение за 1,2 микро секунды и 1,5 байта .

Intel 4004

Intel 4004 имеет инструкцию по подпрограмме вызова на 8 битов:

CALL $
0101 0000

Для любопытного, которое соответствует ASCII 'P'. С 3 стопками уровня, которые берут 24 такта для в общей сложности [1 123] 32,4 микро секунды и один байт . (Если Вы не разгоняетесь, Ваши 4004 - продвигаются, Вы знаете, что хотите.)

, Который является столь же маленьким как ответ befunge, но очень, намного быстрее, чем код befunge, работающий в текущих интерпретаторах.

113
ответ дан Community 23 November 2019 в 21:27
поделиться

Мой лучший ток (в x86 блоке):

push eax
jmp short $-1

, который приводит к 3 байтам объектного кода (50 EB FD). Для 16-разрядного кода это также возможно:

call $

, который также приводит к 3 байтам (E8 FD FF).

119
ответ дан Chris Jester-Young 23 November 2019 в 21:27
поделиться

Nemerle:

Это катастрофические отказы компилятор с StackOverflowException:

def o(){[o()]}
159
ответ дан 2 revs 23 November 2019 в 21:27
поделиться

Вы могли также попробовать это в C#.net

throw new StackOverflowException();
174
ответ дан GateKiller 23 November 2019 в 21:27
поделиться

Считайте эту строку и сделайте то, что она говорит дважды .

291
ответ дан 2 revs 23 November 2019 в 21:27
поделиться

жемчуг в 12 символах:

$_=sub{&$_};&$_

избейте 10 символов (пространство в функции важно):

i(){ i;};i
11
ответ дан 2 revs 23 November 2019 в 21:27
поделиться

Скажите, пожалуйста, что означает аббревиатура « GNU ».

15
ответ дан 23 November 2019 в 21:27
поделиться

Ура, переполнение!

//              v___v
let rec f o = f(o);(o)
//             ['---']
//             -"---"-
57
ответ дан 23 November 2019 в 21:27
поделиться
Другие вопросы по тегам:

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