Código mais curto que gera um SIGSEGV


Respostas:


113

C, 5 caracteres

main;

É uma declaração variável - o inttipo está implícito (recurso copiado do idioma B) e 0é o valor padrão. Quando executado, isso tenta executar um número (os números não são executáveis) e as causas SIGSEGV.

Experimente online!


5
@ Macmade: Na verdade, é 0. staticvariáveis ​​começam como 0, e main;são static, como eu a declarei fora da função. c-faq.com/decl/initval.html
Konrad Borowski

16
Na última vez que joguei com isso, descobri que há uma razão diferente para o segfault. Antes de tudo, chamando main, você pula para o local do main, e não o valor, outra coisa é mainint, está localizado .bss, geralmente as funções estão localizadas .text, quando o kernel carrega o programa elf, cria uma página executável para .texte não -executable for .bss, assim, chamando main, você pula para uma página não executável e a execução de algo nessa página é uma falha de proteção.
Mniip 6/12/13

23
Yep, segfaults em C são praticamente o padrão: P
Paul Draper

1
main __attribute__((section(".text#")))=0xc3;FTFY (pelo menos, parece retornar sem bater no meu x86).
Jozxyqk

2
@jozxyqk Ou mais curto const main=195;,. Por mais interessante que esteja funcionando, o objetivo desse desafio do código de golfe era fazer com que o código fosse padrão, não funcionasse :).
27518 Konrad Borowski

74

Bash, 11      

kill -11 $$

44
Sinal 11 em 11 caracteres. Parece legítimo.
nyuszika7h

12
@ nyuszika7h Eu estava indo para votar seu comentário, mas você tem 11 votos agora, então eu vou deixar por isso mesmo. : P
HyperNeutrino 25/11

