Напишіть найкоротший код, який викликає помилку сегментації (SIGSEGV) будь-якою мовою програмування.
Напишіть найкоротший код, який викликає помилку сегментації (SIGSEGV) будь-якою мовою програмування.
Відповіді:
main;
Це змінна декларація - intтип мається на увазі (функція скопійована з мови B) і 0є значенням за замовчуванням. При виконанні це намагається виконати число (числа не виконуються) і викликає SIGSEGV.
0. staticзмінні починаються як 0і main;є static, як я декларував це поза функцією. c-faq.com/decl/initval.html
mainце int, він знаходиться в .bss, зазвичай функції розташовані в .text, коли ядро завантажує програму elf, на яку створюється виконувана сторінка для, .textа не -виконання для .bss, тому, зателефонувавши на головну, ви переходите на невиконанну сторінку, а виконання чогось на такій сторінці є помилкою захисту.
main __attribute__((section(".text#")))=0xc3;FTFY (принаймні, здається, повертається без збоїв на моєму x86).
const main=195;. Наскільки цікаво те, що він працює, метою цього завдання з гольфу з кодом було зробити код за замовчуванням, а не роботу :).
kill -11 $$
RET
Цей кодовий сегмент.
exec'()'*7**6
Windows повідомляє про код помилки c00000fd (переповнення стека), який, я вважаю, є підтипом помилки сегментації.
Завдяки Алексу А. та Мего підтверджено, що він може спричинити помилки сегментації і в системах Mac та Linux. Python - це обрана мова для портативного збоїв ваших програм.
Segmentation fault: 11на Mac
Segmentation fault (core dumped)в Linux
\def~#1{\meaning}\write0{\expandafter~\string}\bye
Це насправді, ймовірно, помилка , але вона відсутня в оригінальному TeX, написаному Knuth: компіляція коду з, tex filename.texа pdftex filename.texне створює segfault.
OBTW
Не працює в Інтернеті, лише в інтерпретаторі С.
>>> import ctypes;ctypes.string_at(0)
Segmentation fault
Джерело: http://bugs.python.org/issue1215#msg143236
>>> 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 важко зазнати краху, але вищезгадане - селективна образливість ...
main(){raise(11);}
int func(). тобто функція, що повертається int, приймаючи невизначені параметри. У цьому випадку raiseфункція повертає int, приймаючи int аргумент, тому це виходить (навіть якщо компілятор скаржиться).
/(?{??})/
У 5.14 двигун регулярного випромінювання був зроблений ретентом, щоб його не можна було зламати таким чином, але 5.12 і раніше буде сегментарно, якщо ви спробуєте це.
Це здасться дивним, але в 32-бітових системах Windows, створення та виконання порожнього файлу .com може спричинити сегментацію, залежно від ... чогось. DOS просто приймає це (у 8086 немає керування пам'яттю, немає помилкових сегментів для помилок), а 64-розрядна Windows відмовляється запускати її (x86-64 не має режиму v86 для запуску файлу .com у).
<.
Так, це залежить від реалізації. SIGSEGV - це ймовірний результат хорошого компілятора.
<повинно мати ніякого ефекту, ані обертатися.
foreign import ccall main::IO()
Це створює segfault, коли компілюється з GHC та запускається. Не потрібні додаткові прапорці, оскільки зовнішній функціональний інтерфейс є стандартом Haskell 2010.
Версія 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
main- глобальна змінна int, ініціалізована нулем, тому те, що ми отримуємо, є результатом спроби виконати кілька нульових байтів. У x86 це буде щось на кшталт, add %al,(%rax)що є цілком коректною інструкцією, яка намагається дійти до пам'яті за адресою, що зберігається %rax. Шанси мати хорошу адресу там мінімальні.
[dx0]dx
викликає переповнення стека
[dx0]зберігається dx0на стеку, потім dдублює верхній елемент стека, потім xспливає верхній елемент стека ( dx0) і виконує його. Котрий дублює верхній елемент стека і починає виконувати його ... 0потрібно бути там, щоб не було цього хвоста, тому всі вони накопичуються.
Трохи обманливе рішення полягає в тому, щоб відголити один шарм Джоуза Адамса на баш-хитрість :
kill 11,$$
Однак, щоб отримати справжній сегмент у Perl, unpack pце очевидне рішення:
unpack p,1x8
Технічно це не гарантується за замовчуванням, оскільки адреса 0x31313131 (або 0x3131313131313131 у 64-бітних системах) може випадково вказати на дійсний адресний простір. Але шанси проти цього. Крім того, якщо perl коли-небудь переноситься на платформи, де покажчики довші 64-х біт, його x8потрібно буде збільшити.
1x8річ?
"11111111".
Obj.magic 0 0
При цьому використовується функція Obj.magic, яка небезпечно примушує будь-які два типи. У цьому випадку він примушує 0 (зберігається як безпосереднє значення 1, завдяки біту тегів, використовуваним GC) до типу функції (зберігається як покажчик). Таким чином, він намагається знеструмити адресу 1, і це, звичайно, буде за замовчуванням.
it coerces 0 (stored as the immediate value 1)- чому 0 зберігається як 1?
Obj.magic()0на один чар коротший :)
Гольф
. $0
Рекурсивно включайте сценарій в себе.
Пояснив
Рекурсивна операція "source" (.) Зрештою спричиняє переповнення стека, і оскільки Bash не інтегрується з libsigsegv , це призводить до SIGSEGV.
Зауважте, що це не помилка, а очікувана поведінка, про яку йдеться тут .
Тест
./bang
Segmentation fault (core dumped)
⌠[]+⌡9!*.
Якщо вищезгадане не збивається, спробуйте збільшити число (багатоцифрові числа вказані фактично з провідною двокрапкою)
Збиває інтерпретатора, використовуючи помилку в python із залученням глибоко вкладених itertools.chainоб'єктів, які фактично використовується для реалізації +оператора.
System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);
unsafe{int i=*(int*)0;}
Потрібно компілювати з / небезпечним для цього. Я чомусь не розумію, *(int*)0=0просто видає NullReferenceException, в той час як ця версія дає належне порушення доступу.
int i=*(int*)0;повертає NullReferenceException для мене.
*(int*)-1=0і отримати порушення доступу.
*(int*)0=0кидається виняток, ймовірно, пов'язана з оптимізацією. Зокрема, щоб уникнути витрат на перевірку null, оптимізатор може видалити нульові перевірки, але коли виникає сегментація, він може повторно скинути його як належне NullReferenceException.
$ pil
: ('0)
Segmentation fault
Це цілеспрямована поведінка. Як описано на їхньому веб-сайті:
Якщо деякі мови програмування претендують на "нож програми програмування швейцарської армії", то PicoLisp цілком можна назвати "скальпелем програмування": гострий, точний, невеликий і легкий, але також небезпечний для руки недосвідченого.
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
main(a){*(&a-1)=1;}
Це пошкоджує значення зворотної адреси основної функції, тому при поверненні вона отримує SIGSEGV main.
(це стає для мене темою, можливо, тому, що це єдина мова, яку я начебто знаю, що ніхто інший тут не робить.)
inc(r0)
Збільшує одиничний байт, адресований початковим значенням r0 [що трапляється 05162 за даними симх-відладчика] старту програми.
0000000 000407 000002 000000 000000 000000 000000 000000 000000
0000020 005210 000000
І, як завжди, сторонні байти в кінці можна видалити смужкою.
Я зробив кілька спроб скоротити джерело, але завжди отримував або синтаксичну помилку, або SIGBUS.
У відповідь на моє запитання Амро придумав цю химерність:
S = struct();
S = setfield(S, {}, 'g', {}, 0)
clear()
Очищає абсолютно все, не тільки нинішню сферу дії, яка, очевидно, спричиняє безліч борків, що призводить до того, що JS підірветься і збиється
j1Z
Це була б частина, де я пояснюю, як я придумав цю відповідь, за винятком випадків, коли я законно не маю поняття . Якщо хтось міг би мені це пояснити, я буду вдячний.
Пояснення
jквадратів бази та називає себе рекурсивно, доки база не буде принаймні такою великою, як число. Оскільки база дорівнює 0 , цього ніколи не буває. З достатньо високою межею рекурсії ви отримуєте segfault.
jна 1і 0, який намагається перетворити 1на базу 0. Чому ці segfault, я поняття не маю ...