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

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 ответ

в жемчуге:

`$0`

На самом деле, это будет работать с любой оболочкой, которая поддерживает синтаксис команды одинарной левой кавычки и хранит его собственное имя в $0

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

Я пытался сделать это в Erlang:

c(N)->c(N+1)+c(N-1).
c(0).

двойной вызов себя заставляет использование памяти повыситься O(n^2), а не O(n).

Однако интерпретатору Erlang, кажется, не удается отказать.

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

Труба:

Poke(0)
0
ответ дан Sean Cameron 23 November 2019 в 21:27
поделиться

JavaScript:

function i(){ i(); }
i();

<час> C++ Используя указатель функции:
int main(){
   int (*f)() = &main;
   f();
}
0
ответ дан 2 revs 23 November 2019 в 21:27
поделиться

C#, сделанный в 20 символах (exclusing пробел):

int s(){
    return s();
}
0
ответ дан GateKiller 23 November 2019 в 21:27
поделиться
int main(){
    int a = 20;
    return main();
}
0
ответ дан Agnel Kurian 23 November 2019 в 21:27
поделиться

C++ :

int overflow(int n)
{
    return overflow(1);
}
0
ответ дан Niyaz 23 November 2019 в 21:27
поделиться

Другой в JavaScript:

(function() { arguments.callee() })()
1
ответ дан 2 revs 23 November 2019 в 21:27
поделиться

В ответ на Y combinator комментарий, я мог бы также через в Y-combinator в ЛЫЖНОМ исчислении:

S (K (S I I)) (S (S (K S) K) (K (S I I)))

нет никаких ЛЫЖНЫХ интерпретаторов, о которых я знаю, но я однажды записал графический приблизительно за час в actionscript. Я был бы готов отправить, если существует интерес (хотя я никогда не добирался, расположение, работающее очень эффективно)

, читает все об этом здесь: http://en.wikipedia.org/wiki/SKI_combinator_calculus

1
ответ дан 2 revs, 2 users 95%Luke Sandberg 23 November 2019 в 21:27
поделиться

В Haskell

fix (1+)

Это пытается найти точку фиксации (1 +) функция (λ n → n + 1). Реализация фиксации

fix f = (let x = f(x) in x)

, Таким образом

fix (1+)

становится

(1+) ((1+) ((1+) ...))

Примечание что

fix (+1)

просто циклы.

1
ответ дан Jonas Kölker 23 November 2019 в 21:27
поделиться

Переполнение CMD в одной строке

echo @call b.cmd > b.cmd & b
1
ответ дан 2 revs, 2 users 89%Pablo 23 November 2019 в 21:27
поделиться

У меня есть список их в , Бесконечный цикл на E2 - видит просто тех обозначенных как "Переполнение стека" в заголовке.

я думаю самое короткое, там

[dx]dx

в dc. Может быть более короткое решение в Ложь .

РЕДАКТИРОВАНИЕ: По-видимому, это не работает... По крайней мере, на GNU dc. Возможно, это было на версии BSD.

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

Ложь:

[1] [1] #

