Escreva o código mais curto que gera uma falha de segmentação (SIGSEGV) em qualquer linguagem de programação.
75
Escreva o código mais curto que gera uma falha de segmentação (SIGSEGV) em qualquer linguagem de programação.
Respostas:
C, 5 caracteres
É uma declaração variável - o
int
tipo está implícito (recurso copiado do idioma B) e0
é o valor padrão. Quando executado, isso tenta executar um número (os números não são executáveis) e as causasSIGSEGV
.Experimente online!
fonte
0
.static
variáveis começam como0
, emain;
sãostatic
, como eu a declarei fora da função. c-faq.com/decl/initval.htmlmain
int, 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.text
e 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.main __attribute__((section(".text#")))=0xc3;
FTFY (pelo menos, parece retornar sem bater no meu x86).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 :).Bash, 11
fonte
Assembly (Linux, x86-64), 1 byte
Este código segfaults.
fonte
Python 2, 13
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.
fonte
Segmentation fault: 11
no MacSegmentation fault (core dumped)
no LinuxpdfTeX (51)
Na verdade, isso provavelmente é um bug , mas não está presente no TeX original, escrito por Knuth: compilar o código em
tex filename.tex
vez depdftex filename.tex
não produz um segfault.fonte
LOLCODE, 4 bytes
Não funciona online, apenas no intérprete C.
fonte
Python, 33 caracteres
Fonte: http://bugs.python.org/issue1215#msg143236
Python, 60 caracteres
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:
Em geral, o intérprete Python é difícil de travar, mas o acima é abuso abusivo seletivo ...
fonte
Quarto - 3 caracteres
(
@
é uma busca)fonte
C, 18
fonte
int func()
. ou seja, uma função retornandoint
, 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).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.
fonte
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).
fonte
cérebro (2)
Sim, isso depende da implementação. SIGSEGV é o resultado provável de um bom compilador.
fonte
<
deve ter efeito ou envolver-se.Haskell, 31
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.
fonte
C -
11 (19)7 (15)6 (14)1 caracteres, montador AT&T x86 - 8 (24) caracteresA versão C é:
Todo o programa (que não é totalmente compatível com ISO, vamos assumir que é K&R C) tem 19 caracteres:
Variante do montador:
O programa inteiro tem 24 caracteres (apenas para avaliação, já que não é realmente montador):
EDIT :
Um par de variantes C. O primeiro usa a inicialização zero da variável global do ponteiro:
O segundo usa recursão infinita:
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.
EDIT 3 :
E minha última tentativa - 1 caractere:
Basta compilar assim:
fonte
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 comoadd %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.dc - 7 caracteres
causa um estouro de pilha
fonte
[dx0]
armazenadx0
na pilha,d
duplica o elemento superior da pilha,x
exibe o elemento superior da pilha (dx0
) e o executa. O que duplica o elemento da pilha superior e começa a executá-lo ...0
precisa estar lá para evitar que isso seja uma chamada final, para que todos eles se acumulem.Perl, 10/12 caracteres
Uma solução levemente enganosa é raspar um char do truque de Joey Adams :
No entanto, para obter um segfault real no Perl,
unpack p
é a solução óbvia: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,
x8
será necessário aumentar.fonte
1x8
?"11111111".
Python 33
Enviando sinal 11 (SIGSEGV) em python.
fonte
from os import*
ekill(getpid(),11)
OCaml, 13 bytes
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.fonte
it coerces 0 (stored as the immediate value 1)
- por que 0 é armazenado como 1?Obj.magic()0
é um caractere curto :)Bash, 4 bytes
Golfe
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
Experimente Online!
fonte
Na verdade ,
17 16 11 109 bytesExperimente 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.chain
objetos profundamente aninhados , que realmente são usados para implementar o+
operador.fonte
C # - 62
Editar: 23
Deve ser compilado com / inseguro para que este funcione. Por alguma razão que eu não entendo,
*(int*)0=0
apenas lança uma NullReferenceException, enquanto esta versão fornece a violação de acesso adequada.fonte
int i=*(int*)0;
retorna uma NullReferenceException para mim.*(int*)-1=0
e obter uma violação de acesso.*(int*)0=0
lança uma exceção é provavelmente devido à otimização. Especificamente, para evitar o custo da verificaçãonull
, o otimizador pode remover verificações nulas, mas quando ocorre um segfault, ele pode ser repetido novamente como apropriadoNullReferenceException
.PicoLisp - 4 caracteres
Esse é o comportamento pretendido. Conforme descrito em seu site:
fonte
F90 - 39 bytes
Compilação:
Execução:
Materiais:
fonte
19 caracteres em C
Ele corrompe o valor do endereço de retorno da função principal e obtém um SIGSEGV ao retornar
main
.fonte
J (6)
memf
significa memória livre,1
é interpretada como um ponteiro.fonte
Cython, 14
Isso geralmente é útil para fins de depuração.
fonte
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).
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.
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.
fonte
Matlab - Sim, é possível!
Em resposta a uma pergunta minha, Amro apresentou essa peculiaridade:
fonte
Shell JavaScript, 7 bytes
Limpa absolutamente tudo, não apenas o escopo atual, que obviamente causa muitos problemas, que resultam em JS explodindo e segfaulting
fonte
Pitão, 3 caracteres
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.
fonte
j
em1
e0
, que tenta converter1
na base0
. Por que segfaults, eu não tenho idéia ...j
esquadrinha 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.