3
@AlexL. outras pessoas parecem ter estragado isso :(
theonlygusti

2
@theonlygusti Sim ... Isso é muito ruim. :( Oh bem, então eu posso votar agora.
HyperNeutrino 21/01

2
Até 42 votos positivos, nada demais!
fácil

39

Assembly (Linux, x86-64), 1 byte

RET

Este código segfaults.


7
Como um arquivo .com do MSDOS, ele é executado e finalizado sem erros.
JB

10
Meu ponto de vista é: apenas especificar “assembly” não é suficiente para torná-lo segfault.
JB

52
@JB: No MS DOS, nenhum programa jamais produzirá uma falha de segmentação. Isso ocorre porque o MS DOS é executado em modo real, onde a proteção de memória é inexistente.
Celtschk

1
O @celtschk IIRC NTVDM utilizará endereços inexistentes e não alocados ao MS-DOS.
ζ--

2
@celtschk: Você pode segfault assim mesmo: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] -> CPU aumenta o SEGV subjacente (AFAIK não há ninguém para lidar com isso).
Joshua

26

Python 2, 13

exec'()'*7**6

O Windows relata um código de erro de c00000fd (estouro de pilha), que eu suponho ser um subtipo de falha de segmentação.

Graças a Alex A. e Mego, também é confirmado que causa falhas de segmentação nos sistemas Mac e Linux. Python é a linguagem de escolha para travar seus programas de maneira portável.


7
Segmentation fault: 11no Mac
Alex A.

7
Segmentation fault (core dumped)no Linux
Mego

Isso desliga primeiro?
Mega Man

1
@MegaMan Como demorou muito tempo para terminar? Não, 7 ** 6 é apenas cerca de 100K, portanto não há atraso perceptível.
feersum

Por que isso funciona? Não parece no Python 3.6.8 no Mac OS.
Max Gasner

22

pdfTeX (51)

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

Na verdade, isso provavelmente é um bug , mas não está presente no TeX original, escrito por Knuth: compilar o código em tex filename.texvez de pdftex filename.texnão produz um segfault.



17

Python, 33 caracteres

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

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

Python, 60 caracteres

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

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

Esta é a versão do Python em que estou testando:

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

Em geral, o intérprete Python é difícil de travar, mas o acima é abuso abusivo seletivo ...


16

Quarto - 3 caracteres

0 @

( @é uma busca)


1
O mais curto até agora que funcionará em sistemas modernos.
Demi

2
Qual adiante? Gforth apenas diz "endereço de memória inválido"
cat

15

C, 18

main(){raise(11);}

você precisa adicionar #include <signal.h> na lista de códigos?
Florian Castellane

5
@FlorianCastellane: no C90 e inferior, para qualquer chamada de função feita sem uma declaração visível, o compilador implicitamente o declara como int func(). ou seja, uma função retornando int, obtendo parâmetros não especificados. Nesse caso, raiseé uma função retornando int, usando um argumento int, portanto isso funciona (mesmo se o compilador reclamar).
Hasturkun

14

Perl (<5,14), 9 caracteres

/(?{??})/

Na 5.14, o mecanismo regex foi reentrado para que não pudesse ser travado dessa maneira, mas a versão 5.12 e anterior sofrerão um erro padrão se você tentar isso.


Eu posso reproduzir isso no Perl 5.14 (Debian) e 5.18 (Arch Linux). sprunge.us/RKHT
nyuszika7h

Reproduzido com Perl v5.20.2 (windows)
mehi

14

W32 .com executável - 0 bytes

Isso parecerá estranho, mas em sistemas Windows de 32 bits, criar e executar um arquivo .com vazio pode causar um segfault, dependendo de ... alguma coisa. O DOS simplesmente o aceita (o 8086 não possui gerenciamento de memória, não há segmentos significativos para falha) e o Windows de 64 bits se recusa a executá-lo (x86-64 não possui o modo v86 para executar um arquivo .com).


13

cérebro (2)

<.

Sim, isso depende da implementação. SIGSEGV é o resultado provável de um bom compilador.


4
Como é um compilador que segmenta esse "bom"? Isso não <deve ter efeito ou envolver-se.
precisa saber é o seguinte

12
É melhor produzir imediatamente uma violação de erro de execução nos limites, pois permite que o programador encontre e corrija o erro o mais rápido possível. Deixar o programa com erros executar por um tempo e corromper a memória aleatoriamente antes de travar apenas torna o problema mais difícil de diagnosticar. Prevenir o acidente completamente, como você sugere, é pior; o programador pode deixar o programa "funcionando" e depois ser humilhado publicamente quando ele trava nos compiladores e intérpretes padrão.
Daniel Cristofani

1
Por outro lado, capturar violações de limites antes do tempo de execução não é possível em geral, nem especialmente útil nos casos em que é possível. Produzir um erro de tempo de execução mais descritivo seria bom, mas fazer com que o sistema operacional o pegue como um segfault é ótimo porque não tem nenhum custo de velocidade. (No caso, não está claro, o compilador em si não segfault - ele produz executáveis que Segfault assim que eles tentam acessar a memória fora dos limites.)
Daniel Cristofani

4
Você pode fornecer uma implementação que produz esse comportamento e foi criada antes do lançamento deste desafio? Caso contrário, esta resposta é inválida.
Mego

1
As verificações de limites são específicas da implementação, por isso tenho certeza de que há algumas que apresentariam erros. Algum SIGSEGV embora? Eu duvido. Há um grande número de programas que dependem da disposição da matriz à esquerda. Pode ser bastante conveniente ter armazenamento cultivável em ambos os lados.
Captncraig

12

Haskell, 31

foreign import ccall main::IO()

Isso produz um segfault quando compilado com o GHC e executado. Não são necessários sinalizadores de extensão, pois a Foreign Function Interface está no padrão Haskell 2010.


10

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

A versão C é:

*(int*)0=0;

Todo o programa (que não é totalmente compatível com ISO, vamos assumir que é K&R C) tem 19 caracteres:

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

Variante do montador:

orl $0,0

O programa inteiro tem 24 caracteres (apenas para avaliação, já que não é realmente montador):

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

EDIT :

Um par de variantes C. O primeiro usa a inicialização zero da variável global do ponteiro:

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

O segundo usa recursão infinita:

main(){main();}

A última variante é a mais curta - 7 (15) caracteres.

EDIT 2 :

Inventou mais uma variante mais curta que qualquer uma das anteriores - 6 (14) caracteres. Ele pressupõe que cadeias literais são colocadas em um segmento somente leitura.

main(){*""=0;}

EDIT 3 :

E minha última tentativa - 1 caractere:

P

Basta compilar assim:

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

3
em C não é principal; apenas 5 caracteres
Arya

1
: Linker não verifica se principal é a função ou não .it apenas passá-lo para o carregador e voltar SIGSEGV
Arya

1
@FUZxxl Nesse caso, mainé uma variável int global inicializada com zero, então o que obtemos é o resultado da tentativa de executar alguns bytes zero. No x86, seria algo como add %al,(%rax)uma instrução perfeitamente válida que tenta alcançar a memória no endereço armazenado %rax. As chances de ter um bom endereço são mínimas.
Alexander Bakulin

6
É claro que a última entrada pode ser usada para tudo, basta fornecer os argumentos corretos do compilador. O que deve torná-lo o vencedor automático de qualquer competição de golfe com código. :-)
celtschk

