Código mais curto que gera um SIGSEGV

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 .

Experimente online!

Comentários

  • @Macmade: na verdade, é 0. static variáveis começam como 0 e main; é 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 retorna int, 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)  

Experimente online!

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* e kill(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 como add %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] armazena dx0 na pilha e, em seguida, d duplica o elemento da pilha superior, então x exibe o elemento da pilha superior (dx0) e o executa. O que duplica o elemento da pilha superior e começa a executá-lo … o 0 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!*. 

Experimente online!

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.

Dennis ♦

Comentários

  • Descobri algo! Ao navegar pela fonte de Pyth ‘ s, descobri que este código j em 1 e 0, que tenta converter 1 na base 0. 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 de null, o otimizador pode remover verificações de nulos, mas quando ocorre uma falha de segmentação, ele pode relançá-lo como um NullReferenceException.

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; ou main(){*""=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 de 0? É 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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *