Кратчайший код, который вызывает SIGSEGV


Ответы:


113

C, 5 символов

main;

Это объявление переменной - intтип подразумевается (функция скопирована с языка B) и 0является значением по умолчанию. При выполнении это пытается выполнить число (числа не являются исполняемыми) и вызывает SIGSEGV.

Попробуйте онлайн!


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

16
в прошлый раз, когда я играл с этой вещью, я понял, что есть другая причина для сегфо. Прежде всего, вызывая main, вы переходите к местоположению main, а не к значению, другое main- это int, в котором он находится .bss, обычно в нем находятся функции .text, когда ядро ​​загружает программу elf, для которой она создает исполняемую страницу .textи не -executable для .bss, поэтому, вызывая main, вы переходите на неисполняемую страницу, и выполнение чего-либо на такой странице является ошибкой защиты.
Мниип

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

Этот код segfaults.


7
Как файл MSDOS .com, он запускается и завершается без ошибок.
JB

10
Моя точка зрения такова: просто указать «сборку» недостаточно, чтобы сделать ее сегфоутом.
JB

53
@JB: В MS DOS, не программа не будет когда - либо производить ошибку сегментации. Это потому, что MS DOS работает в реальном режиме, где защита памяти отсутствует.
celtschk

1
@celtschk IIRC NTVDM выберет несуществующие адреса и адреса, не выделенные для MS-DOS.
ζ--

2
@celtschk: Вы можете в любом случае segfault так: mov bx, 1000h; Shr Ebx, 4; mov eax, [ebx] -> CPU поднимает базовый SEGV (AFAIK, хотя никто не справится с этим).
Джошуа

26

Python 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не приводит к возникновению ошибки.



17

Python, 33 символа

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

Источник: http://bugs.python.org/issue1215#msg143236

Python, 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
Какой Форт? Gforth просто говорит «Неверный адрес памяти»
кот

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-файла может вызвать segfault, в зависимости от ... чего-то. DOS просто принимает его (8086 не имеет управления памятью, нет значимых сегментов для сбоя), и 64-битная Windows отказывается его запускать (x86-64 не имеет режима v86 для запуска файла .com).


13

брейкфук (2)

<.

Да, это зависит от реализации. SIGSEGV - вероятный результат от хорошего компилятора.


4
Каков компилятор, который segfaults на этом "хорошо"? Это <должно либо не иметь никакого эффекта, либо обернуться вокруг.
nyuszika7h

12
Лучше сразу вызвать ошибку времени выполнения при нарушении границ, поскольку это позволяет программисту найти и исправить ошибку как можно быстрее. Если позволить глючной программе работать некоторое время и бесполезно повредить память перед сбоем, это только затруднит диагностику проблемы. Полное предотвращение аварии, как вы предполагаете, является худшим; Программист может заставить программу «работать», а затем быть публично униженной, когда она падает на стандартных компиляторах и интерпретаторах.
Даниэль Кристофани

1
И наоборот, выявление нарушений границ до времени выполнения вообще невозможно, и особенно полезно в тех случаях, когда это возможно. Было бы неплохо создать более описательную ошибку во время выполнения, но иметь операционную систему, чтобы она воспринимала ее как segfault, было бы здорово, потому что она не требовала затрат на скорость. (В случае, если неясно, сам компилятор не выполняет segfault - он создает исполняемые файлы, которые segfault, как только они пытаются получить доступ к памяти вне пределов.)
Даниэль Кристофани,

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");}

РЕДАКТИРОВАТЬ :

Пара вариантов C Первый использует нулевую инициализацию глобальной переменной указателя:

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

Второй использует бесконечную рекурсию:

main(){main();}

Последний вариант самый короткий - 7 (15) символов.

РЕДАКТИРОВАТЬ 2 :

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

main(){*""=0;}

РЕДАКТИРОВАТЬ 3 :

И моя последняя попытка - 1 символ длиной:

P

Просто скомпилируйте это так:

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

3
в Си не главное; только 5 персонажей
Арья

