El código más corto que genera un SIGSEGV


Respuestas:


113

C, 5 caracteres

main;

Es una declaración variable: el inttipo está implícito (característica copiada del lenguaje B) y 0es el valor predeterminado. Cuando se ejecuta, esto intenta ejecutar un número (los números no son ejecutables) y causa SIGSEGV.

Pruébalo en línea!


55
@ Macmade: En realidad, lo es 0. staticLas variables comienzan como 0, y main;es static, como lo declaré fuera de la función. c-faq.com/decl/initval.html
Konrad Borowski

16
la última vez que jugué con esto, descubrí que hay una razón diferente para el segfault. En primer lugar, al llamar a main, saltas a la ubicación de main, no al valor, otra cosa es mainun int, se encuentra en .bss, generalmente las funciones se encuentran en .text, cuando el kernel carga el programa elf crea una página ejecutable para .texty no -ejecutable para .bss, por lo que al llamar a main, saltas a una página no ejecutable, y ejecutar algo en esa página es un error de protección.
mniip

23
Sí, los valores predeterminados en C son más o menos los predeterminados: P
Paul Draper

1
main __attribute__((section(".text#")))=0xc3;FTFY (al menos parece volver sin fallar en mi x86).
jozxyqk

2
@jozxyqk o más corto, const main=195;. Tan interesante es que está funcionando, el objetivo de este desafío de golf de código fue hacer que el código sea predeterminado, no funciona :).
Konrad Borowski el

74

Bash, 11      

kill -11 $$

44
Señal 11 en 11 caracteres. Parece legitimo.
nyuszika7h

12
@ nyuszika7h Iba a votar tu comentario, pero ahora tienes 11 votos a favor, así que lo dejaré así. : P
HyperNeutrino

