Jest to deklaracja zmiennej - inttyp jest domyślny (funkcja skopiowana z języka B) i 0jest wartością domyślną. Podczas wykonywania próbuje wykonać liczbę (liczby nie są wykonywalne) i powoduje SIGSEGV.
@Macmade: Właściwie to jest 0. staticzmienne zaczynają się 0i main;są static, jak zadeklarowałem, poza funkcją. c-faq.com/decl/initval.html
Konrad Borowski
16
ostatnim razem, gdy bawiłem się tą rzeczą, doszedłem do wniosku, że segfault ma inny powód. Po pierwsze, wywołując main przeskakujesz do lokalizacji main, a nie do wartości, inną rzeczą jest mainint, jest ona zlokalizowana .bss, zwykle funkcje są zlokalizowane .text, kiedy jądro ładuje program elf, tworzy stronę wykonywalną .texti nie -wykonalne .bss, więc wywołując main, przeskakujesz na stronę niewykonywalną, a wykonanie czegoś na takiej stronie jest błędem ochrony.
mniip,
23
Tak, awarie w C są w zasadzie domyślne: P
Paul Draper
1
main __attribute__((section(".text#")))=0xc3;FTFY (przynajmniej wydaje się, że powraca bez awarii na moim x86).
jozxyqk
2
@jozxyqk Albo krótszy const main=195;. Interesujące jest to, że działa, celem tego golfowego wyzwania golfowego było sprawienie, by kod działał nieprawidłowo, a nie działał :).
Jako plik MSDOS .com działa i kończy się bezbłędnie.
JB
10
Chodzi mi o to: samo określenie „zestawu” nie wystarczy, aby uczynić go segregującym.
JB
52
@JB: W MS DOS żaden program nigdy nie spowoduje błędu segmentacji. To dlatego, że MS DOS działa w trybie rzeczywistym, w którym ochrona pamięci nie istnieje.
celtschk
1
@celtschk IIRC NTVDM będzie działał na nieistniejących adresach i nieprzypisanych do MS-DOS.
ζ--
2
@celtschk: Możesz segfault to tak czy inaczej: mov bx, 1000h; shr ebx, 4; mov eax, [ebx] -> CPU podnosi bazowy SEGV (AFAIK nie ma jednak nikogo, kto mógłby to obsłużyć).
Joshua,
26
Python 2, 13
exec'()'*7**6
System Windows zgłasza kod błędu c00000fd (przepełnienie stosu), który, jak zakładam, jest podtypem błędu segmentacji.
Dzięki Alex A. i Mego potwierdzono, że powoduje błędy segmentacji również w systemach Mac i Linux. Python jest wybranym językiem do przenośnego zawieszania programów.
Jest to prawdopodobnie błąd , ale nie jest obecny w oryginalnym TeX-ie napisanym przez Knutha: kompilacja kodu tex filename.texzamiast pdftex filename.texnie powoduje awarii pliku.
czy musisz dodać #include <signal.h> do listy kodów?
Florian Castellane
5
@FlorianCastellane: w C90 i niższych, dla każdego wywołania funkcji wykonanego bez widocznej deklaracji, kompilator domyślnie deklaruje to jako int func(). tj. funkcja zwracająca int, przyjmująca nieokreślone parametry. W tym przypadku raisefunkcja zwraca int, biorąc argument int, więc to działa (nawet jeśli kompilator narzeka).
Hasturkun
14
Perl (<5,14), 9 znaków
/(?{??})/
W wersji 5.14 silnik regex został ponownie wprowadzony, aby nie można go było rozbić w ten sposób, ale w wersji 5.12 i wcześniejszej nastąpi awaria, jeśli spróbujesz tego.
Mogę to odtworzyć na Perlu 5.14 (Debian) i 5.18 (Arch Linux). sprunge.us/RKHT
nyuszika7h
Reprodukcja z Perl v5.20.2 (Windows)
Mehi
14
Plik wykonywalny W32 .com - 0 bajtów
Wydaje się to dziwne, ale w 32-bitowych systemach Windows tworzenie i wykonywanie pustego pliku .com może powodować awarie, w zależności od ... czegoś. DOS po prostu akceptuje to (8086 nie ma zarządzania pamięcią, nie ma żadnych znaczących segmentów do uszkodzenia), a 64-bitowy system Windows odmawia uruchomienia (x86-64 nie ma trybu v86 do uruchomienia pliku .com).
W jaki sposób kompilator segreguje ten „dobry”? To nie <powinno mieć żadnego efektu ani się zawijać.
nyuszika7h
12
Najlepszym rozwiązaniem jest natychmiastowe wygenerowanie błędu czasu wykonania w przypadku naruszenia granic, ponieważ pozwala on programistom znaleźć i naprawić błąd tak szybko, jak to możliwe. Pozostawienie błędnego programu na chwilę i przypadkowe uszkodzenie pamięci przed awarią tylko utrudnia diagnozowanie problemu. Najgorsze jest całkowite zapobieganie katastrofie, jak sugerujesz. programista może „uruchomić” program, a następnie zostać publicznie upokorzony, gdy zawiesi się na standardowych kompilatorach i interpretatorach.
Daniel Cristofani,
1
I odwrotnie, łapanie naruszeń granic przed uruchomieniem nie jest ogólnie możliwe, ani szczególnie przydatne w przypadkach, w których jest to możliwe. Bardziej opisowy błąd czasu wykonywania byłby w porządku, ale system operacyjny przechwytuje go jako awarię, jest świetny, ponieważ nie wiąże się z żadnymi kosztami prędkości. (W przypadku, gdy nie jest to jasne, sam kompilator nie segfault - generuje pliki wykonywalne, które segfault, gdy tylko spróbują uzyskać dostęp do pamięci poza granicami.)
Daniel Cristofani,
4
Czy możesz podać implementację, która powoduje takie zachowanie i została utworzona przed opublikowaniem tego wyzwania? Jeśli nie, ta odpowiedź jest nieprawidłowa.
Mego
1
Kontrole graniczne są specyficzne dla implementacji, więc jestem pewien, że są pewne błędy, które mogą na nim wystąpić. Czy jakikolwiek SIGSEGV? Wątpię. Istnieje jednak duża liczba programów, które zależą od zawijania tablicy po lewej stronie. Wygodne może być przechowywanie po obu stronach.
captncraig
12
Haskell, 31
foreign import ccall main::IO()
Powoduje to segfault po skompilowaniu z GHC i uruchomieniu. Flagi rozszerzeń nie są potrzebne, ponieważ interfejs funkcji zagranicznej znajduje się w standardzie Haskell 2010.
C - 11 (19) 7 (15) 6 (14) 1 znaki, asembler AT&T x86 - 8 (24) znaków
Wersja C to:
*(int*)0=0;
Cały program (niezupełnie zgodny z ISO, załóżmy, że to K&R C) ma 19 znaków:
main(){*(int*)0=0;}
Wariant asemblera:
orl $0,0
Cały program ma 24 znaki (tylko do oceny, ponieważ tak naprawdę nie jest asemblerem):
main(){asm("orl $0,0");}
EDYCJA :
Kilka wariantów C. Pierwszy wykorzystuje zerową inicjalizację globalnej zmiennej wskaźnika:
*p;main(){*p=0;}
Drugi wykorzystuje nieskończoną rekurencję:
main(){main();}
Ostatni wariant jest najkrótszy - 7 (15) znaków.
EDYCJA 2 :
Wymyślił jeszcze jeden wariant, który jest krótszy niż którykolwiek z powyższych - 6 (14) znaków. Zakłada, że dosłowne ciągi znaków są umieszczane w segmencie tylko do odczytu.
: Linker nie sprawdza, czy main jest funkcją, czy nie. Po prostu przekazuje ją do modułu ładującego i zwraca sigsegv
Arya
1
@FUZxxl W tym przypadku mainjest globalna zmienna int inicjowana zerem, więc otrzymujemy wynik próby wykonania kilku bajtów zerowych. W x86 byłoby to coś w rodzaju add %al,(%rax)całkowicie poprawnej instrukcji, która próbuje dotrzeć do pamięci pod adresem zapisanym w %rax. Szanse na dobry adres są minimalne.
Alexander Bakulin
6
Oczywiście do wszystkiego można użyć ostatniego wpisu, wystarczy podać odpowiednie argumenty kompilatora. Co powinno uczynić go automatycznym zwycięzcą każdego konkursu golfowego z kodem. :-)
celtschk
5
Zazwyczaj flagi kompilatora inne niż te, które wybierają używaną wersję językową, są wliczane do sumy.
Czy działa, ale czy możesz opracować? Dlaczego tak się zachowuje?
Stéphane Gourichon
2
[dx0]zapisuje dx0na stosie, następnie dduplikuje element górnego stosu, a następnie xwysuwa element górnego stosu ( dx0) i wykonuje go. Który duplikuje element najwyższego stosu i zaczyna go wykonywać ... 0musi tam być, aby zapobiec wywołaniu ogona, więc wszystkie się gromadzą.
Ben Millwood,
8
Perl, 10/12 znaków
Nieco cheatycznym rozwiązaniem jest ogolenie jednego kawałka sztuczki Joey Adamsa :
kill 11,$$
Jednak, aby uzyskać prawdziwy błąd w Perlu, unpack pjest oczywiste rozwiązanie:
unpack p,1x8
Technicznie nie jest to gwarantowane segfault, ponieważ adres 0x31313131 (lub 0x313131313131313131 w systemach 64-bitowych) może przypadkowo wskazywać prawidłową przestrzeń adresową. Ale szanse są przeciwne. Ponadto, jeśli perl jest kiedykolwiek przenoszony na platformy, na których wskaźniki są dłuższe niż 64 bity, x8należy je zwiększyć.
Również 33 znaki: from os import*ikill(getpid(),11)
Timtech
8
OCaml, 13 bajtów
Obj.magic 0 0
Korzysta z funkcji Obj.magic, która niesłusznie wymusza dowolne dwa typy. W tym przypadku wymusza 0 (przechowywany jako bezpośrednia wartość 1, z powodu bitu znacznika używanego przez GC) na typ funkcji (przechowywany jako wskaźnik). W ten sposób próbuje się wyrejestrować adres 1, co oczywiście spowoduje awarię.
Jeśli powyższe nie ulega awarii, spróbuj zwiększyć liczbę (liczby wielocyfrowe są określone w rzeczywistości z wiodącym dwukropkiem)
Zawiesza interpreter, wykorzystując błąd w pythonie dotyczący głęboko zagnieżdżonych itertools.chainobiektów, który faktycznie używa do implementacji +operatora.
Musi się skompilować z / unsafe, aby ten działał. Z jakiegoś powodu nie rozumiem, *(int*)0=0po prostu zgłasza wyjątek NullReferenceException, podczas gdy ta wersja zapewnia prawidłowe naruszenie praw dostępu.
Te int i=*(int*)0;powroty NullReferenceException dla mnie.
Peter Olson,
Możesz spróbować uzyskać dostęp do negatywnej lokalizacji, np *(int*)-1=0. Uzyskać naruszenie zasad dostępu.
Peter Olson,
Szczególnym wyjątkiem jest to, w co owinięty jest clr i jest nieistotny. Sam OS faktycznie powoduje błąd seg we wszystkich tych przypadkach.
captncraig
Przyczyną *(int*)0=0zgłoszenia wyjątku jest prawdopodobnie optymalizacja. W szczególności, aby uniknąć kosztu sprawdzania null, optymalizator może usunąć kontrole zerowe, ale gdy wystąpi awaria, może ponownie go wyrzucić NullReferenceException.
Konrad Borowski,
7
PicoLisp - 4 znaki
$ pil
: ('0)
Segmentation fault
To jest zamierzone zachowanie. Jak opisano na ich stronie internetowej:
Jeśli niektóre języki programowania twierdzą, że są „szwajcarskim wojskowym nożem programistycznym”, to PicoLisp można nazwać „skalpelem programowania”: ostry, dokładny, mały i lekki, ale także niebezpieczny w rękach niedoświadczonego.
./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)
Materiały:
gfortran --version
GNU Fortran (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
Proszę podać wersję Matlaba - R2015B (i również 2016B) po prostu zgłasza błąd: Błąd przy użyciu setfield (wiersz 56) Wymagany jest co najmniej jeden indeks.
Florian Castellane
@FlorianCastellane Nie można wypróbować wszystkich wersji teraz, ale potwierdzono, że daje awarię w niektórych wersjach, z których ostatnia to 2014b i najwcześniejsza 2012a.
Dennis Jaheruddin
5
JavaScript Shell, 7 bajtów
clear()
Czyści absolutnie wszystko, nie tylko obecny zakres, co oczywiście powoduje wiele borków, co powoduje wysadzenie JS i uszkodzenie pliku
Według MDN (document.clear) powinno to zrobić coś tylko w naprawdę starych wersjach Mozilli, a nawet wtedy, co naprawdę zakłóca twoje wrażenia?
tomsmeding,
@tomsmeding to jest window.clear, FF bezpośrednio tego nie ujawnia, to wbudowany spidermonkey
Downgoat
5
Pyth, 3 znaki
j1Z
W tej części wyjaśniam, w jaki sposób wymyśliłem tę odpowiedź, chyba że nie mam żadnych zasad . Gdyby ktokolwiek mógł mi to wyjaśnić, byłbym wdzięczny.
jpodnosi kwadrat do kwadratu i wywołuje się rekurencyjnie, aż baza będzie co najmniej tak duża jak liczba. Ponieważ podstawa wynosi 0 , to nigdy się nie zdarza. Przy dostatecznie wysokim limicie rekurencji otrzymujesz segfault.
Coś wymyśliłem! Przeglądając źródła Pytha odkryłem, że ten kod działa jna 1i 0, który próbuje przekonwertować 1na bazę 0. Skąd ta awaria, nie mam pojęcia ...
NoOneIsHere
1
Zobacz tutaj . jpodnosi kwadrat do kwadratu i wywołuje się rekurencyjnie, aż baza będzie co najmniej tak duża jak liczba. Ponieważ podstawa wynosi 0 , to nigdy się nie zdarza. Przy dostatecznie wysokim limicie rekurencji otrzymujesz segfault.
Odpowiedzi:
C, 5 znaków
Jest to deklaracja zmiennej -
int
typ jest domyślny (funkcja skopiowana z języka B) i0
jest wartością domyślną. Podczas wykonywania próbuje wykonać liczbę (liczby nie są wykonywalne) i powodujeSIGSEGV
.Wypróbuj online!
źródło
0
.static
zmienne zaczynają się0
imain;
sąstatic
, jak zadeklarowałem, poza funkcją. c-faq.com/decl/initval.htmlmain
int, jest ona zlokalizowana.bss
, zwykle funkcje są zlokalizowane.text
, kiedy jądro ładuje program elf, tworzy stronę wykonywalną.text
i nie -wykonalne.bss
, więc wywołując main, przeskakujesz na stronę niewykonywalną, a wykonanie czegoś na takiej stronie jest błędem ochrony.main __attribute__((section(".text#")))=0xc3;
FTFY (przynajmniej wydaje się, że powraca bez awarii na moim x86).const main=195;
. Interesujące jest to, że działa, celem tego golfowego wyzwania golfowego było sprawienie, by kod działał nieprawidłowo, a nie działał :).Bash, 11
źródło
Zestaw (Linux, x86-64), 1 bajt
Ten kod nie działa poprawnie.
źródło
Python 2, 13
System Windows zgłasza kod błędu c00000fd (przepełnienie stosu), który, jak zakładam, jest podtypem błędu segmentacji.
Dzięki Alex A. i Mego potwierdzono, że powoduje błędy segmentacji również w systemach Mac i Linux. Python jest wybranym językiem do przenośnego zawieszania programów.
źródło
Segmentation fault: 11
na MacuSegmentation fault (core dumped)
w systemie LinuxpdfTeX (51)
Jest to prawdopodobnie błąd , ale nie jest obecny w oryginalnym TeX-ie napisanym przez Knutha: kompilacja kodu
tex filename.tex
zamiastpdftex filename.tex
nie powoduje awarii pliku.źródło
LOLCODE, 4 bajty
Nie działa online, tylko w tłumaczu C.
źródło
Python, 33 znaki
Źródło: http://bugs.python.org/issue1215#msg143236
Python, 60 znaków
Źródło: http://svn.python.org/view/python/trunk/Lib/test/crashers/recursive_call.py?view=markup
To jest wersja Pythona, na której testuję:
Generalnie interpreter Pythona jest trudny do rozbicia, ale powyższe jest selektywną obelgą ...
źródło
Dalej - 3 znaki
(
@
jest pobranie)źródło
C, 18
źródło
int func()
. tj. funkcja zwracającaint
, przyjmująca nieokreślone parametry. W tym przypadkuraise
funkcja zwraca int, biorąc argument int, więc to działa (nawet jeśli kompilator narzeka).Perl (<5,14), 9 znaków
W wersji 5.14 silnik regex został ponownie wprowadzony, aby nie można go było rozbić w ten sposób, ale w wersji 5.12 i wcześniejszej nastąpi awaria, jeśli spróbujesz tego.
źródło
Plik wykonywalny W32 .com - 0 bajtów
Wydaje się to dziwne, ale w 32-bitowych systemach Windows tworzenie i wykonywanie pustego pliku .com może powodować awarie, w zależności od ... czegoś. DOS po prostu akceptuje to (8086 nie ma zarządzania pamięcią, nie ma żadnych znaczących segmentów do uszkodzenia), a 64-bitowy system Windows odmawia uruchomienia (x86-64 nie ma trybu v86 do uruchomienia pliku .com).
źródło
pieprzenie mózgu (2)
Tak, to zależy od implementacji. SIGSEGV jest prawdopodobnie wynikiem dobrego kompilatora.
źródło
<
powinno mieć żadnego efektu ani się zawijać.Haskell, 31
Powoduje to segfault po skompilowaniu z GHC i uruchomieniu. Flagi rozszerzeń nie są potrzebne, ponieważ interfejs funkcji zagranicznej znajduje się w standardzie Haskell 2010.
źródło
C -
11 (19)7 (15)6 (14)1 znaki, asembler AT&T x86 - 8 (24) znakówWersja C to:
Cały program (niezupełnie zgodny z ISO, załóżmy, że to K&R C) ma 19 znaków:
Wariant asemblera:
Cały program ma 24 znaki (tylko do oceny, ponieważ tak naprawdę nie jest asemblerem):
EDYCJA :
Kilka wariantów C. Pierwszy wykorzystuje zerową inicjalizację globalnej zmiennej wskaźnika:
Drugi wykorzystuje nieskończoną rekurencję:
Ostatni wariant jest
najkrótszy -7 (15) znaków.EDYCJA 2 :
Wymyślił jeszcze jeden wariant, który jest krótszy niż którykolwiek z powyższych - 6 (14) znaków. Zakłada, że dosłowne ciągi znaków są umieszczane w segmencie tylko do odczytu.
EDYCJA 3 :
I moja ostatnia próba - 1 postać:
Po prostu skompiluj to w ten sposób:
źródło
main
jest globalna zmienna int inicjowana zerem, więc otrzymujemy wynik próby wykonania kilku bajtów zerowych. W x86 byłoby to coś w rodzajuadd %al,(%rax)
całkowicie poprawnej instrukcji, która próbuje dotrzeć do pamięci pod adresem zapisanym w%rax
. Szanse na dobry adres są minimalne.dc - 7 znaków
powoduje przepełnienie stosu
źródło
[dx0]
zapisujedx0
na stosie, następnied
duplikuje element górnego stosu, a następniex
wysuwa element górnego stosu (dx0
) i wykonuje go. Który duplikuje element najwyższego stosu i zaczyna go wykonywać ...0
musi tam być, aby zapobiec wywołaniu ogona, więc wszystkie się gromadzą.Perl, 10/12 znaków
Nieco cheatycznym rozwiązaniem jest ogolenie jednego kawałka sztuczki Joey Adamsa :
Jednak, aby uzyskać prawdziwy błąd w Perlu,
unpack p
jest oczywiste rozwiązanie:Technicznie nie jest to gwarantowane segfault, ponieważ adres 0x31313131 (lub 0x313131313131313131 w systemach 64-bitowych) może przypadkowo wskazywać prawidłową przestrzeń adresową. Ale szanse są przeciwne. Ponadto, jeśli perl jest kiedykolwiek przenoszony na platformy, na których wskaźniki są dłuższe niż 64 bity,
x8
należy je zwiększyć.źródło
1x8
sprawa?"11111111".
Python 33
Wysyłanie sygnału 11 (SIGSEGV) w pythonie.
źródło
from os import*
ikill(getpid(),11)
OCaml, 13 bajtów
Korzysta z funkcji
Obj.magic
, która niesłusznie wymusza dowolne dwa typy. W tym przypadku wymusza 0 (przechowywany jako bezpośrednia wartość 1, z powodu bitu znacznika używanego przez GC) na typ funkcji (przechowywany jako wskaźnik). W ten sposób próbuje się wyrejestrować adres 1, co oczywiście spowoduje awarię.źródło
it coerces 0 (stored as the immediate value 1)
- dlaczego 0 jest przechowywane jako 1?Obj.magic()0
jest o jeden char krótszy :)Bash, 4 bajty
Grał w golfa
Rekurencyjnie dołącz skrypt do siebie.
Wyjaśniono
Rekurencyjna operacja „source” (.) Powoduje ostatecznie przepełnienie stosu, a ponieważ Bash nie integruje się z libsigsegv , skutkuje to SIGSEGV.
Zauważ, że nie jest to błąd, ale oczekiwane zachowanie, jak omówiono tutaj .
Test
Wypróbuj online!
źródło
Faktycznie ,
17 16 11 109 bajtówWypróbuj online!
Jeśli powyższe nie ulega awarii, spróbuj zwiększyć liczbę (liczby wielocyfrowe są określone w rzeczywistości z wiodącym dwukropkiem)
Zawiesza interpreter, wykorzystując błąd w pythonie dotyczący głęboko zagnieżdżonych
itertools.chain
obiektów, który faktycznie używa do implementacji+
operatora.źródło
C # - 62
Edycja: 23
Musi się skompilować z / unsafe, aby ten działał. Z jakiegoś powodu nie rozumiem,
*(int*)0=0
po prostu zgłasza wyjątek NullReferenceException, podczas gdy ta wersja zapewnia prawidłowe naruszenie praw dostępu.źródło
int i=*(int*)0;
powroty NullReferenceException dla mnie.*(int*)-1=0
. Uzyskać naruszenie zasad dostępu.*(int*)0=0
zgłoszenia wyjątku jest prawdopodobnie optymalizacja. W szczególności, aby uniknąć kosztu sprawdzanianull
, optymalizator może usunąć kontrole zerowe, ale gdy wystąpi awaria, może ponownie go wyrzucićNullReferenceException
.PicoLisp - 4 znaki
To jest zamierzone zachowanie. Jak opisano na ich stronie internetowej:
źródło
F90 - 39 bajtów
Kompilacja:
Wykonanie:
Materiały:
źródło
19 znaków w C.
Koryguje wartość adresu zwrotnego funkcji głównej, więc po powrocie otrzymuje SIGSEGV
main
.źródło
J (6)
memf
oznacza wolną pamięć,1
jest interpretowane jako wskaźnik.źródło
Cython, 14
Często przydaje się to do celów debugowania.
źródło
Unix PDP-11, 18 bajtów binarnych, źródło 7 bajtów
(staje się to dla mnie tematem, być może dlatego, że jest to jedyny język, jaki znam, którego nikt inny tutaj nie zna).
Inkrementuje pojedynczy bajt adresowany przez wartość początkową r0 [która według debuggera simh to 05162] w chwili uruchomienia programu.
I jak zawsze, zewnętrzne bajty na końcu można usunąć za pomocą paska.
Podjąłem kilka prób skrócenia źródła, ale zawsze otrzymywałem błąd składniowy lub SIGBUS.
źródło
Matlab - Tak, jest to możliwe!
W odpowiedzi na moje pytanie Amro wymyślił to dziwactwo:
źródło
JavaScript Shell, 7 bajtów
Czyści absolutnie wszystko, nie tylko obecny zakres, co oczywiście powoduje wiele borków, co powoduje wysadzenie JS i uszkodzenie pliku
źródło
Pyth, 3 znaki
W tej części wyjaśniam, w jaki sposób wymyśliłem tę odpowiedź, chyba że nie mam żadnych zasad . Gdyby ktokolwiek mógł mi to wyjaśnić, byłbym wdzięczny.
Tutaj jest w tłumaczu online.
źródło
j
na1
i0
, który próbuje przekonwertować1
na bazę0
. Skąd ta awaria, nie mam pojęcia ...j
podnosi kwadrat do kwadratu i wywołuje się rekurencyjnie, aż baza będzie co najmniej tak duża jak liczba. Ponieważ podstawa wynosi 0 , to nigdy się nie zdarza. Przy dostatecznie wysokim limicie rekurencji otrzymujesz segfault.