5
Normalmente, os sinalizadores do compilador, exceto aqueles que escolhem a versão do idioma a usar, são contados no total.
Jerry Jeremiah

9

dc - 7 caracteres

[dx0]dx

causa um estouro de pilha


São obras, mas você pode elaborar? Por que se comporta dessa maneira?
Stéphane Gourichon

2
[dx0]armazena dx0na pilha, dduplica o elemento superior da pilha, xexibe o elemento superior da pilha ( dx0) e o executa. O que duplica o elemento da pilha superior e começa a executá-lo ... 0precisa estar lá para evitar que isso seja uma chamada final, para que todos eles se acumulem.
precisa

8

Perl, 10/12 caracteres

Uma solução levemente enganosa é raspar um char do truque de Joey Adams :

kill 11,$$

No entanto, para obter um segfault real no Perl, unpack pé a solução óbvia:

unpack p,1x8

Tecnicamente, isso não garante falha de segmentação, pois o endereço 0x31313131 (ou 0x313131313131313131 em sistemas de 64 bits) pode indicar um espaço de endereço válido por acaso. Mas as chances são contra. Além disso, se o perl for portado para plataformas em que os ponteiros tenham mais de 64 bits, x8será necessário aumentar.


1
O que é isso 1x8?
Hannes Karppila

@HannesKarppila É um caminho curto para escrever"11111111".
Ilmari Karonen

8

Python 33

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

Enviando sinal 11 (SIGSEGV) em python.


2
Também 33 caracteres: from os import*ekill(getpid(),11)
Timtech

8

OCaml, 13 bytes

Obj.magic 0 0

Isso usa a função Obj.magic, que coagora inseguramente quaisquer dois tipos. Nesse caso, ele coage 0 (armazenado como o valor imediato 1, devido ao bit de tag usado pelo GC) para um tipo de função (armazenado como um ponteiro). Assim, ele tenta desreferenciar o endereço 1 e, é claro, irá falhar.


1
it coerces 0 (stored as the immediate value 1)- por que 0 é armazenado como 1?
Skyler3

1
@Skyler see edit
Demi

1
Obj.magic()0é um caractere curto :)
Ben Millwood

8

Bash, 4 bytes

Golfe

. $0

Inclua recursivamente o script em si.

Explicado

A operação "origem" recursiva (.) Causa um estouro de pilha eventualmente e, como o Bash não se integra à libsigsegv , isso resulta em um SIGSEGV.

Observe que isso não é um bug, mas um comportamento esperado, conforme discutido aqui .

Teste

./bang 
Segmentation fault (core dumped)

Experimente Online!


8

Na verdade , 17 16 11 10 9 bytes

⌠[]+⌡9!*.

Experimente online!

Se o acima não falhar, tente aumentar o número (números de vários dígitos são especificados em Na verdade com dois pontos à frente)

Interrompe o interpretador explorando um bug em python envolvendo itertools.chainobjetos profundamente aninhados , que realmente são usados ​​para implementar o +operador.


7

C # - 62

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

Editar: 23

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

Deve ser compilado com / inseguro para que este funcione. Por alguma razão que eu não entendo, *(int*)0=0apenas lança uma NullReferenceException, enquanto esta versão fornece a violação de acesso adequada.


O int i=*(int*)0;retorna uma NullReferenceException para mim.
Peter Olson

Você pode tentar acessar um local negativo, curtir *(int*)-1=0e obter uma violação de acesso.
Peter Olson

