Escreva o código mais curto que gera uma Falha de segmentação (SIGSEGV) em qualquer linguagem de programação.
Comentários
- Uau. Possivelmente a pergunta mais curta bem-sucedida.
- @MatthewRoh Sem interesse, fiz esta consulta SEDE. Parece que há alguns com +10 ou superior, mas este é o primeiro acima de +40
Resposta
C, 5 caracteres
main;
É uma declaração de variável – int
o tipo está implícito (recurso copiado de Linguagem B) e 0
é o valor padrão. Quando executado, tenta executar um número (os números não são executáveis) e causa SIGSEGV
.
Comentários
- @Macmade: na verdade, é
0
.static
variáveis começam como0
emain;
éstatic
, como eu declarei fora da função. c-faq.com/decl/initval.html - da última vez que joguei com isso, descobri que havia ‘ um motivo diferente para o segfault. Em primeiro lugar, ao chamar main, você pula para a localização de main, não para o valor, outra coisa é
main
é um int, é ‘ s localizadas em.bss
, geralmente as funções estão localizadas em.text
, quando o kernel carrega o programa elf, ele cria uma página executável para.text
e não executável para.bss
, portanto, ao chamar main, você pula para uma página não executável e a execução de algo em tal página é um falha de proteção. - Sim, segfaults em C são basicamente o padrão: P
-
main __attribute__((section(".text#")))=0xc3;
FTFY (pelo menos parece retornar sem travando no meu x86). - @jozxyqk Ou menor,
const main=195;
. Tão interessante é que ‘ está funcionando, o objetivo deste desafio de golfe do código era fazer com que o código de segfault não funcionasse :).
Resposta
Bash, 11
kill -11 $$
Comentários
- Sinal 11 em 11 caracteres. Parece legítimo.
- @ nyuszika7h Eu ia votar positivamente em seu comentário, mas você tem 11 votos positivos agora, então ‘ vou deixar por isso mesmo. : P
- @AlexL. outras pessoas parecem ter estragado isso 🙁
- @theonlygusti Sim … Isso ‘ é muito ruim. 🙁 Bem, então posso votar a favor agora .
- Até 42 votos positivos, sem toque!
Resposta
Montagem (Linux , x86-64), 1 byte
RET
Este código segfaults.
Comentários
- Como um arquivo MSDOS .com, ele é executado e encerrado sem erros.
- Meu ponto é: apenas especificar “assembly” não é ‘ o suficiente para torná-lo falha de segmentação.
- @JB: No MS DOS, nenhum programa jamais produzirá uma falha de segmentação. Isso ‘ s porque o MS DOS é executado em modo real, onde a proteção de memória é inexistente.
- @celtschk IIRC NTVDM extrairá endereços inexistentes e não alocados para o MS-DOS.
- @celtschk: Você pode usar o segfault de qualquer maneira: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] – CPU é o SEGV subjacente (AFAIK há ‘ ninguém para lidar com isso, no entanto).
Resposta
Python 2, 13
exec"()"*7**6
O Windows relata um código de erro de c00000fd (Stack Overflow) que eu presumiria ser um subtipo de falha de segmentação.
Graças a Alex A. e Mego, está confirmado que causa falhas de segmentação em sistemas Mac e Linux também. Python é a linguagem de escolha para travar seus programas portavelmente.
Comentários
-
Segmentation fault: 11
no Mac -
Segmentation fault (core dumped)
no Linux - Isso desliga primeiro?
- @MegaMan As in leva muito tempo para terminar ? Não, 7 ** 6 é apenas cerca de 100K, portanto ‘ s nenhum atraso perceptível.
- @MaxGasner Tente ler a linguagem de programação novamente 🙂
Resposta
pdfTeX ( 51)
\def~#1{\meaning}\write0{\expandafter~\string}\bye
Este é provavelmente um bug , mas não está presente em o TeX original, escrito por Knuth: compilar o código com tex filename.tex
em vez de pdftex filename.tex
não produz um segfault.
Resposta
LOLCODE, 4 bytes
OBTW
Não funciona online, apenas no interpretador C.
Comentários
- LOL FANCY CODE M8 8/8 KTHXBYE
Resposta
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 Python n 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 interpretador Python é difícil de travar, mas o acima é um abuso seletivo …
Resposta
Avançar – 3 caracteres
0 @
(@
é uma busca)
Comentários
- O mais curto até agora que funcionará em sistemas modernos.
- Qual Forth? Gforth apenas diz ” Endereço de memória inválido ”
Resposta
W32 .com executável – 0 bytes
Isso pode parecer estranho, mas em sistemas Windows de 32 bits, criar e executar um arquivo .com vazio pode causar um segfault, dependendo de … algo. O DOS apenas aceita (o 8086 não tem gerenciamento de memória, não há segmentos significativos para falhas) e o Windows de 64 bits se recusa a executá-lo (x86-64 não tem modo v86 para executar um arquivo .com).
Resposta
C, 18
main(){raise(11);}
Comentários
- você precisa adicionar #include < signal.h na lista de códigos?
- @FlorianCastellane: em C90 e inferior, para qualquer chamada de função feita sem uma declaração visível, o compilador a declara implicitamente como
int func()
. ou seja, uma função que retornaint
, recebendo parâmetros não especificados. Neste caso,raise
é uma função que retorna int, recebendo um argumento int, então isso funciona (mesmo se o compilador reclamar). - @Hasturkun
main(){main();}
Resposta
Perl (< 5.14), 9 caracteres
/(?{??})/
Em 5.14, o motor regex foi tornado reentrante para que não pudesse travar dessa maneira, mas 5.12 e anteriormente irá falhar em segfault se você tentar isso.
Comentários
- Posso reproduzir isso no Perl 5.14 (Debian) e 5.18 (Arch Linux). sprunge.us/RKHT
- Reproduzido com Perl v5.20.2 (windows)
- E
/(?R)/
em versões anteriores do Perl?
Resposta
brainfuck (2)
<.
Sim, depende da implementação. SIGSEGV é o resultado provável de um bom compilador.
Comentários
- Como é um compilador que segfaults naquele ” bom “? Esse
<
não deve ter efeito ou não deve ter efeito. - Produzir imediatamente um erro de tempo de execução na violação de limites é melhor porque permite que o programador encontre e corrija o bug como o mais rápido possível. Deixar o programa com erros ser executado por um tempo e corromper a memória ao acaso antes de travar apenas torna o problema mais difícil de diagnosticar. Prevenir totalmente o travamento, como você sugere, é o pior; o programador pode obter o programa ” funcionando ” e ser humilhado publicamente quando ele travar em compiladores e intérpretes padrão.
- 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. Não haveria problema em produzir um erro de tempo de execução mais descritivo, mas ter o sistema operacional detectando-o como um segfault é ótimo porque ele não ‘ tem nenhum custo de velocidade. (No caso de ‘ não estar claro, o próprio compilador não ‘ t segfault – ele produz executáveis que segfault assim que tentam para acessar a memória fora dos limites.)
- Você pode fornecer uma implementação que produza esse comportamento e foi criada antes da publicação deste desafio? Se não, esta resposta é inválida.
- As verificações de limites são específicas da implementação, então eu ‘ tenho certeza de que há alguns erros.Será que algum SIGSEGV? Eu duvido. Porém, há um grande número de programas que dependem da disposição do array à esquerda. Pode ser bastante conveniente ter armazenamento expansível em ambos os lados.
Resposta
Haskell, 31
foreign import ccall main::IO()
Isso produz um segfault quando compilado com GHC e executado. Não são necessários sinalizadores de extensão, pois a Interface de Função Estrangeira está no padrão Haskell 2010.
Comentários
- Awwww. Eu ia postar
import Foreign;main=peek nullPtr::IO Int
, mas isso ‘ s 40.
Resposta
Bash, 4 bytes
Golfe
. $0
Incluir recursivamente o script nele mesmo.
Explicação
Recursiva ” fonte ” (.) operação causa um estouro de pilha eventualmente, e como Bash não se integra com libsigsegv , isso resulta em um SIGSEGV.
Observe que este não é um bug, mas um comportamento esperado, conforme discutido aqui .
Teste
./bang Segmentation fault (core dumped)
Resposta
Python 33
import os os.kill(os.getpid(),11)
Enviando sinal 11 (SIGSEGV) em python.
Comentários
- Também 33 caracteres:
from os import*
ekill(getpid(),11)
Resposta
C – 11 (19) 7 (15) 6 (14) 1 caractere, AT & T x86 assembler – 8 (24) caracteres
A versão C é:
*(int*)0=0;
O programa inteiro (não exatamente ISO em conformidade, vamos supor que “K & RC) tenha 19 caracteres:
main(){*(int*)0=0;}
Assembler variante:
orl $0,0
Todo o programa tem 24 caracteres (apenas para avaliação, uma vez que não é realmente assembler):
main(){asm("orl $0,0");}
EDITAR :
Algumas variantes C. O primeiro usa inicialização zero da variável de ponteiro global:
*p;main(){*p=0;}
O segundo usa recursão infinita:
main(){main();}
A última variante é a mais curta – 7 (15) caracteres.
EDITAR 2 :
Inventou mais uma variante que é mais curta do que qualquer uma das anteriores – 6 (14) caracteres. Ele assume que as strings literais são colocadas em um segmento somente leitura.
main(){*""=0;}
EDITAR 3 :
E minha última tentativa – 1 caractere:
P
Basta compilar assim :
cc -o segv -DP="main(){main();}" segv.c
Comentários
- em C isn ‘ t main; apenas 5 caracteres
- : O linker não ‘ t verifica se main é uma função ou não. Basta passá-lo para o carregador e retornar sigsegv
- @FUZxxl Neste caso
main
é uma variável int global inicializada com zero, então o que obtemos é resultado da tentativa de executar alguns bytes zero. Em x86, ‘ seria algo comoadd %al,(%rax)
, que é uma instrução perfeitamente válida que tenta alcançar a memória no endereço armazenado em%rax
. As chances de ter um bom endereço lá são mínimas. - Claro que a última entrada pode ser usada para tudo, você só precisa fornecer os argumentos corretos do compilador. O que deve torná-lo o vencedor automático de qualquer concurso de golfe de código. 🙂
- Normalmente, sinalizadores de compilador diferentes daqueles que escolhem a versão do idioma a ser usada são contados para o total.
Resposta
Perl, 10/12 caracteres
Uma solução ligeiramente trapaceira é raspar um caractere Joey Adams “truque bash :
kill 11,$$
No entanto, para obter um segfault real em Perl, unpack p
é a solução óbvia :
unpack p,1x8
Tecnicamente, não é garantido um segfault, uma vez que o endereço 0x31313131 (ou 0x3131313131313131 em sistemas de 64 bits) apenas pode apontar para um espaço de endereço válido por acaso. Mas as chances são contra. Além disso, se o perl for transportado para plataformas em que os ponteiros tenham mais de 64 bits, o x8
precisará ser aumentado.
Comentários
- O que é isso
1x8
? - @HannesKarppila É ‘ uma forma abreviada de escrever
"11111111".
Resposta
dc – 7 caracteres
[dx0]dx
causa um estouro de pilha
Comentários
- Funciona, mas você pode elaborar? Por que ele se comporta dessa maneira?
-
[dx0]
armazenadx0
na pilha e, em seguida,d
duplica o elemento da pilha superior, entãox
exibe o elemento da pilha superior (dx0
) e o executa. O que duplica o elemento da pilha superior e começa a executá-lo … o0
precisa estar lá para evitar que isso seja uma chamada final, para que todos se acumulem.
Resposta
PicoLisp – 4 caracteres
$ pil : ("0) Segmentation fault
Isto é o comportamento pretendido. Conforme descrito em seu site:
Se algumas linguagens de programação afirmam ser o “Canivete suíço da programação”, o PicoLisp pode muito bem ser chamado de “Bisturi of Programming “: Afiado, preciso, pequeno e leve, mas também perigoso nas mãos de inexperientes.
Resposta
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
Comentários
- Belo primeiro post.
Resposta
Na verdade , 17 16 11 10 9 bytes
⌠[]+⌡9!*.
Se o procedimento acima não falhar, tente aumentar o número (os números com vários dígitos são especificados em Na verdade com dois-pontos à esquerda )
Falha o interpretador r explorando um bug em python envolvendo objetos itertools.chain
profundamente aninhados, que realmente usa para implementar o +
operador.
Resposta
OCaml, 13 bytes
Obj.magic 0 0
Isso usa a função Obj.magic
, que coage de forma insegura quaisquer dois tipos. Nesse caso, ele coage 0 (armazenado como o valor imediato 1, devido ao bit de tag usado pelo CG) para um tipo de função (armazenado como um ponteiro). Assim, ele tenta remover a referência do endereço 1 e isso, é claro, falhará em segfault.
Comentários
-
it coerces 0 (stored as the immediate value 1)
– por que 0 é armazenado como 1? - @Skyler veja editar
-
Obj.magic()0
é um caractere a menos 🙂
Resposta
Pyth, 3 caracteres
j1Z
Esta seria a parte em que explicaria como cheguei a essa resposta, exceto que legitimamente não tenho idéia . Se alguém pudesse me explicar isso, eu ficaria grato.
Aqui está em um intérprete online.
Explicação
j
quadrada a base e chama a si mesma 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.
Comentários
- Descobri algo! Ao navegar pela fonte de Pyth ‘ s, descobri que este código
j
em1
e0
, que tenta converter1
na base0
. Por que segfaults, eu não tenho ideia … - Veja aqui .
j
eleva ao quadrado a base e chama a si própria 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 IDEone
- @SeeRhino O interpretador Pyth define o limite de recursão para 100.000. Pelo menos no TIO, isso ‘ é suficiente para um segfault.
Resposta
C # – 62
System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);
C # / não seguro, 23 bytes
unsafe{int i=*(int*)0;}
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.
Comentários
- O
int i=*(int*)0;
retorna uma NullReferenceException para mim. - Você pode tentar acessar um local negativo, como
*(int*)-1=0
e obter uma violação de acesso. - A exceção específica é exatamente o que clr envolve-o e é insignificante. O próprio sistema operacional dá falha de seg em todos esses casos.
- A razão pela qual
*(int*)0=0
lança uma exceção provavelmente se deve à otimização. Especificamente, para evitar o custo de verificação denull
, o otimizador pode remover verificações de nulos, mas quando ocorre uma falha de segmentação, ele pode relançá-lo como umNullReferenceException
.
Resposta
19 caracteres em C
main(a){*(&a-1)=1;}
Ele corrompe o valor do endereço de retorno da função principal, portanto, obtém um SIGSEGV no retorno de main
.
Comentários
- Depende do layout do stack frame, então em algumas arquiteturas possivelmente não pode falhar.
- Por que não simplesmente
main;
oumain(){*""=0;}
? - @Sapphire_Brick
main;
já foi fornecido em outra resposta. - @saeedn Então, por que postar? Este não é ‘ nem mesmo o segundo para o mais curto!
- @Sapphire_Brick Na época, eu estava postando o meu,
main;
não ‘ não postei e não ‘ não sabia que funciona. Eu estava apenas apontando que já está dado e não adianta mudar minha resposta. Além disso, as pessoas aqui não ‘ não postam apenas para o mais curto, às vezes uma maneira diferente de resolver o problema também é interessante.
Resposta
Cython, 14
Isso geralmente é útil para fins de depuração.
a=(<int*>0)[0]
Resposta
J (6)
memf 1
memf
significa memória livre, 1
é interpretado como um ponteiro.
Comentários
- Por que
1
em vez de0
? É legal liberar um ponteiro nulo em J?
Resposta
Matlab – Sim, é possível!
Em uma resposta a uma pergunta minha, Amro veio com esta peculiaridade:
S = struct(); S = setfield(S, {}, "g", {}, 0)
Comentários
- Forneça a versão do Matlab – R2015B (e 2016B também) apenas gera um erro: Erro ao usar setfield (linha 56) Pelo menos um o índice é obrigatório.
- @FlorianCastellane Não é possível testar todas as versões agora, mas foi confirmado que oferece um segfault em algumas versões, a mais recente sendo a 2014b e a primeira 2012a.
Resposta
C – 14 caracteres
Certifique-se de compilar um arquivo vazio com cc -nostartfiles c.c
Explicação:
O que deu errado é que tratamos _start como se fosse uma função C, e tentei voltar dele. Na realidade, não é uma função. É apenas um símbolo no arquivo de objeto que o vinculador usa para localizar o ponto de entrada do programa. Quando nosso programa é invocado, ele é invocado diretamente. Se olharmos, veremos que o valor no topo da pilha é o número 1, que certamente é muito diferente de endereço. Na verdade, o que está na pilha é o valor argc do nosso programa. Depois disso, vêm os elementos da matriz argv, incluindo o elemento NULL de terminação, seguido pelos elementos de envp. E isso é tudo. Não há endereço de retorno na pilha.
Comentários
- I ‘ tenho certeza que você tem que pontuar com os argumentos adicionais
- Você tem que adicionar 14 bytes para o sinalizador especial.
- @ErikGolfer エ リ ッ ク ゴ ル ル ァ ー -nostartfiles é na verdade, 13 bytes de comprimento 🙂
- @CharlesPaulet Acho que você também tem que contar o espaço.
Resposta
Unix PDP-11 assembly, 18 bytes binários, 7 bytes fonte
(isso está se tornando um tema para mim, talvez porque é a única linguagem que eu meio que conheço que não- outro aqui faz.)
inc(r0)
Incrementa o único byte endereçado pelo valor inicial de r0 [que passa a ser 05162 de acordo com o depurador simh] a partir de 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 strip.
Eu fiz alguns tentativas de encurtar a fonte, mas sempre acabava tting um erro de sintaxe ou SIGBUS.