Найкоротший код, який піднімає SIGSEGV


Відповіді:


113

C, 5 символів

main;

Це змінна декларація - intтип мається на увазі (функція скопійована з мови B) і 0є значенням за замовчуванням. При виконанні це намагається виконати число (числа не виконуються) і викликає SIGSEGV.

Спробуйте в Інтернеті!


5
@Macmade: Власне, так і є 0. staticзмінні починаються як 0і main;є static, як я декларував це поза функцією. c-faq.com/decl/initval.html
Конрад Боровський

16
востаннє, коли я грав з цією річчю, я зрозумів, що для segfault є інша причина. Перш за все, зателефонувавши до головного, ви переходите до місця основного, а не до значення, інша річ - mainце int, він знаходиться в .bss, зазвичай функції розташовані в .text, коли ядро ​​завантажує програму elf, на яку створюється виконувана сторінка для, .textа не -виконання для .bss, тому, зателефонувавши на головну, ви переходите на невиконанну сторінку, а виконання чогось на такій сторінці є помилкою захисту.
mniip

23
Так, segfaults в C - це майже за замовчуванням: P
Пол Дрейпер,

1
main __attribute__((section(".text#")))=0xc3;FTFY (принаймні, здається, повертається без збоїв на моєму x86).
jozxyqk

2
@jozxyqk Або коротше const main=195;. Наскільки цікаво те, що він працює, метою цього завдання з гольфу з кодом було зробити код за замовчуванням, а не роботу :).
Конрад Боровський

74

Баш, 11      

kill -11 $$

44
Сигнал 11 в 11 символів. Здається легітимним.
nyuszika7h

12
@ nyuszika7h Я збирався підтвердити ваш коментар, але у вас зараз 11 оновлених заявок, тому я збираюся залишити його на цьому. : P
HyperNeutrino