1
: Компоновщик не проверяет, является ли main функцией или нет. Он просто передает его загрузчику и возвращает sigsegv
Arya

1
@FUZxxl В данном случае mainэто глобальная переменная int с нулевой инициализацией, поэтому мы получаем результат выполнения нескольких нулевых байтов. В x86 это будет что-то вроде add %al,(%rax)идеальной инструкции, которая пытается получить доступ к памяти по адресу, сохраненному в %rax. Шансы на хороший адрес там минимальны.
Александр Бакулин

6
Конечно, последняя запись может использоваться для всего, вы просто должны предоставить правильные аргументы компилятора. Что должно сделать его автоматическим победителем любого соревнования по коду. :-)
celtschk

5
Обычно флаги компилятора, отличные от тех, которые выбирают используемую версию языка, засчитываются в общую сумму.
Джерри Иеремия

9

DC - 7 символов

[dx0]dx

вызывает переполнение стека


Работает, но можете ли вы уточнить? Почему так себя ведет?
Стефан Гурихон

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

8

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

Немного обманывающее решение состоит в том, чтобы сбрить один символ с хитрости Джои Адамса :

kill 11,$$

Тем не менее, чтобы получить реальный segfault в Perl, unpack pэто очевидное решение:

unpack p,1x8

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


1
Что это за 1x8вещь?
Ханнес Карппила

@HannesKarppila Это короткий способ написать"11111111".
Илмари Каронен

8

Python 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, и это, конечно же, segfault.


1
it coerces 0 (stored as the immediate value 1)- почему 0 хранится как 1?
Скайлер

1
@Skyler см редактировать
Деми

1
Obj.magic()0на один символ короче :)
Бен Милвуд

8

Баш, 4 байта

Golfed

. $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;}

Необходимо скомпилировать с / unsafe, чтобы этот работал. По какой-то причине я не понимаю, *(int*)0=0просто выдает исключение NullReferenceException, в то время как эта версия дает правильное нарушение доступа


В int i=*(int*)0;возвращает NullReferenceException для меня.
Питер Олсон

Вы можете попытаться получить доступ к отрицательному местоположению, например *(int*)-1=0получить и получить нарушение прав доступа.
Питер Олсон

Конкретное исключение - это то, во что это помещает clr, и оно незначительно. Сама ОС фактически выдает ошибку сегмента во всех этих случаях.
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
Хороший первый пост.
2016 года

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 [которое, по данным отладчика simh, равно 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 Shell, 7 байтов

clear()

Удаляет абсолютно все, не только текущую область видимости, которая, очевидно, приводит к большому количеству ошибок, что приводит к взрыву и сбою JS


Согласно MDN (document.clear), это должно что-то делать только в действительно старых версиях Mozilla, и даже тогда, что на самом деле может привести к ошибкам в вашем опыте?
Томсминг

@tomsmeding это window.clear, FF напрямую не раскрывает это, это встроенная
паучья обезьяна

5

Pyth, 3 символа

j1Z

В этой части я объясню, как я пришел с этим ответом, за исключением того, что я не имею ни малейшего понятия . Если бы кто-нибудь мог объяснить это для меня, я был бы благодарен.

Вот это в онлайн-переводчике.

объяснение

jвозводит в квадрат базу и вызывает себя рекурсивно, пока база не станет хотя бы такой же большой, как число. Поскольку база равна 0 , этого никогда не происходит. При достаточно высоком рекурсивном пределе вы получаете ошибку сегмента.

- Денис ♦


Что-то понял! От просмотра источника Pyth, я обнаружил , что делает этот код jна 1и 0, который пытается преобразовать 1в базу 0. Почему это segfaults, я понятия не имею ...
NoOneIsHere

1
Смотрите здесь . jвозводит в квадрат базу и вызывает себя рекурсивно, пока база не станет хотя бы такой же большой, как число. Поскольку база равна 0 , этого никогда не происходит. При достаточно высоком рекурсивном пределе вы получаете ошибку сегмента.
Деннис

@Dennis IDEone
NoOneIsHere

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