(Ложь является языком стека: # является некоторое время циклом, который берет 2 закрытия, условное выражение и тело. Тело является тем, которое вызывает переполнение).

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

Короткое решение в K& R C, мог быть скомпилирован:

main(){main()}

14 байтов

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

Vb6


Public Property Let x(ByVal y As Long)
  x = y
End Property

Private Sub Class_Initialize()
  x = 0
End Sub
1
ответ дан Javier 23 November 2019 в 21:27
поделиться

Java (завершают содержание X.java):

class X {
public static void main(String[] args) {
    main(null);
}}

Рассмотрение всего синтаксического сахара, я задаюсь вопросом, может ли немного короче быть сделан в Java. Кто-либо?

РЕДАКТИРОВАНИЕ: ой, я отсутствовал уже существует почти идентичное отправленное решение.

РЕДАКТИРОВАНИЕ 2: я сказал бы, что этот - (мудрый символ) самое короткое

class X{public static void main(String[]a){main(null);}}

РЕДАКТИРОВАНИЕ 3: Благодаря Anders для указания на пустой указатель не оптимальный аргумент, таким образом, это короче, чтобы сделать:

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

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

(a=lambda{a.call}).call
1
ответ дан RFelix 23 November 2019 в 21:27
поделиться

не будет самым коротким, но я должен был попробовать что-то... Строка C#

[] f = новая строка [0]; Основной (f);

бит короче

static void Main(){Main();}
1
ответ дан 3 revs 23 November 2019 в 21:27
поделиться

$f PowerShell

= {& $f}; & $f

"Сценарий перестал работать должный назвать переполнение глубины. Глубина вызова достигла 1001, и максимум 1000".

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

TCL:

proc a {} a

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

proc a {} "a;a"
1
ответ дан Joseph Bui 23 November 2019 в 21:27
поделиться

В ассемблере (x86 процессоры, режим на 16 или 32 бита):


call $

, который генерирует:

  • в режиме на 32 бита: 0xe8; 0xfb; 0xff; 0xff; 0xff

  • в режиме на 16 битов: 0xe8; 0xfd; 0xff

в C/C++:


int main( ) {
  return main( );
}
1
ответ дан botismarius 23 November 2019 в 21:27
поделиться

so.c в 15 символов :

main(){main();}

Результат:

antti@blah:~$ gcc so.c -o so
antti@blah:~$ ./so
Segmentation fault (core dumped)

Редактирование : Хорошо, это дает предупреждения с - Стена и не вызывает переполнение стека с-O2. Но это работает!

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

Решение для сценария оболочки в 10 символов включая новые строки:

ну, технически не переполнение стека, но логически так, если Вы рассматриваете порождение нового процесса как построение нового стекового фрейма.

#!sh
./so

Результат:

antti@blah:~$ ./so
[disconnected]

Возгласы.Примечание: не пробуют это дома

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

JavaSript:

Huppies отвечают на одну строку:

(function i(){ i(); })()

То же количество символов, но никакая новая строка:)

1
ответ дан Leo Lännenmäki 23 November 2019 в 21:27
поделиться

Уже был жемчуг один, но это - пара символов короче (9 по сравнению с 12) - и это не рекурсивно вызывает:)

с//* _ = 0/e

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

Завершите программу Дельфи.

program Project1;
{$APPTYPE CONSOLE}
uses SysUtils;

begin
  raise EStackOverflow.Create('Stack Overflow');
end.
1
ответ дан JosephStyons 23 November 2019 в 21:27
поделиться

Лучшее решение lua:

function c()c()end;

Вставьте это в SciTE или интерактивную командную строку, а затем назови это. Бум!

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

GNU make:

Создайте файл с именем «Makefile» со следующим содержимым:

a:
    make

Затем запустите make:

$ make

Обратите внимание, что для смещения слова «make» необходимо использовать символ табуляции. Этот файл состоит из 9 символов, включая 2 символа конца строки и 1 символ табуляции.

Я полагаю, вы могли бы сделать то же самое с bash, но это, вероятно, слишком просто, чтобы быть интересным:

Создайте имя файла «b» и отметьте его как исполняемый (chmod + xb):

b ## ties the winning entry with only one character (does not require end-of-line)

Теперь запустите файл with

$ ( PATH=$PATH:. ; b )

Трудно сказать, приводит ли этот подход технически к переполнению стека, но он создает стек, который будет расти до тех пор, пока на машине не закончатся ресурсы. Самое интересное в том, чтобы сделать это с помощью GNU make, это то, что вы можете наблюдать, как он выводит информацию о статусе по мере сборки и уничтожения стека (при условии, что вы нажали ^ C в какой-то момент до того, как произойдет сбой).

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

PHP - рекурсивная аббревиатура

1
ответ дан 23 November 2019 в 21:27
поделиться
1
ответ дан 23 November 2019 в 21:27
поделиться
Другие вопросы по тегам:

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