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

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

Forth:

: a 1 recurse ; a

Внутренняя часть gforth интерпретатор:

: a 1 recurse ; a 
*the terminal*:1: Return stack overflow
: a 1 recurse ; a
                ^
Backtrace:

На Power Mac G4 при Открыть подсказке Firmware, это просто подвешивает машину.:)

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

В Lua:

function f()return 1+f()end f()

необходимо сделать что-то к результату рекурсивного вызова, или иначе оптимизация последнего вызова позволит ему циклично выполняться навсегда. Слабый для гольфа кода, но хороший иметь!

я предполагаю, что и долгие ключевые слова означают, что Lua не будет выигрывать гольф кода в ближайшее время.

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

Java (смущение):

public class SO 
{ 
  private void killme()
  {
    killme();
  }

  public static void main(String[] args) 
  { 
    new SO().killme(); 
  } 
}

РЕДАКТИРОВАНИЕ , Конечно, это может быть значительно сокращено:

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

как локальная переменная в функции C:

int x[100000000000];
4
ответ дан 2 revs, 2 users 50%stu 23 November 2019 в 21:27
поделиться

GWBASIC производится...

OK
10 i=0
20 print i;
30 i=i+1
40 gosub 20
run
 0  1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16  17  18  19  20  21
 22  23  24  25  26  27  28  29  30  31  32  33
Out of memory in 30
Ok

Не много глубины стека там:-)

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

c# снова:

class Foo { public Foo() {new Foo(); } }
1
ответ дан aku 23 November 2019 в 21:27
поделиться
/* In C/C++ (second attempt) */

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

Компиляция с:

gcc -D"a=main()" so.c

Расширяется до:

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

Если нет язык, где пустая программа вызывает переполнение стека, следующее должно быть самым коротким.

Befunge:

:

Дубликаты главное значение стека много раз.

редактирование: Patrick лучше. Заполнение стека с 1 с лучше, чем заполнение стека с 0s, так как интерпретатор мог оптимизировать продвижение 0s на пустой стек как нет.

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

Groovy (5B):

run()
2
ответ дан matyr 23 November 2019 в 21:27
поделиться

Haskell:

let x = x
print x
2
ответ дан mattiast 23 November 2019 в 21:27
поделиться

Ну, никто еще не упомянул Coldfusion, таким образом...

<cfinclude template="#ListLast(CGI.SCRIPT_NAME, "/\")#">

, Что oughta делают это.

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

В Пробеле я думаю:

Это, вероятно, не обнаружится.: /

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

Люди F#

продолжают спрашивать, "Для чего F# полезный?"

let rec f n =
    f (n)

производительность оптимизировала версию (перестанет работать быстрее:))

let rec f n =
    f (f(n))
2
ответ дан 2 revs 23 November 2019 в 21:27
поделиться

Lisp

(defun x() (x)) (x)
2
ответ дан Ozgur Ozcitak 23 November 2019 в 21:27
поделиться

CIL/MSIL :

loop: ldc.i4.0
br loop

Объектный код:

16 2B FD
2
ответ дан Cody Brocious 23 November 2019 в 21:27
поделиться
3
ответ дан Ramin 23 November 2019 в 21:27
поделиться

PIC18:

переполнение

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

Если Вы полагаете, что кадр вызова процесс и стек, чтобы быть Вашей машиной Unix, Вы могли полагать, что fork-бомба была параллель программа для создания условия переполнения стека. Попробуйте это число удара с 13 символами. Никакое сохранение в файл не необходимо.

:(){ :|:& };:
3
ответ дан user4010 23 November 2019 в 21:27
поделиться

В Irssi (на терминальном основанный клиент IRC, не "действительно" язык программирования), $L означает текущую командную строку. Таким образом, можно вызвать переполнение стека ("предел рекурсии максимума хита") с:

/eval $L
3
ответ дан Wouter Coekaerts 23 November 2019 в 21:27
поделиться

Примечание C#

class _{static void Main(){Main();}}

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

Для таланта, я сделал имя класса столь небольшим, как я мог.

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

Ruby, короче, чем другие до сих пор:

def a;a;end;a

(13 символов)

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

пакетная программа, названная call.cmd;

call.cmd

******  B A T C H   R E C U R S I O N  exceeds STACK limits ******
Recursion Count=1240, Stack Usage=90 percent
******       B A T C H   PROCESSING IS   A B O R T E D      ******
вызова
3
ответ дан tomdemuyt 23 November 2019 в 21:27
поделиться

В Схеме это заставит интерпретатор исчерпывать память:

(define (x)
  ((x)))

(x)
3
ответ дан Kyle Cronin 23 November 2019 в 21:27
поделиться

Ruby:

def s() s() end; s()
3
ответ дан dr_bonzo 23 November 2019 в 21:27
поделиться

C #

class Program
{
    class StackOverflowExceptionOverflow : System.Exception
    {
        public StackOverflowExceptionOverflow()
        {
            throw new StackOverflowExceptionOverflow();
        }
    }

    static void Main(string[] args)
    {
        throw new StackOverflowExceptionOverflow();
    }
}

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

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

PostScript, 7 символов

{/}loop

При запуске в GhostScript, выбрасывает это исключение:

GS>{/}loop
Error: /stackoverflow in --execute--
Operand stack:
   --nostringval--
Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   %loop_continue   1753   2   3   %oparray_pop   --nostringval--   --nostringval--   false   1   %stopped_push   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   %loop_continue
Dictionary stack:
   --dict:1150/1684(ro)(G)--   --dict:0/20(G)--   --dict:70/200(L)--
Current allocation mode is local
Last OS error: 11
Current file position is 8

Вот рекурсивная версия без использования переменных (51 chars):

[{/[aload 8 1 roll]cvx exec}aload 8 1 roll]cvx exec
2
ответ дан 23 November 2019 в 21:27
поделиться

Java:

class X{static{new X();}{new X();}}

Фактически вызывает переполнение стека при инициализации X-класса. Перед вызовом main () JVM должна загрузить класс, и когда это произойдет, она запускает любые анонимные статические блоки кода:

static {
  new X();
}

Который, как вы можете видеть, создает экземпляр X с использованием конструктора по умолчанию. JVM будет вызывать анонимные блоки кода еще до конструктора:

{
  new X();
}

Это рекурсивная часть.

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

Java: 35 символов

Думаю, уже поздно, но я все же опубликую свою идею:

class A{{new A();}static{new A();}}

Использование возможностей статического инициализатора и инициализатора экземпляра.

Вот вывод на моем компьютере (обратите внимание, что он показал два сообщения об ошибках):

Exception in thread "main" java.lang.StackOverflowError
    at A.<init>(A.java:1)
        ......
    at A.<init>(A.java:1)
Could not find the main class: A. Program will exit.

См. также: http://download.oracle.com/docs/cd/E17409_01/javase/tutorial/java/javaOO/initial.html

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

Сообщение об ошибке компилятора C++

template<int n>struct f{f<n+1>a;};f<0>::a;

вывод:

$ g++ test.cpp;
test.cpp:1: error: template instantiation depth exceeds maximum of 500 (use -ftemplate-depth-NN to increase the maximum) instantiating ‘struct f<500>’
test.cpp:1:   instantiated from ‘f<499>’
test.cpp:1:   instantiated from ‘f<498>’
......

Даже если компилятор прошел шаблон, будет следующая ошибка: отсутствует main.

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

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