3
@AlexL. otras personas parecen haber estropeado eso :(
theonlygusti

2
@theonlygusti Sí ... Eso es muy malo. :( Bueno, entonces puedo votarlo ahora.
HyperNeutrino

2
¡Hasta 42 votos a favor, sin toques!
seadoggie01

39

Ensamblaje (Linux, x86-64), 1 byte

RET

Este código es por defecto.


77
Como un archivo MSDOS .com, se ejecuta y finaliza sin error.
JB

10
Mi punto es: simplemente especificar "ensamblaje" no es suficiente para que sea predeterminado.
JB

53
@JB: En MS DOS, sin programa jamás producir un fallo de segmentación. Esto se debe a que MS DOS se ejecuta en modo real donde la protección de memoria es inexistente.
celtschk

1
@celtschk IIRC NTVDM utilizará direcciones inexistentes y aquellas no asignadas a MS-DOS.
ζ--

2
@celtschk: De todos modos, puede segfaultlo así: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] -> CPU eleva el SEGV subyacente (AFAIK, sin embargo, no hay nadie para manejarlo).
Joshua

26

Pitón 2, 13

exec'()'*7**6

Windows informa un código de error de c00000fd (desbordamiento de pila) que supongo que es un subtipo de falla de segmentación.

Gracias a Alex A. y Mego, se confirma que también causa fallas de segmentación en sistemas Mac y Linux. Python es el lenguaje de elección para bloquear sus programas de forma portátil.


77
Segmentation fault: 11en Mac
Alex A.

77
Segmentation fault (core dumped)en Linux
Mego

¿Esto cuelga primero?
Mega Man

1
@MegaMan Como en tomar mucho tiempo para terminar? No, 7 ** 6 es solo alrededor de 100K, por lo que no hay un retraso perceptible.
feersum

¿Por qué funciona esto? No parece en Python 3.6.8 en Mac OS.
Max Gasner

22

pdfTeX (51)

\def~#1{\meaning}\write0{\expandafter~\string}\bye

En realidad, esto es probablemente un error , pero no está presente en el TeX original, escrito por Knuth: compilar el código en tex filename.texlugar de pdftex filename.texno produce un defecto de seguridad.



17

Python, 33 caracteres

>>> import ctypes;ctypes.string_at(0)
Segmentation fault

Fuente: http://bugs.python.org/issue1215#msg143236

Python, 60 caracteres

>>> import sys;sys.setrecursionlimit(1<<30);f=lambda f:f(f);f(f)
Segmentation fault

Fuente: http://svn.python.org/view/python/trunk/Lib/test/crashers/recursive_call.py?view=markup

Esta es la versión de Python que estoy probando:

Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin

En general, el intérprete de Python es difícil de bloquear, pero lo anterior es abuso selectivo ...


16

Adelante - 3 personajes

0 @

( @es una búsqueda)


1
El más corto hasta ahora que funcionará en sistemas modernos.
Demi

2
¿Cuál adelante? Gforth solo dice "Dirección de memoria inválida"
gato

15

C, 18

main(){raise(11);}

¿necesita agregar #include <signal.h> en la lista de códigos?
Florian Castellane

55
@FlorianCastellane: en C90 y versiones inferiores, para cualquier llamada de función realizada sin una declaración visible, el compilador lo declara implícitamente como int func(). es decir, una función que regresa int, tomando parámetros no especificados. En este caso, raiseuna función devuelve int, toma un argumento int, por lo que funciona (incluso si el compilador se queja).
Hasturkun

14

Perl (<5.14), 9 caracteres

/(?{??})/

En 5.14, el motor regex se hizo reentrante para que no pudiera estrellarse de esta manera, pero 5.12 y anteriores se volverán a fallar si intenta esto.


Puedo reproducir esto en Perl 5.14 (Debian) y 5.18 (Arch Linux). sprunge.us/RKHT
nyuszika7h

Reproducido con Perl v5.20.2 (windows)
mehi

14

W32 .com ejecutable - 0 bytes

Esto parecerá extraño, pero en sistemas Windows de 32 bits, la creación y ejecución de un archivo .com vacío puede causar un defecto, dependiendo de ... algo. DOS simplemente lo acepta (el 8086 no tiene administración de memoria, no hay segmentos significativos para fallar), y Windows de 64 bits se niega a ejecutarlo (x86-64 no tiene modo v86 para ejecutar un archivo .com).


13

brainfuck (2)

<.

Sí, esto depende de la implementación. SIGSEGV es el resultado probable de un buen compilador.


44
¿Cómo es un compilador que falla en ese "bien"? Eso no <debería tener ningún efecto o envolverse.
nyuszika7h

12
Producir inmediatamente un error de tiempo de ejecución en la violación de límites es mejor porque le permite al programador encontrar y corregir el error lo más rápido posible. Dejar que el programa con errores se ejecute por un tiempo y corromper la memoria al azar antes de fallar hace que el problema sea más difícil de diagnosticar. Prevenir el choque por completo, como sugiere, es peor; el programador puede hacer que el programa "funcione" y luego ser humillado públicamente cuando falla en compiladores e intérpretes estándar.
Daniel Cristofani

1
Por el contrario, la captura de violaciones de límites antes del tiempo de ejecución no es posible en general, ni especialmente útil en los casos en que es posible. Producir un error de tiempo de ejecución más descriptivo estaría bien, pero hacer que el sistema operativo lo detecte como un defecto predeterminado es excelente porque no tiene ningún costo de velocidad. (En caso de que no esté claro, el compilador en sí mismo no falla de manera predeterminada, produce ejecutables que se desactivan tan pronto como intentan acceder a la memoria fuera de los límites).
Daniel Cristofani

44
¿Puede proporcionar una implementación que produzca este comportamiento y que se haya creado antes de publicar este desafío? Si no, esta respuesta no es válida.
Mego

1
Los controles de límites son específicos de la implementación, por lo que estoy seguro de que hay algunos que podrían generar errores. Sin embargo, ¿algún SIGSEGV? Lo dudo. Sin embargo, hay una gran cantidad de programas que dependen del ajuste de la matriz a la izquierda. Puede ser bastante conveniente tener almacenamiento cultivable en ambos lados.
captncraig

12

Haskell, 31

foreign import ccall main::IO()

Esto produce un defecto de seguridad cuando se compila con GHC y se ejecuta. No se necesitan indicadores de extensión, ya que la interfaz de función externa está en el estándar Haskell 2010.


10

C - 11 (19) 7 (15) 6 (14) 1 caracteres, ensamblador AT&T x86 - 8 (24) caracteres

La versión C es:

*(int*)0=0;

El programa completo (no del todo compatible con ISO, supongamos que es K&R C) tiene 19 caracteres de longitud:

main(){*(int*)0=0;}

Variante de ensamblador:

orl $0,0

El programa completo tiene 24 caracteres (solo para evaluación, ya que en realidad no es ensamblador):

main(){asm("orl $0,0");}

EDITAR :

Un par de variantes C. El primero usa la inicialización cero de la variable de puntero global:

*p;main(){*p=0;}

El segundo usa recursión infinita:

main(){main();}

La última variante es la más corta: 7 (15) caracteres.

EDITAR 2 :

Se inventó una variante más que es más corta que cualquiera de las anteriores: 6 (14) caracteres. Se supone que las cadenas literales se colocan en un segmento de solo lectura.

main(){*""=0;}

EDITAR 3 :

Y mi último intento - 1 personaje de largo:

P

Solo compílalo así:

cc -o segv -DP="main(){main();}" segv.c

3
en C no es principal; solo 5 personajes
Arya

1
: Linker no comprueba si main es funcional o no. Simplemente lo pasa al cargador y devuelve sigsegv
Arya

1
@FUZxxl En este caso maines una variable int global inicializada en cero, por lo que lo que obtenemos es el resultado de intentar ejecutar algunos bytes cero. En x86 sería algo así como add %al,(%rax)una instrucción perfectamente válida que intenta alcanzar la memoria en la dirección almacenada %rax. Las posibilidades de tener una buena dirección son mínimas.
Alexander Bakulin

66
Por supuesto, la última entrada se puede usar para todo, solo tiene que proporcionar los argumentos correctos del compilador. Lo que debería convertirlo en el ganador automático de cualquier concurso de golf de código. :-)
celtschk

