Écrivez le code le plus court qui cause une erreur de segmentation (SIGSEGV) dans n’importe quel langage de programmation.
75
Écrivez le code le plus court qui cause une erreur de segmentation (SIGSEGV) dans n’importe quel langage de programmation.
Réponses:
C, 5 personnages
C'est une déclaration de variable - le
int
type est implicite (fonctionnalité copiée à partir du langage B) et sa0
valeur par défaut. Lorsqu'elle est exécutée, cette option tente d'exécuter un nombre (les nombres ne sont pas exécutables) et les causesSIGSEGV
.Essayez-le en ligne!
la source
0
.static
les variables commencent comme0
, etmain;
sontstatic
, comme je l'ai déclaré en dehors de la fonction. c-faq.com/decl/initval.htmlmain
un int, il est situé dans.bss
, les fonctions sont généralement situées dans.text
. Lorsque le noyau charge le programme elf, il crée une page exécutable pour.text
et non. -executable for.bss
, donc en appelant main, vous passez à une page non-exécutable, et l'exécution de quelque chose sur une telle page est une faute de protection.main __attribute__((section(".text#")))=0xc3;
FTFY (du moins ça a l'air de revenir sans planter sur mon x86).const main=195;
. Ce qui est intéressant, c’est que ça marche, le but de ce défi de jouer au code était de faire en sorte que le code segfault, et non pas fonctionne :)Bash, 11
la source
Assembly (Linux, x86 à 64), 1 octet
Ce code segfaults.
la source
Python 2, 13
Windows signale un code d'erreur c00000fd (débordement de pile) qui, je suppose, est un sous-type d'erreur de segmentation.
Merci à Alex A. et Mego, il a été confirmé qu’il pouvait également causer des erreurs de segmentation sur les systèmes Mac et Linux. Python est le langage de choix pour le crash portable de vos programmes.
la source
Segmentation fault: 11
sur MacSegmentation fault (core dumped)
sur LinuxpdfTeX (51)
C’est en fait probablement un bogue , mais il n’est pas présent dans le TeX original, écrit par Knuth: compiler le code avec
tex filename.tex
au lieu depdftex filename.tex
ne produit pas de segfault.la source
LOLCODE, 4 octets
Ne fonctionne pas en ligne, uniquement dans l'interprète C.
la source
Python, 33 caractères
Source: http://bugs.python.org/issue1215#msg143236
Python, 60 caractères
Source: http://svn.python.org/view/python/trunk/Lib/test/crashers/recursive_call.py?view=markup
Voici la version Python sur laquelle je teste:
En général, l'interpréteur Python est difficile à planter, mais ce qui précède est abusif sélectif ...
la source
Forth - 3 personnages
(
@
est un chercher)la source
C, 18
la source
int func()
. c'est à dire une fonction retournantint
, prenant des paramètres non spécifiés. Dans ce cas, ilraise
s’agit d’une fonction renvoyant int, prenant un argument int, donc cela fonctionne (même si le compilateur se plaint).Perl (<5.14), 9 caractères
En 5.14, le moteur des expressions rationnelles a été rendu réentrant de sorte qu'il ne puisse pas être planté de cette façon, mais 5.12 et les versions antérieures segfont par défaut si vous essayez ceci.
la source
W32 .com exécutable - 0 octet
Cela semblera étrange, mais sur les systèmes Windows 32 bits, la création et l’exécution d’un fichier .com vide peut entraîner une erreur de segmentation, selon ... quelque chose. DOS l'accepte simplement (le 8086 n'ayant pas de gestion de mémoire, il n'y a pas de segments significatifs à blâmer) et Windows 64 bits refuse de l'exécuter (x86-64 n'ayant pas de mode v86 pour exécuter un fichier .com).
la source
brainfuck (2)
Oui, cela dépend de la mise en œuvre. SIGSEGV est le résultat probable d'un bon compilateur.
la source
<
devrait soit n'avoir aucun effet ou envelopper.Haskell, 31 ans
Cela produit une erreur de segmentation une fois compilé avec GHC et exécuté. Aucun indicateur d'extension n'est nécessaire, l'interface de fonction étrangère étant au standard Haskell 2010.
la source
C -
11 (19)7 (15)6 (14)1 caractères, assembleur AT & T x86 - 8 (24) caractèresLa version C est:
L'ensemble du programme (pas tout à fait conforme à ISO, supposons qu'il s'agisse de K & R C) comporte 19 caractères:
Variante d'assembleur:
Le programme entier a une longueur de 24 caractères (juste pour l'évaluation, car ce n'est pas réellement un assembleur):
EDIT :
Un couple de variantes C Le premier utilise l'initialisation zéro de la variable de pointeur global:
Le second utilise une récursion infinie:
La dernière variante est
la plus courte -7 (15) caractères.EDIT 2 :
Inventé une autre variante qui est plus courte que l'une des précédentes - 6 (14) caractères. Il suppose que les chaînes littérales sont placées dans un segment en lecture seule.
EDIT 3 :
Et mon dernier essai - 1 caractère long:
Il suffit de le compiler comme ça:
la source
main
s'agit d'une variable int globale initialisée à zéro. Nous obtenons donc le résultat d'une tentative d'exécution de zéro octet. En x86, ce serait quelque chose commeadd %al,(%rax)
une instruction parfaitement valide qui tente d’atteindre la mémoire à une adresse stockée dans%rax
. Les chances d'avoir une bonne adresse sont minimes.dc - 7 caractères
provoque un débordement de pile
la source
[dx0]
stockedx0
sur la pile, puisd
duplique l'élément de pile supérieur, puisx
affiche l'élément de pile supérieur (dx0
) et l'exécute. Ce qui duplique l’élément supérieur de la pile et commence à l’exécuter ... c’est0
nécessaire pour éviter que cela ne soit un appel final, de sorte qu’ils se développent tous.Perl, 10/12 caractères
Une solution légèrement tricheuse est de supprimer un personnage du tour basque de Joey Adams :
Cependant, obtenir une réelle erreur de segmentation dans Perl
unpack p
est la solution évidente:Techniquement, cette erreur de segmentation n'est pas garantie , car l'adresse 0x31313131 (ou 0x3131313131313131 sur les systèmes 64 bits) peut simplement pointer sur un espace adresse valide par hasard. Mais les chances sont contre elle. De plus, si perl est porté sur des plates-formes où les pointeurs ont une longueur supérieure à 64 bits,
x8
il faudra l'augmenter.la source
1x8
chose?"11111111".
Python 33
Envoi du signal 11 (SIGSEGV) en python.
la source
from os import*
etkill(getpid(),11)
OCaml, 13 octets
Ceci utilise la fonction
Obj.magic
, qui contraint deux types quelconques. Dans ce cas, il force 0 (stocké en tant que valeur immédiate 1 en raison du bit de balise utilisé par le GC) en un type de fonction (stocké sous la forme d'un pointeur). Ainsi, il essaie de déréférencer l'adresse 1, et ce sera bien sûr une erreur de segmentation.la source
it coerces 0 (stored as the immediate value 1)
- pourquoi 0 est-il stocké comme 1?Obj.magic()0
est un caractère plus court :)Bash, 4 octets
Golfé
Inclure récursivement le script en lui-même.
A expliqué
Une opération "source" récursive (.) Provoque éventuellement un débordement de pile et, comme Bash ne s'intègre pas à libsigsegv , il en résulte un SIGSEGV.
Notez qu'il ne s'agit pas d'un bogue, mais d'un comportement attendu, comme discuté ici .
Tester
Essayez-le en ligne!
la source
En fait ,
17 16 11 109 octetsEssayez-le en ligne!
Si ce qui précède ne plante pas, essayez d’augmenter le nombre (des nombres à plusieurs chiffres sont spécifiés dans En fait avec un signe deux-points)
Bloque l'interprète en exploitant un bogue dans Python impliquant des
itertools.chain
objets profondément imbriqués , qui utilise en réalité pour implémenter l'+
opérateur.la source
C # - 62
Édition: 23
Compiler avec / unsafe pour que celui-ci fonctionne. Pour une raison quelconque, je ne comprends pas,
*(int*)0=0
lève simplement une exception NullReferenceException, alors que cette version donne la violation d'accès appropriée.la source
int i=*(int*)0;
renvoie une exception NullReferenceException pour moi.*(int*)-1=0
une violation d'accès.*(int*)0=0
une exception est générée est probablement due à l'optimisation. En particulier, pour éviter les coûts de vérificationnull
, l'optimiseur peut supprimer les vérifications nulles, mais lorsqu'un défaut de segmentation se produit, il peut le redéfinir correctementNullReferenceException
.PicoLisp - 4 caractères
Ceci est le comportement prévu. Comme décrit sur leur site web:
la source
F90 - 39 octets
Compilation:
Exécution:
Matériaux:
la source
19 caractères en C
Il corrompt la valeur d'adresse de retour de la fonction principale et obtient donc un SIGSEGV au retour de
main
.la source
J (6)
memf
signifie mémoire libre,1
est interprété comme un pointeur.la source
Cython, 14
Cela est souvent utile pour le débogage.
la source
Assemblage Unix PDP-11, binaire 18 octets, source 7 octets
(Cela devient un thème pour moi, peut-être parce que c'est la seule langue que je sais en quelque sorte que personne d'autre ne connaît ici.)
Incrémente le seul octet adressé par la valeur initiale de r0 [qui se trouve être 05162 en fonction du débogueur simh] dès le début du programme.
Et, comme toujours, les octets superflus à la fin peuvent être supprimés avec strip.
J'ai fait quelques tentatives pour obtenir la source plus courte, mais j'ai toujours eu une erreur de syntaxe ou SIGBUS.
la source
Matlab - Oui c'est possible!
En réponse à une de mes questions , Amro a proposé cette bizarrerie:
la source
JavaScript shell, 7 octets
Efface absolument tout, pas seulement la portée actuelle qui provoque évidemment beaucoup de bouchons qui font exploser JS et segfault
la source
Pyth, 3 personnages
Ce serait la partie où j'explique comment j'ai trouvé cette réponse, sauf que je n'ai légitimement aucune idée . Si quelqu'un pouvait expliquer cela pour moi, je vous en serais reconnaissant.
La voici dans un interprète en ligne.
la source
j
sur1
et0
, qui tente de convertir1
en base0
. Pourquoi ces segfaults, je n'en ai aucune idée ...j
met la base en carré et s’appelle récursivement jusqu’à ce que la base soit au moins aussi grande que le nombre. Puisque la base est 0 , cela ne se produit jamais. Avec une limite de récursion suffisamment élevée, vous obtenez une erreur de segmentation.