Напишите кратчайший код, который вызывает ошибку сегментации (SIGSEGV) на любом языке программирования.
75
Напишите кратчайший код, который вызывает ошибку сегментации (SIGSEGV) на любом языке программирования.
Ответы:
C, 5 символов
Это объявление переменной -
int
тип подразумевается (функция скопирована с языка B) и0
является значением по умолчанию. При выполнении это пытается выполнить число (числа не являются исполняемыми) и вызываетSIGSEGV
.Попробуйте онлайн!
источник
0
.static
переменные начинаются как0
иmain;
естьstatic
, как я объявил вне функции. c-faq.com/decl/initval.htmlmain
- это int, в котором он находится.bss
, обычно в нем находятся функции.text
, когда ядро загружает программу elf, для которой она создает исполняемую страницу.text
и не -executable для.bss
, поэтому, вызывая main, вы переходите на неисполняемую страницу, и выполнение чего-либо на такой странице является ошибкой защиты.main __attribute__((section(".text#")))=0xc3;
FTFY (по крайней мере, он возвращается без сбоев на моем x86).const main=195;
. Интересно то, что он работает, и задача этого гольф-кода заключалась в том, чтобы сделать код сегфоутом, а не работать :).Баш, 11
источник
Сборка (Linux, x86-64), 1 байт
Этот код segfaults.
источник
Python 2, 13
Windows сообщает код ошибки c00000fd (переполнение стека), который, как я предполагаю, является подтипом ошибки сегментации.
Благодаря Алексу А. и Мего, подтверждается, что это также вызывает ошибки сегментации в системах Mac и Linux. Python является языком выбора для переносимого сбоя ваших программ.
источник
Segmentation fault: 11
на MacSegmentation fault (core dumped)
на LinuxpdfTeX (51)
На самом деле это, вероятно, ошибка , но ее нет в оригинальной версии TeX, написанной Knuth: компиляция кода с использованием
tex filename.tex
вместоpdftex filename.tex
не приводит к возникновению ошибки.источник
LOLCODE, 4 байта
Не работает онлайн, только в интерпретаторе C.
источник
Python, 33 символа
Источник: http://bugs.python.org/issue1215#msg143236
Python, 60 символов
Источник: http://svn.python.org/view/python/trunk/Lib/test/crashers/recursive_call.py?view=markup
Это версия Python, на которой я тестирую:
В общем, интерпретатор Python трудно сломать, но вышеизложенное - это избирательное оскорбление ...
источник
Далее - 3 персонажа
(
@
это выборка)источник
С, 18
источник
int func()
. то есть функция, возвращающаяint
, принимая неопределенные параметры. В этом случаеraise
это функция, возвращающая int и принимающая аргумент int, так что это работает (даже если компилятор жалуется).Perl (<5,14), 9 символов
В 5.14 механизм регулярных выражений был повторно введен, так что он не мог быть аварийно завершен таким образом, но 5.12 и более ранние версии будут работать с ошибками, если вы попробуете это.
источник
Исполняемый файл W32 .com - 0 байт
Это может показаться странным, но в 32-битных системах Windows создание и выполнение пустого .com-файла может вызвать segfault, в зависимости от ... чего-то. DOS просто принимает его (8086 не имеет управления памятью, нет значимых сегментов для сбоя), и 64-битная Windows отказывается его запускать (x86-64 не имеет режима v86 для запуска файла .com).
источник
брейкфук (2)
Да, это зависит от реализации. SIGSEGV - вероятный результат от хорошего компилятора.
источник
<
должно либо не иметь никакого эффекта, либо обернуться вокруг.Хаскелл, 31
Это создает segfault при компиляции с GHC и запуске. Флаги расширения не требуются, так как интерфейс внешних функций соответствует стандарту Haskell 2010.
источник
C -
11 (19)7 (15)6 (14)1 символов, сборщик AT & T x86 - 8 (24) символовC версия:
Вся программа (не совсем ISO-совместимая, давайте предположим, что это K & R C) имеет длину 19 символов:
Вариант ассемблера:
Вся программа длиной 24 символа (только для оценки, так как она на самом деле не ассемблер):
РЕДАКТИРОВАТЬ :
Пара вариантов C Первый использует нулевую инициализацию глобальной переменной указателя:
Второй использует бесконечную рекурсию:
Последний вариант
самый короткий -7 (15) символов.РЕДАКТИРОВАТЬ 2 :
Придумал еще один вариант, который короче любого из вышеперечисленных - 6 (14) символов. Предполагается, что буквенные строки помещаются в сегмент только для чтения.
РЕДАКТИРОВАТЬ 3 :
И моя последняя попытка - 1 символ длиной:
Просто скомпилируйте это так:
источник
main
это глобальная переменная int с нулевой инициализацией, поэтому мы получаем результат выполнения нескольких нулевых байтов. В x86 это будет что-то вродеadd %al,(%rax)
идеальной инструкции, которая пытается получить доступ к памяти по адресу, сохраненному в%rax
. Шансы на хороший адрес там минимальны.DC - 7 символов
вызывает переполнение стека
источник
[dx0]
сохраняетdx0
в стеке, затемd
дублирует верхний элемент стека, затемx
извлекает верхний элемент стека (dx0
) и выполняет его. Который дублирует верхний элемент стека и начинает его выполнять ...0
должен быть там, чтобы это не было хвостовым вызовом, чтобы они все накапливались.Perl, 10/12 символов
Немного обманывающее решение состоит в том, чтобы сбрить один символ с хитрости Джои Адамса :
Тем не менее, чтобы получить реальный segfault в Perl,
unpack p
это очевидное решение:Технически, это не гарантирует segfault, поскольку адрес 0x31313131 (или 0x3131313131313131 в 64-разрядных системах) может просто случайно указать на правильное адресное пространство. Но шансы против этого. Кроме того, если perl когда-либо портируется на платформы, где указатели длиннее 64 бит,
x8
нужно будет увеличить.источник
1x8
вещь?"11111111".
Python 33
Отправка сигнала 11 (SIGSEGV) в питоне.
источник
from os import*
аkill(getpid(),11)
OCaml, 13 байт
При этом используется функция
Obj.magic
, которая небезопасно приводит к любым двум типам. В этом случае он приводит 0 (сохраненный как непосредственное значение 1, из-за бита тега, используемого GC) к типу функции (сохраненный как указатель). Таким образом, он пытается разыменовать адрес 1, и это, конечно же, segfault.источник
it coerces 0 (stored as the immediate value 1)
- почему 0 хранится как 1?Obj.magic()0
на один символ короче :)Баш, 4 байта
Golfed
Рекурсивно включить скрипт в себя.
Разъяснения
Рекурсивная операция «source» (.) В конечном итоге вызывает переполнение стека, и, поскольку Bash не интегрируется с libsigsegv , это приводит к SIGSEGV.
Обратите внимание, что это не ошибка, а ожидаемое поведение, как описано здесь .
Контрольная работа
Попробуйте онлайн!
источник
На самом деле ,
17 16 11 109 байтПопробуйте онлайн!
Если приведенное выше не дает сбоя, попробуйте увеличить число (многозначные числа указаны в поле «На самом деле с начальным двоеточием»)
Сбой интерпретатора, используя ошибку в python, включающую глубоко вложенные
itertools.chain
объекты, которые фактически используются для реализации+
оператора.источник
C # - 62
Изменить: 23
Необходимо скомпилировать с / unsafe, чтобы этот работал. По какой-то причине я не понимаю,
*(int*)0=0
просто выдает исключение NullReferenceException, в то время как эта версия дает правильное нарушение доступаисточник
int i=*(int*)0;
возвращает NullReferenceException для меня.*(int*)-1=0
получить и получить нарушение прав доступа.*(int*)0=0
генерируется исключение, скорее всего, связана с оптимизацией. В частности, чтобы избежать затрат на проверкуnull
, оптимизатор может удалить нулевые проверки, но когда происходит сбой, он может отбросить его как должноеNullReferenceException
.PicoLisp - 4 персонажа
Это намеренное поведение. Как описано на их сайте:
источник
F90 - 39 байт
Компиляция:
Исполнение:
материалы:
источник
19 символов в С
Он искажает значение адреса возврата основной функции, поэтому он возвращает SIGSEGV при возврате
main
.источник
J (6)
memf
означает свободную память,1
интерпретируется как указатель.источник
Cython, 14
Это часто бывает полезно для отладки.
источник
Сборка Unix PDP-11, 18-байтовый двоичный файл, 7-байтовый источник
(это становится темой для меня, возможно, потому что это единственный язык, который я знаю, что никто другой здесь не делает.)
Увеличивает единичный байт, адресуемый начальным значением r0 [которое, по данным отладчика simh, равно 05162] при запуске программы.
И, как всегда, посторонние байты на конце могут быть удалены с помощью полосы.
Я сделал несколько попыток сократить исходный код, но всегда получал либо ошибку синтаксиса, либо SIGBUS.
источник
Матлаб - Да, это возможно!
В ответ на мой вопрос Амро придумал такую причуду:
источник
JavaScript Shell, 7 байтов
Удаляет абсолютно все, не только текущую область видимости, которая, очевидно, приводит к большому количеству ошибок, что приводит к взрыву и сбою JS
источник
Pyth, 3 символа
В этой части я объясню, как я пришел с этим ответом, за исключением того, что я не имею ни малейшего понятия . Если бы кто-нибудь мог объяснить это для меня, я был бы благодарен.
Вот это в онлайн-переводчике.
источник
j
на1
и0
, который пытается преобразовать1
в базу0
. Почему это segfaults, я понятия не имею ...j
возводит в квадрат базу и вызывает себя рекурсивно, пока база не станет хотя бы такой же большой, как число. Поскольку база равна 0 , этого никогда не происходит. При достаточно высоком рекурсивном пределе вы получаете ошибку сегмента.