55
Por lo general, los indicadores del compilador que no sean los que eligen la versión de idioma que se utilizará se cuentan para el total.
Jerry Jeremiah

9

dc - 7 caracteres

[dx0]dx

provoca un desbordamiento de pila


Es obras, pero ¿puedes elaborar? ¿Por qué se comporta de esa manera?
Stéphane Gourichon el

2
[dx0]se almacena dx0en la pila, luego dduplica el elemento de la pila superior, luego xsaca el elemento de la pila superior ( dx0) y lo ejecuta. Lo que duplica el elemento de la pila superior y comienza a ejecutarlo ... 0debe estar allí para evitar que esto sea una llamada de cola, por lo que todos se acumulan.
Ben Millwood el

8

Perl, 10/12 caracteres

Una solución ligeramente engañosa es afeitarse un char del truco de Joey Adams :

kill 11,$$

Sin embargo, para obtener un verdadero defecto en Perl, unpack pes la solución obvia:

unpack p,1x8

Técnicamente, esto no está garantizado como segfault, ya que la dirección 0x31313131 (o 0x3131313131313131 en sistemas de 64 bits) podría apuntar al espacio de direcciones válido por casualidad. Pero las probabilidades están en contra. Además, si alguna vez se transfiere Perl a plataformas donde los punteros tienen más de 64 bits, x8será necesario aumentarlo.


1
¿Qué es esta 1x8cosa?
Hannes Karppila

@HannesKarppila Es una forma corta de escribir"11111111".
Ilmari Karonen

8

Python 33

import os
os.kill(os.getpid(),11)

Envío de señal 11 (SIGSEGV) en python.


2
También 33 personajes: from os import*ykill(getpid(),11)
Timtech

8

OCaml, 13 bytes

Obj.magic 0 0

Esto usa la función Obj.magic, que coacciona inseguramente dos tipos. En este caso, coacciona 0 (almacenado como el valor inmediato 1, debido al bit de etiqueta utilizado por el GC) a un tipo de función (almacenado como un puntero). Por lo tanto, intenta desreferenciar la dirección 1, y eso, por supuesto, será por defecto.


1
it coerces 0 (stored as the immediate value 1)- ¿Por qué se almacena 0 como 1?
Skyler

1
@Skyler ver edición
Demi

1
Obj.magic()0es un char más corto :)
Ben Millwood

8

Bash, 4 bytes

Golfed

. $0

Incluya recursivamente el guión en sí mismo.

Explicado

La operación recursiva "fuente" (.) Provoca un desbordamiento de la pila, y como Bash no se integra con libsigsegv , esto da como resultado un SIGSEGV.

Tenga en cuenta que esto no es un error, sino un comportamiento esperado, como se discute aquí .

Prueba

./bang 
Segmentation fault (core dumped)

¡Pruébelo en línea!


8

En realidad , 17 16 11 10 9 bytes

⌠[]+⌡9!*.

Pruébalo en línea!

Si lo anterior no falla, intente aumentar el número (los números de varios dígitos se especifican en En realidad con dos puntos iniciales)

Bloquea el intérprete al explotar un error en Python que involucra itertools.chainobjetos profundamente anidados , que en realidad usa para implementar el +operador.


7

C # - 62

System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);

Editar: 23

unsafe{int i=*(int*)0;}

Debe compilarse con / inseguro para que este funcione. Por alguna razón que no entiendo, *(int*)0=0solo arroja una NullReferenceException, mientras que esta versión proporciona la infracción de acceso adecuada.


El int i=*(int*)0;devuelve una NullReferenceException para mí.
Peter Olson

Puede intentar acceder a una ubicación negativa, dar me gusta *(int*)-1=0y obtener una infracción de acceso.
Peter Olson

La excepción particular es justo en lo que el clr lo envuelve, y es insignificante. El sistema operativo en sí da la falla seg en todos estos casos.
captncraig

