Escriba el código más corto que genera un Fallo de segmentación (SIGSEGV) en cualquier lenguaje de programación.
Comentarios
- Wow. Posiblemente la pregunta más corta y exitosa.
- @MatthewRoh Por interés, hice esta consulta SEDE. Parece que hay algunos con +10 o más, pero este es el primero arriba de +40
Respuesta
C, 5 caracteres
main;
Es «una declaración de variable: el tipo int
está implícito (función copiada de B idioma) y 0
es el valor predeterminado. Cuando se ejecuta, intenta ejecutar un número (los números no son ejecutables) y provoca SIGSEGV
.
Comentarios
- @Macmade: En realidad, es
0
.static
las variables comienzan como0
ymain;
esstatic
, como lo declaré fuera de la función. c-faq.com/decl/initval.html - la última vez que jugué con esto, descubrí que había ‘ es una razón diferente para el error de segmentación. En primer lugar, al llamar a main, saltas a la ubicación de main, no al valor, otra cosa es
main
es un int, es ‘ s ubicado 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 la ejecución de algo en dicha página es un protección de falla. - Sí, segfaults en C son prácticamente los predeterminados: P
-
main __attribute__((section(".text#")))=0xc3;
FTFY (al menos parece regresar sin estrellarse en mi x86). - @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 era hacer que el código segregara por defecto, no que funcionara :).
Respuesta
Bash, 11
kill -11 $$
Comentarios
- Señal 11 en 11 caracteres. Parece legítimo.
- @ nyuszika7h Iba a votar a favor de tu comentario, pero tienes 11 votos a favor en este momento, así que ‘ voy a dejarlo así. : P
- @AlexL. otras personas parecen haber echado a perder eso 🙁
- @theonlygusti Sí … Eso ‘ es una lástima. 🙁 Oh, bueno, entonces puedo votar a favor ahora .
- ¡Hasta 42 votos a favor, sin tocar!
Respuesta
Ensamblaje (Linux , x86-64), 1 byte
RET
Este código segfaults.
Comentarios
- Como un archivo .com MSDOS, se ejecuta y termina sin errores.
- Mi punto es: simplemente especificar «ensamblado» no es ‘ t suficiente para hágalo por defecto.
- @JB: En MS DOS, ningún programa jamás producirá un error de segmentación. Eso ‘ s porque MS DOS se ejecuta en modo real donde la protección de la memoria es inexistente.
- @celtschk IIRC NTVDM se las arreglará con direcciones inexistentes y aquellas no asignadas a MS-DOS.
- @celtschk: Puede segregularlo de todos modos así: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] – > aumento de CPU s la SEGV subyacente (AFAIK hay ‘ sin embargo, no hay nadie para manejarlo).
Respuesta
Python 2, 13
exec"()"*7**6
Windows informa un código de error de c00000fd (desbordamiento de pila) que supongo que es un subtipo de Fallo de segmentación.
Gracias a Alex A. y Mego, se ha confirmado 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.
Comentarios
-
Segmentation fault: 11
en Mac -
Segmentation fault (core dumped)
en Linux - ¿Esto cuelga primero?
- @MegaMan As in toma mucho tiempo para terminar ? No, 7 ** 6 es solo alrededor de 100 K, por lo que ‘ no hay demoras perceptibles.
- @MaxGasner Intente leer el lenguaje de programación nuevamente 🙂
Responder
pdfTeX ( 51)
\def~#1{\meaning}\write0{\expandafter~\string}\bye
Esto en realidad es probablemente un error , pero no está presente en el TeX original, escrito por Knuth: compilar el código con tex filename.tex
en lugar de pdftex filename.tex
no produce un segfault.
Respuesta
LOLCODE, 4 bytes
OBTW
No funciona en línea, solo en el intérprete de C.
Comentarios
- LOL FANCY CODE M8 8/8 KTHXBYE
Respuesta
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 n Estoy probando en:
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 un abuso selectivo …
Respuesta
Cuarto – 3 caracteres
0 @
(@
es una búsqueda)
Comentarios
- El más corto hasta ahora que funcionará en sistemas modernos.
- ¿Qué adelante? Gforth solo dice » Dirección de memoria no válida »
Responder
W32 .com ejecutable – 0 bytes
Esto parecerá extraño, pero en sistemas Windows de 32 bits, crear y ejecutar un archivo .com vacío puede causar un error de segmentación, dependiendo de … algo. DOS simplemente lo acepta (el 8086 no tiene administración de memoria, no hay segmentos significativos que puedan fallar), y Windows de 64 bits se niega a ejecutarlo (x86-64 no tiene modo v86 para ejecutar un archivo .com).
Respuesta
C, 18
main(){raise(11);}
Comentarios
- ¿necesita agregar #include < signal.h > en la lista de códigos?
- @FlorianCastellane: en C90 y versiones anteriores, para cualquier llamada de función realizada sin una declaración visible, el compilador la declara implícitamente como
int func()
. es decir, una función que devuelveint
, tomando parámetros no especificados. En este caso,raise
es una función que devuelve int, tomando un argumento int, por lo que esto funciona (incluso si el compilador se queja). - @Hasturkun
main(){main();}
Responder
Perl (< 5.14), 9 caracteres
/(?{??})/
En 5.14, el motor de expresiones regulares se hizo reentrante para que no pudiera fallar de esta manera, pero 5.12 y antes, segreglará si intenta esto.
Comentarios
- Puedo reproducir esto en Perl 5.14 (Debian) y 5.18 (Arch Linux). sprunge.us/RKHT
- Reproducido con Perl v5.20.2 (windows)
- ¿Qué pasa con
/(?R)/
en versiones anteriores de Perl?
Responder
brainfuck (2)
<.
Sí, esto depende de la implementación. SIGSEGV es el resultado probable de un buen compilador.
Comentarios
- ¿Cómo es un compilador que segfaults en ese » bueno «? Eso
<
no debería tener efecto o no debería tener efecto. - Producir inmediatamente un error en tiempo de ejecución en la infracción de límites es mejor porque permite al programador encontrar y corregir el error como lo más rápido posible. Dejar que el programa con errores se ejecute durante un tiempo y corromper la memoria al azar antes de fallar hace que el problema sea más difícil de diagnosticar. Prevenir el accidente 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.
- A la inversa, la detección 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 una falla de segmento es excelente porque no ‘ no tiene ningún costo de velocidad. (En caso de que ‘ no esté claro, el compilador en sí no ‘ t segfault; genera ejecutables que segfault tan pronto como lo para acceder a la memoria fuera de los límites).
- ¿Puede proporcionar una implementación que produzca este comportamiento y se haya creado antes de que se publicara este desafío? De lo contrario, esta respuesta no es válida.
- Las comprobaciones de límites son específicas de la implementación, por lo que ‘ estoy seguro de que hay algunas que podrían generar errores.¿Alguna SIGSEGV sin embargo? Lo dudo. Sin embargo, hay una gran cantidad de programas que dependen de la matriz que se ajusta a la izquierda. Puede ser bastante conveniente tener un almacenamiento ampliable en ambos lados.
Respuesta
Haskell, 31
foreign import ccall main::IO()
Esto produce un segfault 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.
Comentarios
- Awwww. Iba a publicar
import Foreign;main=peek nullPtr::IO Int
, pero ese ‘ s 40.
Respuesta
Bash, 4 bytes
Golf
. $0
Incluya recursivamente el script en sí mismo.
Explicado
» fuente » (.) La operación provoca un desbordamiento de pila eventualmente, 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 discutió aquí .
Prueba
./bang Segmentation fault (core dumped)
Responda
Python 33
import os os.kill(os.getpid(),11)
Enviando la señal 11 (SIGSEGV) en Python.
Comentarios
- También 33 caracteres:
from os import*
ykill(getpid(),11)
Responder
C – 11 (19) 7 (15) 6 (14) 1 caracteres, AT & Ensamblador T x86 – 8 (24) caracteres
La versión C es:
*(int*)0=0;
Todo el programa (no del todo ISO -compliant, supongamos que «s K & RC) tiene 19 caracteres de longitud:
main(){*(int*)0=0;}
Ensamblador variante:
orl $0,0
El programa completo tiene 24 caracteres (solo para evaluación, ya que en realidad no es un ensamblador):
main(){asm("orl $0,0");}
EDIT :
Un par de variantes de C. El primero usa la inicialización cero de la variable de puntero global:
*p;main(){*p=0;}
El segundo usa la recursividad infinita:
main(){main();}
La última variante es la más corta – 7 (15) caracteres.
EDIT 2 :
Inventó una variante más que es más corta que cualquiera de las anteriores: 6 (14) caracteres. Se asume que las cadenas literales se colocan en un segmento de solo lectura.
main(){*""=0;}
EDIT 3 :
Y mi último intento – 1 carácter de longitud:
P
Simplemente compílelo así :
cc -o segv -DP="main(){main();}" segv.c
Comentarios
- en C isn ‘ t main; solo 5 caracteres
- : El enlazador no ‘ t verifica si main es función o no. Simplemente se lo pasa a el cargador y devuelve sigsegv
- @FUZxxl En este caso
main
es una variable int global inicializada en cero, así que lo que obtenemos es resultado de intentar ejecutar algunos bytes cero. En x86, ‘ sería algo así comoadd %al,(%rax)
, que es una instrucción perfectamente válida que intenta llegar a la memoria en la dirección almacenada en%rax
. Las posibilidades de tener una buena dirección allí son mínimas. - Por supuesto, la última entrada puede usarse 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. 🙂
- Por lo general, los indicadores del compilador distintos de los que eligen la versión de idioma a utilizar se cuentan para el total.
Respuesta
Perl, 10/12 caracteres
Una solución un poco engañosa es cortar un solo carácter El truco bash de Joey Adams :
kill 11,$$
Sin embargo, para obtener una falla de segmentación real en Perl, unpack p
es la solución obvia :
unpack p,1x8
Técnicamente, esto no está garantizado a segfault, ya que la dirección 0x31313131 (o 0x3131313131313131 en sistemas de 64 bits) podría apuntar a un espacio de direcciones válido por casualidad. Pero las probabilidades están en contra. Además, si alguna vez perl se porta a plataformas donde los punteros tienen más de 64 bits, el x8
deberá incrementarse.
Comentarios
- ¿Qué es esto
1x8
? - @HannesKarppila Es ‘ una forma corta de escribir
"11111111".
Respuesta
dc – 7 caracteres
[dx0]dx
provoca un desbordamiento de pila
Comentarios
- Es un trabajo, pero ¿puedes explicarlo? ¿Por qué se comporta de esa manera?
-
[dx0]
almacenadx0
en la pila, luegod
duplica el elemento de la pila superior, luegox
muestra el elemento de la pila superior (dx0
) y lo ejecuta. Lo que duplica el elemento de la pila superior y comienza a ejecutarlo … el0
debe estar allí para evitar que esto sea una llamada de cola, por lo que todos se acumulan.
Respuesta
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 la programación», entonces PicoLisp bien puede llamarse el «bisturí de Programación «: Agudo, preciso, pequeño y ligero, pero también peligroso en manos de inexpertos.
Respuesta
F90 – 39 bytes
real,pointer::p(:)=>null() p(1)=0. end
Compilación:
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
Comentarios
- Bonita primera publicación.
Responder
En realidad , 17 16 11 10 9 bytes
⌠[]+⌡9!*.
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 la interpretación r explotando un error en Python que involucra objetos itertools.chain
profundamente anidados, que en realidad se usa para implementar +
operador.
Respuesta
OCaml, 13 bytes
Obj.magic 0 0
Esto usa la función Obj.magic
, que coacciona de manera insegura dos tipos cualesquiera. En este caso, coacciona 0 (almacenado como el valor inmediato 1, debido al bit de etiqueta usado por el GC) a un tipo de función (almacenado como un puntero). Por lo tanto, intenta eliminar la referencia a la dirección 1, y eso, por supuesto, segregará.
Comentarios
-
it coerces 0 (stored as the immediate value 1)
– ¿por qué 0 se almacena como 1? - @Skyler ver editar
-
Obj.magic()0
es un carácter más corto 🙂
Respuesta
Pyth, 3 caracteres
j1Z
Esta sería la parte en la que explico cómo se me ocurrió esta respuesta, excepto que legítimamente no tengo ni idea . Si alguien pudiera explicarme esto, estaría agradecido.
Aquí está en un intérprete en línea.
Explicación
j
cuadra la base y se llama a sí misma de forma recursiva hasta que la base es al menos tan grande como el número. Dado que la base es 0 , nunca sucede. Con un límite de recursividad suficientemente alto, obtienes un error de segmentación.
Comentarios
- ¡Descubrí algo! Al buscar en la fuente de Pyth ‘, descubrí que este código
j
en1
y0
, que intenta convertir1
en base0
. Por qué ese segfaults, no tengo idea … - Consulte aquí .
j
cuadra la base y se llama a sí mismo de forma recursiva hasta que la base es al menos tan grande como el número. Dado que la base es 0 , eso nunca sucede. Con un límite de recursividad suficientemente alto, obtienes un error de segmentación. - @Dennis IDEone
- @SeeRhino El intérprete de Pyth establece el límite de recursividad en 100.000. Al menos en TIO, eso ‘ es suficiente para un error de segmentación.
Respuesta
C # – 62
System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);
C # / unsafe, 23 bytes
unsafe{int i=*(int*)0;}
Por alguna razón que no entiendo, *(int*)0=0
simplemente lanza una NullReferenceException, mientras que esta versión da la infracción de acceso adecuada.
Comentarios
- El
int i=*(int*)0;
devuelve una NullReferenceException para mí. - Puede intentar acceder a una ubicación negativa, como
*(int*)-1=0
y obtener una infracción de acceso. - La excepción en particular es lo que el clr lo envuelve y es insignificante. El sistema operativo en sí da la falla seg en todos estos casos.
- La razón por la cual
*(int*)0=0
arroja una excepción probablemente se deba a la optimización. Específicamente, para evitar el costo de verificarnull
, el optimizador puede eliminar las verificaciones nulas, pero cuando ocurre una falla de segmento, puede volver a generarla como unaNullReferenceException
.
Responder
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 devolver main
.
Comentarios
- Depende del diseño del marco de la pila, por lo que en algunas arquitecturas posiblemente no falle.
- Por qué no simplemente
main;
, omain(){*""=0;}
? - @Sapphire_Brick
main;
ya se dio en otra respuesta. - @saeedn Entonces, ¿por qué publicarlo? ¡Este no es ‘ ni siquiera el segundo más corto!
- @Sapphire_Brick En el momento en que estaba publicando el mío,
main;
no se ‘ t publicado y yo ‘ no sabía que funciona. Solo estaba señalando que ya está dado y no tiene sentido cambiar mi respuesta. Además, la gente aquí no ‘ t solo publica solo por el tiempo más corto, a veces también es interesante una forma diferente de resolver el problema.
Respuesta
Cython, 14
Esto a menudo resulta útil para fines de depuración.
a=(<int*>0)[0]
Respuesta
J (6)
memf 1
memf
significa memoria libre, 1
se interpreta como un puntero.
Comentarios
- ¿Por qué
1
en lugar de0
? ¿Es legal liberar un puntero nulo en J?
Respuesta
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)
Comentarios
- Por favor proporcione la versión de Matlab – R2015B (y 2016B también) arroja un error: Error al usar setfield (línea 56) Al menos uno index es obligatorio.
- @FlorianCastellane No se pueden probar todas las versiones ahora, pero se ha confirmado que da un segfault en varias versiones, la última es 2014b y la primera 2012a.
Respuesta
C – 14 caracteres
Asegúrese de compilar un archivo vacío con cc -nostartfiles c.c
Explicación:
Lo que salió mal es que tratamos _start como si fuera una función de C, y traté de regresar de él. En realidad, no es una función en absoluto. Es solo un símbolo en el archivo objeto que el enlazador usa para ubicar el punto de entrada del programa. Cuando se invoca nuestro programa, se invoca directamente. Si tuviéramos que mirar, veríamos que el valor en la parte superior de la pila era el número 1, que ciertamente no es similar a una dirección. De hecho, lo que está en la pila es el valor argc de nuestro programa. Después de esto, vienen los elementos de la matriz argv, incluido el elemento NULL de terminación, seguido de los elementos de envp. Y eso es todo. No hay una dirección de retorno en la pila.
Comentarios
- I ‘ Estoy bastante seguro de que tienes que puntuar con los argumentos adicionales
- Tienes que agregar 14 bytes para la bandera especial.
- @ErikGolfer エ リ ッ ク ゴ ル フ ァ ー -nostartfiles es en realidad 13 bytes de largo 🙂
- @CharlesPaulet Creo que también tienes que contar el espacio.
Responder
Ensamblado Unix PDP-11, 18 bytes binarios, 7 bytes fuente
(esto se está convirtiendo en un tema para mí, tal vez porque es el único lenguaje que conozco que no- uno más lo hace aquí.)
inc(r0)
Incrementa el byte único direccionado por el valor inicial de r0 [que resulta ser 05162 según el depurador simh] a partir de 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 intenta acortar la fuente, pero siempre termina indicando un error de sintaxis o SIGBUS.