A exceção específica é exatamente o que o clr envolve e é insignificante. O sistema operacional em si realmente dá a falha seg em todos esses casos.
captncraig

A razão pela qual *(int*)0=0lança uma exceção é provavelmente devido à otimização. Especificamente, para evitar o custo da verificação null, o otimizador pode remover verificações nulas, mas quando ocorre um segfault, ele pode ser repetido novamente como apropriado NullReferenceException.
22918 Konrad Borowski

7

PicoLisp - 4 caracteres

$ pil
: ('0)
Segmentation fault

Esse é o comportamento pretendido. Conforme descrito em seu site:

Se algumas linguagens de programação pretendem ser o "canivete suíço de programação", o PicoLisp pode muito bem ser chamado de "bisturi de programação": nítido, preciso, pequeno e leve, mas também perigoso na mão dos inexperientes.


7

F90 - 39 bytes

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

Compilação:

gfortran segv.f90 -o segv 

Execução:

./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)

Materiais:

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

1
Bom primeiro post.
Rɪᴋᴇʀ

6

19 caracteres em C

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

Ele corrompe o valor do endereço de retorno da função principal e obtém um SIGSEGV ao retornar main.


Depende do layout do quadro da pilha, portanto, em algumas arquiteturas, pode não falhar.
Alexander Bakulin

6

J (6)

memf 1

memfsignifica memória livre, 1é interpretada como um ponteiro.


5

Cython, 14

Isso geralmente é útil para fins de depuração.

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

5

Montagem PDP-11 do Unix, binário de 18 bytes, fonte de 7 bytes

(isso está se tornando um tema para mim, talvez porque seja o único idioma que eu saiba que ninguém mais conhece).

inc(r0)

Incrementa o byte único endereçado pelo valor inicial de r0 [que passa a ser 05162 de acordo com o depurador simh] no início do programa.

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

E, como sempre, os bytes estranhos no final podem ser removidos com tira.

Fiz algumas tentativas para diminuir a fonte, mas sempre acabava recebendo um erro de sintaxe ou o SIGBUS.


5

Matlab - Sim, é possível!

Em resposta a uma pergunta minha, Amro apresentou essa peculiaridade:

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

Por favor, forneça a versão Matlab - R2015B (e 2016B também) apenas gera um erro: Erro ao usar o setfield (linha 56) É necessário pelo menos um índice.
Florian Castellane

@FlorianCastellane Não é possível experimentar todas as versões agora, mas foi confirmado que há um segfault em algumas versões, sendo a mais recente 2014b e a primeira 2012a.
Dennis Jaheruddin 29/11

5

Shell JavaScript, 7 bytes

clear()

Limpa absolutamente tudo, não apenas o escopo atual, que obviamente causa muitos problemas, que resultam em JS explodindo e segfaulting


De acordo com o MDN (document.clear), isso deve fazer algo apenas em versões realmente antigas do Mozilla e, mesmo assim, o que realmente ocorre na sua experiência?
Tomsmeding

@tomsmeding this is window.clear, o FF diretamente não o revela, é um spidermonkey embutido
#

5

Pitão, 3 caracteres

j1Z

Essa seria a parte em que eu explicaria como obtive essa resposta, exceto que eu legitimamente não tenho idéia . Se alguém pudesse explicar isso para mim, ficaria agradecido.

Aqui está um intérprete online.

Explicação

jesquadrinha a base e chama-se recursivamente até que a base seja pelo menos tão grande quanto o número. Como a base é 0 , isso nunca acontece. Com um limite de recursão suficientemente alto, você obtém um segfault.

- Dennis ♦


Descobri algo! De navegar fonte de Pyth, descobri que este código faz jem 1e 0, que tenta converter 1na base 0. Por que segfaults, eu não tenho idéia ...
NoOneIsHere

1
Veja aqui . jesquadrinha a base e chama-se recursivamente até que a base seja pelo menos tão grande quanto o número. Como a base é 0 , isso nunca acontece. Com um limite de recursão suficientemente alto, você obtém um segfault.
Dennis

@ Dennis IDEone
NoOneIsHere

@SeeRhino O interpretador Pyth define o limite de recursão para 100.000. Pelo menos no TIO, isso é suficiente para um segfault.
Dennis
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.