La razón por la que *(int*)0=0arroja una excepción probablemente se deba a la optimización. Específicamente, para evitar el costo de la comprobación null, el optimizador puede eliminar las comprobaciones nulas, pero cuando se produce una falla predeterminada, puede volver a generarla como un correcto NullReferenceException.
Konrad Borowski

7

PicoLisp - 4 caracteres

$ pil
: ('0)
Segmentation fault

Este es el comportamiento previsto. Como se describe en su sitio web:

Si algunos lenguajes de programación afirman ser la "navaja suiza de programación", entonces PicoLisp bien podría llamarse el "escalpelo de programación": agudo, preciso, pequeño y liviano, pero también peligroso en manos de los inexpertos.


7

F90 - 39 bytes

real,pointer::p(:)=>null()
p(1)=0.
end

Compilacion:

gfortran segv.f90 -o segv 

Ejecución:

./segv 

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
#0  0x7FF85FCAE777
#1  0x7FF85FCAED7E
#2  0x7FF85F906D3F
#3  0x40068F in MAIN__ at segv.f90:?
Erreur de segmentation (core dumped)

Materiales:

gfortran --version
GNU Fortran (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4

1
Bonito primer post.
Rɪᴋᴇʀ

6

19 caracteres en C

main(a){*(&a-1)=1;}

Daña el valor de la dirección de retorno de la función principal, por lo que obtiene un SIGSEGV al regresar de main.


Depende del diseño del marco de la pila, por lo que en algunas arquitecturas posiblemente no falle.
Alexander Bakulin

6

J (6)

memf 1

memfsignifica memoria libre, 1se interpreta como un puntero.


5

Cython, 14

Esto suele ser útil para fines de depuración.

a=(<int*>0)[0]

5

Conjunto Unix PDP-11, binario de 18 bytes, fuente de 7 bytes

(Esto se está convirtiendo en un tema para mí, tal vez porque es el único idioma que sé que nadie más aquí sabe).

inc(r0)

Aumenta el byte único direccionado por el valor inicial de r0 [que resulta ser 05162 según el depurador simh] al inicio del programa.

0000000 000407 000002 000000 000000 000000 000000 000000 000000
0000020 005210 000000

Y, como siempre, los bytes extraños al final se pueden eliminar con strip.

Hice algunos intentos para acortar la fuente, pero siempre terminé recibiendo un error de sintaxis o SIGBUS.


5

Matlab: ¡Sí, es posible!

En respuesta a una pregunta mía, a Amro se le ocurrió esta peculiaridad:

S = struct();
S = setfield(S, {}, 'g', {}, 0)

Proporcione la versión de Matlab: R2015B (y 2016B también) solo arroja un error: Error al usar setfield (línea 56) Se requiere al menos un índice.
Florian Castellane

@FlorianCastellane No es posible probar todas las versiones ahora, pero se ha confirmado que ofrece una falla predeterminada en algunas versiones, la última es 2014b y la primera 2012a.
Dennis Jaheruddin

5

Shell de JavaScript, 7 bytes

clear()

Borra absolutamente todo, no solo el alcance actual, lo que obviamente causa muchos errores que dan como resultado JS explotando y segfaulándose


Según MDN (document.clear), esto solo debería hacer algo en versiones realmente antiguas de Mozilla, e incluso entonces, ¿qué es lo que realmente daña tu experiencia?
tomsmeding

@tomsmeding esto es window.clear, FF directamente no lo revela, es un spidermonkey incorporado
Downgoat

5

Pyth, 3 personajes

j1Z

Esta sería la parte en la que explicaría cómo se me ocurrió esta respuesta, excepto que legítimamente no tengo idea . Si alguien pudiera explicarme esto, estaría agradecido.

Aquí está en un intérprete en línea.

Explicación

jcuadra la base y se llama recursivamente hasta que la base sea al menos tan grande como el número. Como la base es 0 , eso nunca sucede. Con un límite de recursión suficientemente alto, obtienes un segfault.

- Dennis ♦


Descubrí algo! De la navegación por la fuente de Pyth, he encontrado que este código hace jen 1y 0, que intenta convertir 1en la base 0. Por qué eso falla, no tengo idea ...
NoOneIsHere

1
Ver aquí . jcuadra la base y se llama recursivamente hasta que la base sea al menos tan grande como el número. Como la base es 0 , eso nunca sucede. Con un límite de recursión suficientemente alto, obtienes un segfault.
Dennis

@Dennis IDEone
NoOneIsHere

@SeeRhino El intérprete de Pyth establece el límite de recursión en 100,000. Al menos en TIO, eso es suficiente para un segfault.
Dennis
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.