编写一个程序,该程序会引发StackOverflow错误或所用语言的等效语言。例如,在Java中,程序应抛出java.lang.StackOverflowError
。
您不允许定义一个调用自身或新类的函数(main
java中包含的类除外)。它应该使用所选编程语言的类。
并且它不应显式抛出错误。
def s{def t=s;t}
吗?
编写一个程序,该程序会引发StackOverflow错误或所用语言的等效语言。例如,在Java中,程序应抛出java.lang.StackOverflowError
。
您不允许定义一个调用自身或新类的函数(main
java中包含的类除外)。它应该使用所选编程语言的类。
并且它不应显式抛出错误。
def s{def t=s;t}
吗?
Answers:
import sys
sys.setrecursionlimit(1)
此操作本身成功完成,但是脚本和交互都会因此而立即抛出RuntimeError: 'maximum recursion depth exceeded'
。
受elssar的回答启发。
Compute 70000.
70000
只是S (S ( ... (S O) ...))
70000 S
的语法糖。我认为是导致堆栈溢出的类型检查器。
这是在执行命令之前打印的警告:
Warning: Stack overflow or segmentation fault happens when working with large
numbers in nat (observed threshold may vary from 5000 to 70000 depending on
your system limits and on the command executed).
class S{static{new S();}{new S();}}
public static void main
在那里看不到。还是我只是不懂Java?
浏览器相关的答案(必须有权访问apply
):
eval.apply(0,Array(999999))
eval
是我能找到的最短的全局函数名称(有人知道哪个更短吗?)apply
允许我们将数组转换为函数参数,第一个参数是函数的上下文(this
)Array(999999)
将使用列出的长度创建一个数组。不确定参数的最大数量是多少,但小于此数量且大于99999
IE9:
SCRIPT28: Out of stack space
SCRIPT2343: Stack overflow at line: 20
Chrome 24:
Uncaught RangeError: Maximum call stack size exceeded
火狐18
RangeError: arguments array passed to Function.prototype.apply is too large
注意 —由于javascript的单线程性质,无限循环最终会锁定UI并永远不会引发异常。
while(1);
for(;;);
这些都不符合。
更新 -这将删除三个字符:
eval.apply(0,Array(1e7))
eval
是最短的。
eval.apply(0,Array(1e6))
节省了3个字符,你甚至可以去9e9
无成本
apply
是标准的ECMAScript功能。没有任何依赖于浏览器的内容。除非你是在谈论真的老的浏览器,但这不是在假想的Netscape 2一起工作apply
,无论如何,因为Array
类不会在Netscape 2.存在
eval(...Array(9e9))
dir.apply(0,Array(1e7));
exec('{'*99)
导致«s_push:解析器堆栈溢出»
SyntaxError: unexpected EOF while parsing
exec('{'*101)
我一起MemoryError
exec
是一条语句,因此您可以使用exec'{'*999
(99似乎还不够)
x=2x
$ RecursionLimit :: reclim:递归深度超过1024。>>
Clojure,12个字符
(#(%%)#(%%))
在repl中运行:
user=> (#(%%)#(%%))
StackOverflowError user/eval404/fn--407 (NO_SOURCE_FILE:1)
(\x.xx)(\x.xx)
,但是我不太了解clojure来确定这是否正在发生。我也看不出为什么前面提到的表达式会导致堆栈溢出,所以也许您在使用Y-combinator做一些骗术?这个答案让我很感兴趣,一个解释会很好。
我认为这符合“禁止自我调用方法”规则的精神。它没有明确地执行此操作,甚至通过Java语言构造完成。
public class S {
public String toString() {
return ""+this;
}
public static void main(String[] a) {
new S().toString();
}
}
精简版:
public class S{public String toString(){return ""+this;}public static void main(String[] a){new S().toString();}}
""+this
实际上是""+this.toString()
,因此该方法会自行调用。
StringBuilder
那里抛出了一个对象。toString
可能会从那里被调用。
toString()
方法最终成为public java.lang.String toString() { return this.toString(); }
main(){int i[~0u];}
main.c:1:16: error: size of array 'i' is negative
为我提供了gcc 4.8.1。未签名的版本main(){int i[~0U];}
有效。
sizeof(i)
则为16GB。使用ul
或ull
后缀有区别吗?某些系统过量使用内存,并且只有在写入内存后才会崩溃。
{]}333*`
结果:
$ golfscript.rb overflow.gs
golfscript.rb:246:in `initialize': stack level too deep (SystemStackError)
from /home/pjt33/bin/golfscript.rb:130:in `new'
from /home/pjt33/bin/golfscript.rb:130:in `ginspect'
from /home/pjt33/bin/golfscript.rb:130:in `ginspect'
from /home/pjt33/bin/golfscript.rb:130:in `map'
from /home/pjt33/bin/golfscript.rb:130:in `ginspect'
from /home/pjt33/bin/golfscript.rb:130:in `ginspect'
from /home/pjt33/bin/golfscript.rb:130:in `map'
from /home/pjt33/bin/golfscript.rb:130:in `ginspect'
... 993 levels...
from (eval):4
from /home/pjt33/bin/golfscript.rb:293:in `call'
from /home/pjt33/bin/golfscript.rb:293:in `go'
from /home/pjt33/bin/golfscript.rb:485
基本上,这会创建一个高度嵌套的数据结构,然后在尝试将其转换为字符串时溢出堆栈。
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ [[[[[[[[[[[[[""]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] ]]]]]]]]]]]]]]]]] (and so on, output too long for comments)
333
它将中断。333
对于我来说,这是最小的值,但是,如果您使用的是其他版本的Ruby(就我所知,也许是同一版本,也可能是其他操作系统上的同一版本),那么它在溢出之前可能会处理不同数量的堆栈帧。
6.?
仍然可以正常运行而无需添加字符。
db"Pëý"
“Pëý”是十六进制的50 EB FD,并且
_loop:
push eax
jmp _loop
在x86汇编中。
eval"[]"*9e3
给
SystemStackError: stack level too deep
大概与系统有关,但是您可以通过增加最后一位来增加数量级(不建议)。
编辑以进行解释:与其他一些示例类似,这将创建一个[][][]
...重复9000次的字符串,然后对其进行求值:最右边的字符串[]
被解析为对其余部分的函数调用,依此类推。如果它真的开始,它将抛出ArgumentError,因为它[]
是一个带有[]
需要一个参数的方法的对象,但是我的机器在堆栈超过九千之前抛出了一个错误。
ruby
1.9.2引发“ ArgumentError:参数数量错误(1..2为0)”。
ruby
1.8.7。此处发布的代码按说明工作。
def f;f;end;f
do s:[do s]
产量:
>> do(s:[do s])
** Internal error: stack overflow
** Where: do do do do do do do do do do do do do do do do
do do do do do do do do do do do do do do do do do do do
do do do do do do do do do do do do do do do do do do do
do do do do do do do do do do do do do do do do do do do
do do do do do do do do do do do do do do do do do do do
do do do do do do do do do do do do do do do do do do do
do do do do do do do do do do do do do do do do do do do
do do do do do do do do do do do do do do do do do do do
do do do do do do do do do do do do do do do do do do do
do do do do do do do do do do do do do do do do do do do
do do do do do do do do do do do do...
尽管Rebol具有功能,闭包和对象……但这并未定义任何功能。它定义了一个数据结构,在使用“按数据编码”范例中,可以使用DO将其视为代码。
我们可以使用REPL来探讨“什么是S”的问题:
>> s: [do s]
== [do s]
>> type? s
== block!
>> length? s
== 2
>> type? first s
== word!
>> type? second s
== word!
不要将其转换为函数,它会在结构上的当前环境中调用评估程序。
main(){for(;;)*(int*)alloca(1)=0;}
alloca(1)
,基本上已翻译成sub $1, %esp
这样,因此不会触及堆栈。
#1='#1#
#1=(#1#)
用于终端机和(print #1=(#1#))
,但您的解决方案要好得多。
在这种“语言”中很难计算字节数/令牌数-我已经给出了所需的按键次数,但不包括Shift,Alpha(第二个Shift键),=
最后还有-每次按键当然适合1字节。
在fx-85GT PLUS模型上进行了测试,该模型是标准的,非图形化的“非可编程”科学计算器。其他型号也可以使用。
只需堆叠11个立方根:
3√ 3√ 3√ 3√
3√ 3√ 3√ 3√
3√ 3√ 3√
它甚至没有给出关于平方根下缺少数字的语法错误。
这似乎不适用于平方根。
或者,重复cos(31次。
Stack ERROR
[AC] :Cancel
[<][>]:Goto
我相信这可以视为堆栈溢出。堆栈似乎很小...
(((((((((((((((((((((((((
BEGIN 1 AGAIN
溢出值堆栈
: X X ; X
(9)必须溢出返回堆栈
:
... ;
字定义中。至少要添加6个字符,再加上至少2个字符才能作为程序执行。您也许可以缩短时间,但这是一个示例:: F BEGIN 1 AGAIN ; F
。我之所以建议这样做,是因为该问题询问:“编写程序”。无论如何,无论字符数如何,您都可以为Forth投票!:-)
{1}loop
例如。
$ gsnd
GPL Ghostscript 9.06 (2012-08-08)
Copyright (C) 2012 Artifex Software, Inc. All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
GS>{1}loop
Error: /stackoverflow in 1
Operand stack:
--nostringval--
Execution stack:
%interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- %loop_continue --nostringval-- --nostringval-- false 1 %stopped_push .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- %loop_continue
Dictionary stack:
--dict:1168/1684(ro)(G)-- --dict:0/20(G)-- --dict:77/200(L)--
Current allocation mode is local
Last OS error: No such file or directory
Current file position is 8
GS<1>
for($n=1e5;$n--;)$a=(object)[$a];
当嵌套的stdClass对象被自动销毁时,这会导致堆栈溢出:
$ gdb -q php
Reading symbols from /usr/bin/php...(no debugging symbols found)...done.
(gdb) set pagination 0
(gdb) r -nr 'for($n=1e5;$n--;)$a=(object)[$a];'
Starting program: /usr/bin/php -nr 'for($n=1e5;$n--;)$a=(object)[$a];'
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Program received signal SIGSEGV, Segmentation fault.
0x00000000006debce in zend_objects_store_del_ref_by_handle_ex ()
(gdb) bt
#0 0x00000000006debce in zend_objects_store_del_ref_by_handle_ex ()
#1 0x00000000006dee73 in zend_objects_store_del_ref ()
#2 0x00000000006a91ca in _zval_ptr_dtor ()
#3 0x00000000006c5f78 in zend_hash_destroy ()
#4 0x00000000006d909c in zend_object_std_dtor ()
#5 0x00000000006d9129 in zend_objects_free_object_storage ()
#6 0x00000000006dee53 in zend_objects_store_del_ref_by_handle_ex ()
#7 0x00000000006dee73 in zend_objects_store_del_ref ()
#8 0x00000000006a91ca in _zval_ptr_dtor ()
#9 0x00000000006c5f78 in zend_hash_destroy ()
#10 0x00000000006d909c in zend_object_std_dtor ()
#11 0x00000000006d9129 in zend_objects_free_object_storage ()
[...]
#125694 0x00000000006dee53 in zend_objects_store_del_ref_by_handle_ex ()
#125695 0x00000000006dee73 in zend_objects_store_del_ref ()
#125696 0x00000000006a91ca in _zval_ptr_dtor ()
#125697 0x00000000006c5f78 in zend_hash_destroy ()
#125698 0x00000000006d909c in zend_object_std_dtor ()
#125699 0x00000000006d9129 in zend_objects_free_object_storage ()
#125700 0x00000000006dee53 in zend_objects_store_del_ref_by_handle_ex ()
#125701 0x00000000006dee73 in zend_objects_store_del_ref ()
#125702 0x00000000006a91ca in _zval_ptr_dtor ()
#125703 0x00000000006c4945 in ?? ()
#125704 0x00000000006c6481 in zend_hash_reverse_apply ()
#125705 0x00000000006a94e1 in ?? ()
#125706 0x00000000006b80e7 in ?? ()
#125707 0x0000000000657ae5 in php_request_shutdown ()
#125708 0x0000000000761a18 in ?? ()
#125709 0x000000000042c420 in ?? ()
#125710 0x00007ffff5b6976d in __libc_start_main (main=0x42bf50, argc=3, ubp_av=0x7fffffffe738, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe728) at libc-start.c:226
#125711 0x000000000042c4b5 in _start ()
一堆相同的样式:
(lambda x:x(x))(lambda y:y(y))
(function(x){x(x)})(function(y){y(y)})
(function(x) x(x) end)(function(y) y(y) end)
x=lambda y:y(y);x(x)
中较短(20个字符)。此函数不是递归的。x调用作为参数传递给它的任何函数。
->x{x[x]}[->y{y[y]}]
#@#&[#@#&]
32:吸气剂可以使您的机器在C#中变得容易:
public int a{get{return a;}}
public int a {get{return a;}}
int a { get { return a; } }
(1)DO(1)NEXT
NEXT
是INTERCAL的子程序调用版本(或者至少是您可以得到的最接近的版本)。它将当前位置推入NEXT
堆栈并跳转到给定标签。
但是,如果NEXT
堆栈长度超过80,您将获得堆栈溢出的INTERCAL版本:
ICL123I PROGRAM HAS DISAPPEARED INTO THE BLACK LAGOON
ON THE WAY TO 1
CORRECT SOURCE AND RESUBNIT
请注意,尽管我将标签main
用作跳转目标,但这不是递归函数。
.globl main
main:push $0;jmp main
dd 0fdeb60
10个字符!