3
@AlexL. інші люди, схоже, зіпсували це :(
theonlygusti

2
@theonlygusti Так ... Це дуже погано. :( Ну добре, тоді я можу це схвалити.
HyperNeutrino

2
До 42 заявок, без торкання!
seadoggie01

39

Збірка (Linux, x86-64), 1 байт

RET

Цей кодовий сегмент.


7
Як файл MSDOS .com, він запускається та закінчується без помилок.
JB

10
Моя думка: просто вказати "збірку" недостатньо, щоб зробити її за замовчуванням.
JB

52
@JB: У MS DOS жодна програма ніколи не призведе до помилки сегментації. Це тому, що MS DOS працює в реальному режимі, де захист пам’яті відсутній.
celtschk

1
@celtschk IIRC NTVDM виводиться за неіснуючими адресами та тими, які не виділені до MS-DOS.
ζ--

2
@celtschk: Ви можете його сегментувати як завгодно так: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] -> процесор піднімає основні SEGV (AFAIK, з ним ніхто не може впоратися).
Джошуа

26

Пітон 2, 13

exec'()'*7**6

Windows повідомляє про код помилки c00000fd (переповнення стека), який, я вважаю, є підтипом помилки сегментації.

Завдяки Алексу А. та Мего підтверджено, що він може спричинити помилки сегментації і в системах Mac та Linux. Python - це обрана мова для портативного збоїв ваших програм.


7
Segmentation fault: 11на Mac
Алекс А.

7
Segmentation fault (core dumped)в Linux
Mego

Це спочатку зависає?
Мега-людина

1
@MegaMan Як закінчити тривати час? Ні, 7 ** 6 - це приблизно близько 100 К, тому немає затримки.
feersum

Чому це працює? Це не здається на Python 3.6.8 на Mac OS.
Макс Гаснер

22

pdfTeX (51)

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

Це насправді, ймовірно, помилка , але вона відсутня в оригінальному TeX, написаному Knuth: компіляція коду з, tex filename.texа pdftex filename.texне створює segfault.



17

Пітон, 33 символи

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

Джерело: http://bugs.python.org/issue1215#msg143236

Пітон, 60 символів

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

Джерело: http://svn.python.org/view/python/trunk/Lib/test/crashers/recursive_call.py?view=markup

Це версія Python, яку я тестую на:

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

Взагалі інтерпретатора Python важко зазнати краху, але вищезгадане - селективна образливість ...


16

Далі - 3 символи

0 @

( @це збір)


1
Найкоротший досі, який працюватиме на сучасних системах.
Демі

2
Який четвертий? Гфорт просто говорить "Неправильна адреса пам'яті"
кішка

15

С, 18

main(){raise(11);}

чи потрібно додати #include <signal.h> до списку коду?
Флоріан Кастеллайн

5
@FlorianCastellane: у C90 та нижчих версіях для будь-якого виклику функції, здійсненого без видимого оголошення, компілятор неявно оголошує це як int func(). тобто функція, що повертається int, приймаючи невизначені параметри. У цьому випадку raiseфункція повертає int, приймаючи int аргумент, тому це виходить (навіть якщо компілятор скаржиться).
Hasturkun

14

Perl (<5,14), 9 символів

/(?{??})/

У 5.14 двигун регулярного випромінювання був зроблений ретентом, щоб його не можна було зламати таким чином, але 5.12 і раніше буде сегментарно, якщо ви спробуєте це.


Я можу відтворити це на Perl 5.14 (Debian) та 5.18 (Arch Linux). sprunge.us/RKHT
nyuszika7h

Відтворено з Perl v5.20.2 (windows)
mehi

14

Виконаний файл W32 .com - 0 байт

Це здасться дивним, але в 32-бітових системах Windows, створення та виконання порожнього файлу .com може спричинити сегментацію, залежно від ... чогось. DOS просто приймає це (у 8086 немає керування пам'яттю, немає помилкових сегментів для помилок), а 64-розрядна Windows відмовляється запускати її (x86-64 не має режиму v86 для запуску файлу .com у).


13

ебать на голові (2)

<.

Так, це залежить від реалізації. SIGSEGV - це ймовірний результат хорошого компілятора.


4
Як компілятор, який переходить на ті "добрі"? Це не <повинно мати ніякого ефекту, ані обертатися.
nyuszika7h

12
Одразу викликати помилку виконання під час порушення меж найкраще, оскільки це дозволяє програмісту знайти та виправити помилку якнайшвидше. Запуск програми-баггі на деякий час та пошкодження пам’яті випадково перед збоєм просто ускладнює діагностику проблеми. Попередження аварії цілком, як ви пропонуєте, є найгіршим; програміст може змусити програму "працювати", а потім бути приниженою публічно, коли вона нападає на стандартні компілятори та інтерпретатори.
Даніель Кристофані

1
І навпаки, виявити порушення меж перед виконанням не можливо взагалі, а також особливо корисно у випадках, коли це можливо. Створювати більш описову помилку виконання було б добре, але мати операційну систему як це сегментарно, це чудово, оскільки вона не має жодних витрат на швидкість. (У випадку, якщо це не зрозуміло, сам компілятор не сегментується - він створює виконувані файли, які є стандартними, як тільки вони намагаються отримати доступ до пам'яті поза межами.)
Даніель Крістофані,

4
Чи можете ви надати реалізацію, яка виробляє таку поведінку та була створена до опублікування цього виклику? Якщо ні, ця відповідь недійсна.
Mego

1
Перевірка меж є специфічною для реалізації, тому я впевнений, що є деякі, які могли б помилитися в цьому. Будь-який SIGSEGV, хоча? Я сумніваюся в цьому. Існує велика кількість програм, які залежать від обгортання масиву зліва. Це може бути досить зручно, маючи вирощування з обох сторін.
captncraig

12

Хаскелл, 31 рік

foreign import ccall main::IO()

Це створює segfault, коли компілюється з GHC та запускається. Не потрібні додаткові прапорці, оскільки зовнішній функціональний інтерфейс є стандартом Haskell 2010.


10

C - 11 (19) 7 (15) 6 (14) 1 символ, асемблер AT&T x86 - 8 (24) символів

Версія C така:

*(int*)0=0;

Вся програма (не зовсім сумісна з ISO, припустимо, це K&R C) триває 19 символів:

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

Варіант ассемблера:

orl $0,0

Вся програма триває 24 символів (лише для оцінки, оскільки насправді це не асемблер):

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

Редагувати :

Пара варіантів С. Перший використовує нульову ініціалізацію глобальної змінної вказівника:

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

У другому використовується нескінченна рекурсія:

main(){main();}

Останній варіант найкоротший - 7 (15) символів.

EDIT 2 :

Винайшли ще один варіант, який коротший, ніж будь-який із наведених вище, - 6 (14) символів. Він передбачає, що буквальні рядки розміщуються в сегменті, призначеному лише для читання.

main(){*""=0;}

EDIT 3 :

І моя остання спроба - 1 символ довгий:

P

Просто складіть його так:

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

3
в С не головний; лише 5 чареток
Ар'я

1
: Linker не перевіряє, є головним функція чи ні. Він просто передає його навантажувач і повертає sigsegv
Arya

1
@FUZxxl У цьому випадку main- глобальна змінна int, ініціалізована нулем, тому те, що ми отримуємо, є результатом спроби виконати кілька нульових байтів. У x86 це буде щось на кшталт, add %al,(%rax)що є цілком коректною інструкцією, яка намагається дійти до пам'яті за адресою, що зберігається %rax. Шанси мати хорошу адресу там мінімальні.
Олександр Бакулін

6
Звичайно, останній запис можна використовувати для всього, вам просто потрібно надати правильні аргументи компілятора. Що повинно зробити його автоматичним переможцем будь-якого змагання з коду з гольфу. :-)
celtschk

5
Зазвичай прапорці компілятора, крім тих, які вибирають мовну версію для використання, зараховуються до загальної кількості.
Джеррі Єремія

9

постійний струм - 7 знаків

[dx0]dx

викликає переповнення стека


Це твори, але чи можете ви докладно? Чому він так поводиться?
Стефан Гурішон

2
[dx0]зберігається dx0на стеку, потім dдублює верхній елемент стека, потім xспливає верхній елемент стека ( dx0) і виконує його. Котрий дублює верхній елемент стека і починає виконувати його ... 0потрібно бути там, щоб не було цього хвоста, тому всі вони накопичуються.
Бен Міллвуд

8

Perl, 10/12 символів

Трохи обманливе рішення полягає в тому, щоб відголити один шарм Джоуза Адамса на баш-хитрість :

kill 11,$$

Однак, щоб отримати справжній сегмент у Perl, unpack pце очевидне рішення:

unpack p,1x8

Технічно це не гарантується за замовчуванням, оскільки адреса 0x31313131 (або 0x3131313131313131 у 64-бітних системах) може випадково вказати на дійсний адресний простір. Але шанси проти цього. Крім того, якщо perl коли-небудь переноситься на платформи, де покажчики довші 64-х біт, його x8потрібно буде збільшити.


1
Що це за 1x8річ?
Ганнес Карппіла

@HannesKarppila Це короткий шлях"11111111".
Ilmari Karonen

8

Пітон 33

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

Посилає сигнал 11 (SIGSEGV) в пітоні.


2
Також 33 символи: from os import*таkill(getpid(),11)
Timtech

8

OCaml, 13 байт

Obj.magic 0 0

При цьому використовується функція Obj.magic, яка небезпечно примушує будь-які два типи. У цьому випадку він примушує 0 (зберігається як безпосереднє значення 1, завдяки біту тегів, використовуваним GC) до типу функції (зберігається як покажчик). Таким чином, він намагається знеструмити адресу 1, і це, звичайно, буде за замовчуванням.


1
it coerces 0 (stored as the immediate value 1)- чому 0 зберігається як 1?
Skyler

1
@Skyler див. Редагування
Demi

1
Obj.magic()0на один чар коротший :)
Бен Міллвуд

8

Bash, 4 байти

Гольф

. $0

Рекурсивно включайте сценарій в себе.

Пояснив

Рекурсивна операція "source" (.) Зрештою спричиняє переповнення стека, і оскільки Bash не інтегрується з libsigsegv , це призводить до SIGSEGV.

Зауважте, що це не помилка, а очікувана поведінка, про яку йдеться тут .

Тест

./bang 
Segmentation fault (core dumped)

Спробуйте в Інтернеті!


8

Власне , 17 16 11 10 9 байт

⌠[]+⌡9!*.

Спробуйте в Інтернеті!

Якщо вищезгадане не збивається, спробуйте збільшити число (багатоцифрові числа вказані фактично з провідною двокрапкою)

Збиває інтерпретатора, використовуючи помилку в python із залученням глибоко вкладених itertools.chainоб'єктів, які фактично використовується для реалізації +оператора.


7

C # - 62

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

Редагування: 23

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

Потрібно компілювати з / небезпечним для цього. Я чомусь не розумію, *(int*)0=0просто видає NullReferenceException, в той час як ця версія дає належне порушення доступу.


У int i=*(int*)0;повертає NullReferenceException для мене.
Пітер Олсон

Ви можете спробувати отримати доступ до негативного місцезнаходження, наприклад, *(int*)-1=0і отримати порушення доступу.
Пітер Олсон

Особливим винятком є ​​лише те, що клір обертає його, і є незначним. Сам ОС насправді в усіх цих випадках дає провину в сегменті.
captncraig

Причина, по якій *(int*)0=0кидається виняток, ймовірно, пов'язана з оптимізацією. Зокрема, щоб уникнути витрат на перевірку null, оптимізатор може видалити нульові перевірки, але коли виникає сегментація, він може повторно скинути його як належне NullReferenceException.
Конрад Боровський

7

PicoLisp - 4 символи

$ pil
: ('0)
Segmentation fault

Це цілеспрямована поведінка. Як описано на їхньому веб-сайті:

Якщо деякі мови програмування претендують на "нож програми програмування швейцарської армії", то PicoLisp цілком можна назвати "скальпелем програмування": гострий, точний, невеликий і легкий, але також небезпечний для руки недосвідченого.


7

F90 - 39 байт

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

Збірка:

gfortran segv.f90 -o segv 

Виконання:

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

Матеріали:

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

1
Гарний перший пост.
Rɪᴋᴇʀ

6

19 символів на С

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

Це пошкоджує значення зворотної адреси основної функції, тому при поверненні вона отримує SIGSEGV main.


Це залежить від компонування кадру стека, тому в деякій архітектурі це може не вийти з ладу.
Олександр Бакулін

6

J (6)

memf 1

memfозначає вільну пам'ять, 1інтерпретується як вказівник.



5

Збірка Unix PDP-11, 18 байт двійкового, 7 байт джерела

(це стає для мене темою, можливо, тому, що це єдина мова, яку я начебто знаю, що ніхто інший тут не робить.)

inc(r0)

Збільшує одиничний байт, адресований початковим значенням r0 [що трапляється 05162 за даними симх-відладчика] старту програми.

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

І, як завжди, сторонні байти в кінці можна видалити смужкою.

Я зробив кілька спроб скоротити джерело, але завжди отримував або синтаксичну помилку, або SIGBUS.


5

Матлаб - Так, це можливо!

У відповідь на моє запитання Амро придумав цю химерність:

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

Будь ласка, надайте версію Matlab - R2015B (та 2016B також) просто видає помилку: Помилка використання setfield (рядок 56) Принаймні один індекс необхідний.
Флоріан Кастеллан

@FlorianCastellane Не в змозі спробувати всі версії зараз, але було підтверджено, що вона дає сегментарний ряд у зовсім деяких версіях, остання 2014b та найдавніша 2012a.
Денніс Джахеруддін

5

Оболонка JavaScript, 7 байт

clear()

Очищає абсолютно все, не тільки нинішню сферу дії, яка, очевидно, спричиняє безліч борків, що призводить до того, що JS підірветься і збиється


За даними MDN (document.clear), це має робити щось лише в дійсно старих версіях Mozilla, і навіть тоді, що насправді є різними помилками у вашому досвіді?
tomsmeding

@tomsmeding це window.clear, FF безпосередньо цього не розкриває, це вбудована
людина-павук

5

Pyth, 3 символи

j1Z

Це була б частина, де я пояснюю, як я придумав цю відповідь, за винятком випадків, коли я законно не маю поняття . Якщо хтось міг би мені це пояснити, я буду вдячний.

Ось це в онлайн-перекладачі.

Пояснення

jквадратів бази та називає себе рекурсивно, доки база не буде принаймні такою великою, як число. Оскільки база дорівнює 0 , цього ніколи не буває. З достатньо високою межею рекурсії ви отримуєте segfault.

- Денніс ♦


Зрозуміло щось із! Переглянувши джерело Pyth, я виявив, що цей код працює jна 1і 0, який намагається перетворити 1на базу 0. Чому ці segfault, я поняття не маю ...
NoOneIsHere

1
Дивіться тут . jквадратів бази та називає себе рекурсивно, доки база не буде принаймні такою великою, як число. Оскільки база дорівнює 0 , цього ніколи не буває. З достатньо високою межею рекурсії ви отримуєте segfault.
Денніс

@Dennis IDEone
NoOneIsHere

@SeeRhino Перекладач Pyth встановлює межу рекурсії 100 000. Принаймні, на TIO, цього достатньо для сегмента за замовчуванням.
Денніс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.