Escriba el código más corto que genera una falla de segmentación (SIGSEGV) en cualquier lenguaje de programación.
75
Escriba el código más corto que genera una falla de segmentación (SIGSEGV) en cualquier lenguaje de programación.
Respuestas:
C, 5 caracteres
Es una declaración variable: el
int
tipo está implícito (característica copiada del lenguaje B) y0
es el valor predeterminado. Cuando se ejecuta, esto intenta ejecutar un número (los números no son ejecutables) y causaSIGSEGV
.Pruébalo en línea!
fuente
0
.static
Las variables comienzan como0
, ymain;
esstatic
, como lo declaré fuera de la función. c-faq.com/decl/initval.htmlmain
un 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.text
y 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.main __attribute__((section(".text#")))=0xc3;
FTFY (al menos parece volver sin fallar en mi x86).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 :).Bash, 11
fuente
Ensamblaje (Linux, x86-64), 1 byte
Este código es por defecto.
fuente
Pitón 2, 13
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.
fuente
Segmentation fault: 11
en MacSegmentation fault (core dumped)
en LinuxpdfTeX (51)
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.tex
lugar depdftex filename.tex
no produce un defecto de seguridad.fuente
LOLCODE, 4 bytes
No funciona en línea, solo en el intérprete C.
fuente
Python, 33 caracteres
Fuente: http://bugs.python.org/issue1215#msg143236
Python, 60 caracteres
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:
En general, el intérprete de Python es difícil de bloquear, pero lo anterior es abuso selectivo ...
fuente
Adelante - 3 personajes
(
@
es una búsqueda)fuente
C, 18
fuente
int func()
. es decir, una función que regresaint
, tomando parámetros no especificados. En este caso,raise
una función devuelve int, toma un argumento int, por lo que funciona (incluso si el compilador se queja).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.
fuente
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).
fuente
brainfuck (2)
Sí, esto depende de la implementación. SIGSEGV es el resultado probable de un buen compilador.
fuente
<
debería tener ningún efecto o envolverse.Haskell, 31
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.
fuente
C -
11 (19)7 (15)6 (14)1 caracteres, ensamblador AT&T x86 - 8 (24) caracteresLa versión C es:
El programa completo (no del todo compatible con ISO, supongamos que es K&R C) tiene 19 caracteres de longitud:
Variante de ensamblador:
El programa completo tiene 24 caracteres (solo para evaluación, ya que en realidad no es ensamblador):
EDITAR :
Un par de variantes C. El primero usa la inicialización cero de la variable de puntero global:
El segundo usa recursión infinita:
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.
EDITAR 3 :
Y mi último intento - 1 personaje de largo:
Solo compílalo así:
fuente
main
es 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í comoadd %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.dc - 7 caracteres
provoca un desbordamiento de pila
fuente
[dx0]
se almacenadx0
en la pila, luegod
duplica el elemento de la pila superior, luegox
saca el elemento de la pila superior (dx0
) y lo ejecuta. Lo que duplica el elemento de la pila superior y comienza a ejecutarlo ...0
debe estar allí para evitar que esto sea una llamada de cola, por lo que todos se acumulan.Perl, 10/12 caracteres
Una solución ligeramente engañosa es afeitarse un char del truco de Joey Adams :
Sin embargo, para obtener un verdadero defecto en Perl,
unpack p
es la solución obvia: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,
x8
será necesario aumentarlo.fuente
1x8
cosa?"11111111".
Python 33
Envío de señal 11 (SIGSEGV) en python.
fuente
from os import*
ykill(getpid(),11)
OCaml, 13 bytes
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.fuente
it coerces 0 (stored as the immediate value 1)
- ¿Por qué se almacena 0 como 1?Obj.magic()0
es un char más corto :)Bash, 4 bytes
Golfed
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
¡Pruébelo en línea!
fuente
En realidad ,
17 16 11 109 bytesPrué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.chain
objetos profundamente anidados , que en realidad usa para implementar el+
operador.fuente
C # - 62
Editar: 23
Debe compilarse con / inseguro para que este funcione. Por alguna razón que no entiendo,
*(int*)0=0
solo arroja una NullReferenceException, mientras que esta versión proporciona la infracción de acceso adecuada.fuente
int i=*(int*)0;
devuelve una NullReferenceException para mí.*(int*)-1=0
y obtener una infracción de acceso.*(int*)0=0
arroja una excepción probablemente se deba a la optimización. Específicamente, para evitar el costo de la comprobaciónnull
, el optimizador puede eliminar las comprobaciones nulas, pero cuando se produce una falla predeterminada, puede volver a generarla como un correctoNullReferenceException
.PicoLisp - 4 caracteres
Este es el comportamiento previsto. Como se describe en su sitio web:
fuente
F90 - 39 bytes
Compilacion:
Ejecución:
Materiales:
fuente
19 caracteres en C
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
.fuente
J (6)
memf
significa memoria libre,1
se interpreta como un puntero.fuente
Cython, 14
Esto suele ser útil para fines de depuración.
fuente
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).
Aumenta el byte único direccionado por el valor inicial de r0 [que resulta ser 05162 según el depurador simh] al inicio del programa.
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.
fuente
Matlab: ¡Sí, es posible!
En respuesta a una pregunta mía, a Amro se le ocurrió esta peculiaridad:
fuente
Shell de JavaScript, 7 bytes
Borra absolutamente todo, no solo el alcance actual, lo que obviamente causa muchos errores que dan como resultado JS explotando y segfaulándose
fuente
Pyth, 3 personajes
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.
fuente
j
en1
y0
, que intenta convertir1
en la base0
. Por qué eso falla, no tengo idea ...j
cuadra 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.