Śmieszne błędy w czasie wykonywania [zamknięte]

40

Pisz programy, które powodują szalone, niejasne, śmieszne lub po prostu szalone błędy w czasie wykonywania. Niewidoczne zaciemnienie i długość golfa (krótkość) nie są wymagane.

  • rozwiązania, które wyglądają, jakby powinny dobrze działać, są lepsze.
  • rozwiązania, które wyglądają, jakby powinny się zepsuć w jedną stronę, ale w drugą, są lepsze.
  • rozwiązania, które nie są deterministyczne, są lepsze, o ile są czasami powtarzalne.
  • rozwiązania z dużą odległością między przyczyną błędu a manifestacją są lepsze.
  • punkty bonusowe za błędy, które powinny być niemożliwe.
  • punkty bonusowe za błędy powodujące awarię środowiska wykonawczego (np. powodujące błąd segmentu python) lub system operacyjny.

Jednostką oceny są głosy pozytywne.

Dodatek 1

Niewłaściwe zachowanie kompilatora też jest w porządku.

Wug
źródło
2
Wykonanie segfaulta w Pythonie jest łatwe:import sys; sys.setrecursionlimit(~-2**31); x=lambda x:x(x); x(x);
marinus
Peter: ups.
Zmieniłem
... co z malbolge lub INTERCAL? jestem pewien, że mieliby jakieś szalone błędy, prawdopodobnie mogą to zrobić również za pomocą jednego znaku.
akolita
1
To zdecydowanie najlepszy link do rozwiązania: destroyallsoftware.com/talks/wat :-)
seri
1
Możliwy duplikat stackoverflow.com/q/1146014/736054 .
Konrad Borowski

Odpowiedzi:

69

Obowiązkowy PHP (który wciąż nie został naprawiony od 5.4):

<?::

Wyjścia:

Błąd analizy: błąd składni, nieoczekiwany T_PAAMAYIM_NEKUDOTAYIM w linii 1

Co?

Ry-
źródło
12
Podoba mi się ten. To może być mój ulubiony komunikat o błędzie. Oprócz tego, że mój przyjaciel próbował uruchomić laptopa z systemem Windows na partycji odzyskiwania, a cały ekran zmienił się w białe pudełko z gigantycznymi czerwonymi literami oznaczającymi „BŁĄD”.
Wug
4
Umyślne, ale dziwne: „Paamayim Nekudotayim z początku wydawałby się dziwnym wyborem do nazwania podwójnego dwukropka. Jednak pisząc Zend Engine 0.5 (który obsługuje PHP 3), zespół Zend postanowił to nazwać W rzeczywistości oznacza to dwukropek - po hebrajsku! ” php.net/manual/en/language.oop5.paamayim-nekudotayim.php
Jon Gauthier
12
@HansEngel: Tak, w języku hebrajskim oznacza dwukropek. Używanie angielskiego dla każdego tokena oprócz tego ma sens, ponieważ ...? Chyba po prostu muszę zapytać zespół PHP.
Ry-
Przepraszam, stary, ale po prostu wywołujesz metodę statyczną / zmienną ''(pusty ciąg) z klasy ''(pusty ciąg)
Ismael Miguel
1
@ IsmaelMiguel: Jest to mylące z powodu hebrajskiego, a nie dlatego, że jest złe.
Ry-
61

Błąd kompilacji Gcc:

int main()
{
        long long long a;
}

błąd: długi długi długi jest zbyt długi dla GCC

Dhara
źródło
6
Po prostu wiedzieli, że ktoś spróbuje long long long, jeśli longi long longoba są ważne.
Konrad Borowski
3
Myślę, że „a jest za długie!” byłby lepszym komunikatem o błędzie, ale to wciąż świetna odpowiedź.
Wug
52

Wiersz polecenia systemu Windows

If you're happy and you know it clap your hands!

Wynik:

w tym czasie szczęśliwy był nieoczekiwany.

Hand-E-Food
źródło
1
Próbowałem tego polecenia, aby sprawdzić wynik, ale wyświetliło się ^V:( ciężkie dni
Fabricio
8
@ Fabricio, czy to było po naciśnięciu CTRL + V, aby wkleić linię? W wierszu polecenia „skrótem” klawiatury dla wklejania jest ALT + SPACJA, E, P.
Hand-E-Food
42

PHP

$ cat error.php 
<?php
function echo_string(string $string) {
    echo $string;
}
echo_string("Hello, world!");
$ php error.php 
PHP Catchable fatal error:  Argument 1 passed to echo_string() must be an instance of string, string given, called in error.php on line 5 and defined in error.php on line 2

Nie możesz przekazać ciągu do funkcji, zamiast tego musisz przekazać ciąg!

Aktualizacja: Ten kod NIE jest błędem w PHP 7. Najedź kursorem na / kliknij / dotknij spoilera, aby sprawdzić, dlaczego (zawiera spoilery na temat działania kodu).

Nowa funkcja znana jako deklaracje typu skalarnego została dodana w PHP 7. Ta funkcja pozwala na użycie typów skalarnych w deklaracjach funkcji.

Konrad Borowski
źródło
6
Co do cholery php.
Wug
7
PHP próbuje uzyskać klasę string(która jest poprawna). Podpisywanie tekstu (to, co robisz) działa tylko dla klas. Ponieważ klasa stringnie istnieje, zgłasza błąd.
Ismael Miguel
Tutaj możesz sprawdzić, czy Twój kod działa poprawnie: sandbox.onlinephpfunctions.com/code/…
Ismael Miguel
2
@ IsmaelMiguel: Tak, rozumiem, dlaczego tak się dzieje, ale moim zdaniem błąd jest nadal absurdalny.
Konrad Borowski,
1
Więc spróbuj array(''=>array()'').
Ismael Miguel
33

grzmotnąć

$ echo "Hello, world!"
bash: !": event not found

I pomyślałbyś, że bash zaakceptowałby proste „Witaj, świecie!” program.

Konrad Borowski
źródło
Wyjaśnienie tego: ciągi przekazywane w podwójnych cudzysłowach, gdy argumenty do programów w bash są rozwinięte, co oznacza, że `echo hi`zamieniają się hiw ciąg podwójnego cudzysłowu. !jest używany jako przedrostek oznaczników zdarzeń . Więc bash próbuje ocenić !", ale nie może znaleźć zdarzenia, do którego się odwołuje.
Mego
31

Python 2.7

# Look I'm actually coding: see my happy face?
print ':)'

Generuje raczej nieprzydatne:

SyntaxError: encoding problem: with BOM

Jak prosty komentarz może generować błąd?

tecywiz121
źródło
12
W najnowszych interpreterach języka Python: jeśli pierwsze 2 wiersze zaczynają się od #i zawierają ciąg znaków, coding:następne słowo użyte jako opis kodowania
AMK
31

Matematyka

Podczas korzystania z Mathematica do tworzenia graficznych danych wyjściowych czasami wyzwalane są komunikaty o błędach sformatowane zgodnie ze specyfikacjami zastosowanymi w samym programie. Oto trywialny przykład.

Rotate[f/0, .6]

wprowadź opis zdjęcia tutaj

Michael Stern
źródło
11
To nie jest tak naprawdę komunikat o błędzie, prawda? To tylko wartość, którą zwraca Mathematica, gdy dzielisz coś przez zero.
Ilmari Karonen
26

Kalkulator graficzny TI-89

Odkryłem to, kiedy dowiedziałem się o ukrytym różnicowaniu w rachunku różniczkowym w szkole średniej. Jeśli wpiszesz:

d(xy+x=0,x)

Otrzymasz następujące:

1 = 0

Z tym zastrzeżeniem wydrukowanym małymi literami u dołu ekranu:

Warning: May produce false equation

Dzieje się tak, ponieważ xynie jest interpretowany jako x * y, ale raczej jako własny symbol xy.

Co dziwne, jeśli to zrobisz d(xy=0,x), dostaniesz 0 = 0to samo ostrzeżenie.

Zev Eisenberg
źródło
22

Możesz sprawić, że mózg kompilatora Haskell wybuchnie:

C:\Windows\system32>ghci
...
Prelude> :set -XExistentialQuantification
Prelude> data Foo = forall a. Foo a
Prelude> let foo f = 1 where Foo a = f

<interactive>:4:21:
    My brain just exploded
    I can't handle pattern bindings for existential or GADT data constructors.
    Instead, use a case-expression, or do-notation, to unpack the constructor.
    In the pattern: Foo a
    In a pattern binding: Foo a = f
    In an equation for `foo':
        foo f
          = 1
          where
              Foo a = f
Prelude>
Zaq
źródło
22

Rubin

Nadużycie zasad.

class StandardError

  def to_s
    words = File.open('/usr/share/dict/words'){|f|f.readlines.map &:chop}.sample(100)
    words.last.capitalize!
    super.gsub(/\w+/){words.pop}
  end

  to_s(3)

end

Jeśli działa na OSX, produkuje np

$ ruby weird_runtime_error.rb 
weird_runtime_error.rb:9:in `to_s': Sculpturation contingence explicate tappet(phonendoscope ethopoeia nannandrous) (ArgumentError)
    from weird_runtime_error.rb:9:in `<class:StandardError>'
    from weird_runtime_error.rb:1:in `<main>'
histocrat
źródło
6
Co to do diabła znaczy?
TRiG,
9
Oznacza to wrong number of arguments(1 for 0). Wyraża to poprzez język, który jest generowany leniwie i stochastycznie przy użyciu słownictwa angielskiego z niewielkim uwzględnieniem prawdopodobieństwa językowego.
histocrat
21

Monit DOS

c:\>make love

daje Ci

Fatal Error: 'love' does not exist. Don't know how to make it.

Natknąłem się na to, gdy próbowałem obrazić komputer za brak współpracy. Przez pewien czas trochę mnie zasmuciłem, dopóki nie dowiedziałem się, że dzieje się tak tylko wtedy, gdy miłość nie istnieje. Jeśli istnieje, chętnie to zrobi.

Einer
źródło
5
Jest to w rzeczywistości poświęcone makeużyteczności, a nie samemu DOS.
Vovanium
1
Dostaję:make: *** No rule to make target 'love'. Stop.
agtoever
@agtoever Używasz niewłaściwej marki.
Navin
Rozumiem: make: Fatal error: Don't know how to make target 'love'ale to jest na Uniksie. W systemie DOS rozumiem make is not recognized as an internal or external command, operable program or batch file.
lebatsnok,
17

Bash (błąd Quine)

Ten błąd to Quine w Bash!

$ bash: bash:: command not found...
bash: bash:: command not found...

Oczywiście musisz mieć odpowiedni locale(tutaj angielski).

Thomas Baruchel
źródło
1
Mój nie wydrukował ...na końcu, więc musiałem pominąć to również w oryginalnym wejściu.
Zev Eisenberg
16

CSH

Naprawdę klasyczny cshżart:

% make fire?
make: No match.

źródło
15

Bash - dokładne odtworzenie rzadkiego historycznego komunikatu o błędzie

echo -ne $(tail -n +257 /usr/src/linux*/drivers/char/lp.c | head -1 | cut -d '"' -f 2 | sed 's/%d/0/')

Wynik:

lp0 on fire

Wymaga rozpakowania źródła jądra Linux w zwykłym miejscu.

Ciekawostka: raz otrzymałem ten komunikat na poważnie, kiedy uruchomiłem starą drukarkę wstążkową.

Zamieszki
źródło
Czy to komunikat o błędzie, czy tylko wyjście programu?
jo
1
@yo 'bash one-liner powraca z powodzeniem, ale generowane przez niego dane wyjściowe to prawdziwy komunikat o błędzie; skrypt po prostu wyciąga błąd ze źródła sterownika drukarki.
Riot
ah ok, to trudne zadanie :-)
yo
1
Nawiasem mówiąc, błąd oznacza, że ​​nadal drukuje do zacięcia papieru, co stanowi zagrożenie pożarowe.
Joshua
13

C (++)

Jeśli liczą się błędy czasu kompilacji, oto jeden (zakładając, że plik ma nazwę „crash.c”).

#include "crash.c"

int main(){ return 0; }

Wypełnia to ekran po kompilacji (przygotuj Ctrl-C)

                 from crash.c:1,
                 from crash.c:1:
crash.c:3:1: error: redefinition of ‘main’
crash.c:3:1: note: previous definition of ‘main’ was here
In file included from crash.c:1:0,
                 from crash.c:1,
                 from crash.c:1,

Kolejny fragment kodu, który doskonale się kompiluje (brak ostrzeżeń pod -Walli ilustruje bezpieczeństwo typu C w pięknym stylu </s>

#include <stdio.h>
int i;

int main(){
  sprintf(NULL, "%s", (char *) (void *) (1/i));
  return 0;
}

Uruchomienie go daje:

Floating point exception (core dumped)
walpen
źródło
13

Rubin

To dziwne, że może się to zdarzyć w języku wysokiego poziomu.

$*<<$*<<$**$/

produkuje

ArgumentError: recursive array join
histocrat
źródło
10

To jest bardzo stare, ale dla tych, którzy pamiętają BCPL,

GET "LIBHDR"

LET START() = VALOF 
$8
        RESULTIS 0
$)

narzekałby

$8
 ^
"( ) or 8 expected"
Tom Tanner
źródło
10

R

Z technicznego punktu widzenia nie jest to błąd, ale ostrzeżenie, ale mimo to jest niedorzeczne i występuje z całkowicie ezoterycznych powodów.

[[EDYCJA]] Wydaje się, że przyczyną niektórych fragmentów śmiesznych ostrzeżeń jest RStudio, a nie R per se, więc jest to mniej interesujące, niż początkowo myślałem. Pierwszy przykład, to plot(1:2, NotAGraphicalParameter = "ignore.me")jest jednak nadal powtarzalny w „nagim” R i sam w sobie jest dość zabawny. [[/ EDIT]]

> plot(1:2, NotAGraphicalParameter = "ignore.me")
# produces a nice scatterplot with two points, [1,1] and [2,2]
Warning messages:
1: In plot.window(...) :
  "NotAGraphicalParameter" is not a graphical parameter
2: In plot.xy(xy, type, ...) :
  "NotAGraphicalParameter" is not a graphical parameter
3: In axis(side = side, at = at, labels = labels, ...) :
  "NotAGraphicalParameter" is not a graphical parameter
4: In axis(side = side, at = at, labels = labels, ...) :
  "NotAGraphicalParameter" is not a graphical parameter
5: In box(...) : "NotAGraphicalParameter" is not a graphical parameter
6: In title(...) : "NotAGraphicalParameter" is not a graphical parameter
> plot(2:3)
# another nice scatterplot: [2,2] and [3,3] 
# but there should be nothing wrong this time!
# however ...
There were 12 warnings (use warnings() to see them)
> warnings()
Warning messages:
1: "NotAGraphicalParameter" is not a graphical parameter
2: "NotAGraphicalParameter" is not a graphical parameter
3: "NotAGraphicalParameter" is not a graphical parameter
4: "NotAGraphicalParameter" is not a graphical parameter
5: "NotAGraphicalParameter" is not a graphical parameter
6: "NotAGraphicalParameter" is not a graphical parameter
7: "NotAGraphicalParameter" is not a graphical parameter
8: "NotAGraphicalParameter" is not a graphical parameter
9: "NotAGraphicalParameter" is not a graphical parameter
10: "NotAGraphicalParameter" is not a graphical parameter
11: "NotAGraphicalParameter" is not a graphical parameter
12: "NotAGraphicalParameter" is not a graphical parameter
# but let's try once more:
> plot(2:3)
# yup. no warnings this time. we had to do it twice

To tak, jakby R pamięta nasze obelgi. Ale nie na długo.

Naprawdę nie potrafię wyjaśnić, dlaczego tak się dzieje - ale jest to powtarzalne. W rzeczywistości występuje to za każdym razem, gdy podasz jakiś „nie graficzny parametr” do wydruku 1, a następnie wydrukujesz wykres 2 w całkowicie nienaganny sposób. Szczególnie zabawne jest to, że otrzymujemy 12 ostrzeżeń „nie graficznych” dla drugiego wątku, ale tylko 6 dla pierwszego. Kolejną zabawną rzeczą jest to, że jeśli podasz „nie parametr graficzny” o wartości NULL, wówczas nie zostanie zgłoszony żaden warunek:

plot(1:2, Nonsense=NULL)
# no warnings
# however
plot(1:2, Nonsense="gibberish")
# gives the usual 6-pack of warnings

Aby stać się jeszcze bardziej absurdalnym, narysujmy kilka linii na uprzednio narysowanej fabule:

plot(1:2)
# you will see the number of warnings growing with each line:
lines(1:2, 1:2, mumbo = 1)
lines(1:2, 1:2, jumbo = 2)
lines(1:2, 1:2, bimbo = 3)
lines(1:2, 1:2, cucaracha = 4)
lines(1:2, 1:2, karaoke = 5)
lines(1:2, 1:2, radiogaga = 6)
lines(1:2, 1:2, reptiles = 7)
lines(1:2, 1:2, cowsonmoon = 8)
lines(1:2, 1:2, stainlessSteelLadderToTheMoon = 9)
lines(1:2, 1:2, frambuesa = 10)
lines(1:2, 1:2, fresa = 11)
lines(1:2, 1:2, limonYNada = 12)
lines(1:2, 1:2, slingsAndArrows = 13)
# ... and now you have 25 warnings:
warnings()

Warning messages:
1: "mumbo" is not a graphical parameter
2: "jumbo" is not a graphical parameter
3: "bimbo" is not a graphical parameter
4: "cucaracha" is not a graphical parameter
5: "karaoke" is not a graphical parameter
6: "radiogaga" is not a graphical parameter
7: "reptiles" is not a graphical parameter
8: "cowsonmoon" is not a graphical parameter
9: "stainlessSteelLadderToTheMoon" is not a graphical parameter
10: "frambuesa" is not a graphical parameter
11: "fresa" is not a graphical parameter
12: "limonYNada" is not a graphical parameter
13: "mumbo" is not a graphical parameter
14: "jumbo" is not a graphical parameter
15: "bimbo" is not a graphical parameter
16: "cucaracha" is not a graphical parameter
17: "karaoke" is not a graphical parameter
18: "radiogaga" is not a graphical parameter
19: "reptiles" is not a graphical parameter
20: "cowsonmoon" is not a graphical parameter
21: "stainlessSteelLadderToTheMoon" is not a graphical parameter
22: "frambuesa" is not a graphical parameter
23: "fresa" is not a graphical parameter
24: "limonYNada" is not a graphical parameter
25: In plot.xy(xy.coords(x, y), type = type, ...) :
  "slingsAndArrows" is not a graphical parameter

To powinno nie wygraj dużo czasu, chyba że nie ma sprawiedliwości.

lebatsnok
źródło
1
Jakiej wersji R używasz? Ponieważ nie mogę odtworzyć zestawu ostrzeżeń, które otrzymujesz plot(2:3)zaraz po użyciu plot(1:2, NotAGraphicalParameter = "ignore.me"). Czy zdefiniowałeś coś na nowo .Rprofile?
plannapus
1
wygląda na to, że jest to specyficzne dla uruchamiania R w Rstudio (zarówno w systemie Windows, jak i Ubuntu), ale nie występuje, gdy uruchomisz R w terminalu Linux lub Windows Rgui.
lebatsnok
Myślę, że widziałem coś podobnego z funkcjami modelowania (lm lub glm) bez Rstudio, ale nie mogę tego teraz odtworzyć. (To znaczy, pojawiały się wcześniejsze ostrzeżenia, gdy nie były już istotne.)
lebatsnok
9

Skrypt poleceń systemu Windows

OSTRZEŻENIE, to bomba widełkowa!

Spowoduje to wyświetlenie niepotrzebnych pytań dotyczących rezygnacji, jeśli spróbujesz w jakikolwiek sposób zamknąć konsolę.

%0|%0|%0

Bonusy:

  • Sprawi, że system będzie praktycznie bezużyteczny do momentu ponownego uruchomienia
  • Zapobiega zamknięciu skryptu, co powinno być niemożliwe
Robert Sørlie
źródło
2
Niebezpieczeństwo zrobi Robinson?
Jakub
7

q obraża cię

q)`u#1 1
'u-fail
q)

`` u # '' mówi, qże każdy element na liście jest unikalny (więc prawdopodobnie może zbudować jakiś indeks oparty na haszowaniu). tak się dzieje, gdy tak naprawdę nie jest to prawdą.

Aaron Davies
źródło
1
Jaki to język? Próbowałem wyszukać język „q obraża cię”, ale nic nie znalazłem.
Konrad Borowski
Przepraszamy za niezamierzone zaszyfrowanie, językiem jest [q] ( en.m.wikipedia.org/wiki / .... Działa również w k4, BTW.
Aaron Davies
6

Co z błędami optymalizacji kompilatora:

#include <stdio.h>

#define N 4

int main(void)
{
    int sum;
    int i;
    int arr[N];

    for (i = 0, sum = 0; i < N; i++, arr[i] = sum) {
        sum += arr[i];
    }
    printf("%d\n", sum);
    return 0;
}

Jest to specyficzne dla gcc> = 4.7. Kompiluje się i działa poprawnie z gcc -O0 -Wall. Kompiluje się z, gcc -O2 -Wallale skutkuje powstaniem pętli inf.

Zauważ też, jak gcc widzi problem dla mniejszych N, np . N = 3:

test.c:11:38: warning: array subscript is above array bounds [-Warray-bounds]
  for (i = 0, sum = 0; i < N; i++, arr[i] = sum) {
                                       ^
test.c:12:13: warning: 'arr[0]' is used uninitialized in this function [-Wuninitialized]
  sum += arr[i];
         ^

Przy okazji, wzięto to z raportu o błędzie, nie pamiętam jednak numeru błędu.

hroptatyr
źródło
3
Jest to niezdefiniowane zachowanie, więc kompilator może robić wszystko. Ale nadal wydaje się dziwne, że kompilator postanowił zmienić przypisanie poza lokalną tablicą, która nigdy nie jest używana, i użyć niezadeklarowanej wartości do nieskończonej pętli, nawet jeśli standard C na to pozwala (w końcu zależy to od niezdefiniowanego zachowania - dostęp arr[N](poza tablicą) i dostęp arr[0](który jest niezainicjowany)). Ponieważ w przypadku nieokreślonego zachowania dozwolone jest wszystko, nie jest to błąd optymalizacji, ale jest bardzo mało prawdopodobne, aby był tym, czego chciał użytkownik.
Konrad Borowski
4
Nie jest to wyraźnie błąd optymalizacji kompilatora. UB to UB, a kompilator miałby rację, nawet gdyby postanowił usunąć wszystkie dane z dysku twardego.
H2CO3,
5

Zawsze lubiłem tę dziwność w APL:

      ⍝ oczywiście błąd składniowy
      {(]} 3  
BŁĄD SKŁADNI
      {(]} 3

      ⍝ ale:
      {(]} 1 ÷ 0
BŁĄD DOMENY
      {(]} 1 ÷ 0 

      Even działa nawet ze statycznie zdefiniowanymi funkcjami
      ←z ← fx
[1] z ← [{]} x
[2] ∇
      f 1 ÷ 0
BŁĄD DOMENY
      f 1 ÷ 0
     ∧
      f 3
BŁĄD SKŁADNI
f [1] z ← [{]} x     

Leniwie analizuje wnętrze funkcji!

marinus
źródło
4

PHP

<?php
[][] = 42;

[]służy do pchania elementów. Jeśli jednak użyjesz go do literału tablicowego, PHP generuje zwariowany komunikat o błędzie, nawet jeśli przypisujesz mu to w celu wypychania. Wymaga PHP> = 5,4, ponieważ wcześniej nie można było indeksować literałów tablicowych.

Wynik:

Błąd krytyczny : nie można użyć [] do odczytu w [...] [...] w wierszu 2

Konrad Borowski
źródło
4

Pyton

Bloki zagnieżdżone

for a in range(26):
 for b in range(26):
  for c in range(26):
   for d in range(26):
    for e in range(26):
     for f in range(26):
      for g in range(26):
       for h in range(26):
        for i in range(26):
         for j in range(26):
          for k in range(26):
           for l in range(26):
            for m in range(26):
             for n in range(26):
              for o in range(26):
               for p in range(26):
                for q in range(26):
                 for r in range(26):
                  for s in range(26):
                   for t in range(26):
                    for u in range(26):
                     for v in range(26):
                      for w in range(26):
                       for x in range(26):
                        for y in range(26):
                         for z in range(26):
                          print a

Python 2.7: SystemError: too many statically nested blocks

Listy z odnośnikami

def printList(myList):
    for element in myList:
        if isinstance(element, list):
            printList(myList)
        else:
            print(element)

a = []
a.append(a)
printList(a)

Python 2.7

Prawda nie jest stała

Problem w poniższym przykładzie jest taki, że w Pythonie 2.7 Truei Falsenie są stałymi. A Truei Falsemoże się automatycznie do lanego 1i 0:

True=False
a=10/True

Traceback (most recent call last):
  File "/home/moose/.config/pluma/tools/new-tool-2", line 11, in <module>
    exec(sys.stdin.read())
  File "<string>", line 2, in <module>
ZeroDivisionError: integer division or modulo by zero

Python 2.7:

Przeznaczenie

def f(n):
    if n <= 1:
        return n
    else:
        return f(n-1)+f(n-2)

Czy pojawia się błąd?

Traceback (most recent call last):
  File "/home/moose/.config/pluma/tools/new-tool-2", line 11, in <module>
    exec(sys.stdin.read())
  File "<string>", line 4
    else:
       ^
SyntaxError: invalid syntax

Mieszanie tabulatorów i spacji było prawidłowe w Pythonie 2.7 ... ale pamiętaj o poziomie wcięcia!

Martin Thoma
źródło
1
Przykład mieszania spacji i tabulatorów nie działa poprawnie, ponieważ platforma Stack Exchange nie zezwala na tabulatory w kodzie.
Konrad Borowski
@xfix: Ok, ale myślę, że ludzie, którzy to czytają, rozumieją. Większość redaktorów też nie wyświetla spacji / tabulatorów (z wyjątkiem spacji końcowych), a jeśli to pokazują, jest przeważnie szara. I w każdym innym języku (z wyjątkiem białych znaków) białe spacje nie mają znaczenia, o ile przynajmniej jeden z nich jest dostępny.
Martin Thoma
Powinieneś pisać swoje programy w języku programowania Whitespace.
Alexander
Czy Python 3 to żart?
Ry-
@minitech Nie mam pojęcia. To właśnie ma z tym wspólnego print a.
Justin
3

Zacznę:

#include <iostream>

using namespace std;

class A
{
public:
    A()
    {
    }

    void doSomethingDiabolical()
    {
        delete this;
    }

    virtual void breakHorribly()
    {
        cout << "still alive" << endl;
        doSomethingDiabolical();
        cout << "still alive" << endl;
    }
};

class B : public A
{
public:
    B() : A()
    {
    }

    void breakHorribly()
    {
        cout << "still alive" << endl;
        ((A *) this)->breakHorribly();
        cout << "still alive" << endl;
        doSomethingDiabolical();
        cout << "still alive" << endl;
        breakHorribly();
        cout << "dead" << endl;
    }
};

int main()
{
    jane();
}

void jane()
{
    cout << "still alive" << endl;
    A * o = new B;
    cout << "still alive" << endl;
    o->breakHorribly();
}

Zgadłeś, dlaczego ten program ulega awarii? :RE

Zobacz janerun: http://ideone.com/gtaZ3

Wug
źródło
1
Czy nie jest to raczej prosta nieskończona rekurencja? B::BreakHorriblywywołuje się wcześniej doSomethingDiabolical, więc delete thisnie jest osiągane.
marinus
Ten program eksploduje z wielu powodów. Jego zachowanie zmienia się po usunięciu różnych instrukcji drukowania. Masz jednak rację. Nie miałem czasu na odtworzenie niezdefiniowanego zachowania, które miałem kiedyś, ale w czasie wykonywania otrzymałem czystą funkcję wirtualnego wywołania funkcji.
Wug
2
Nie mówisz, że kiedyś przypadkowo wpisałeś coś takiego delete this, prawda?
przestał się obracać w lewo
Nie, było to znacznie bardziej subtelne, ale wynik końcowy był taki sam: w czasie wykonywania funkcji członka
wezwano
3

Grzmotnąć

Dostałem to dzisiaj, kiedy próbowałem dowiedzieć się, czy można chronić system przed rm -rf /.

mkdir /tmp/a
mkdir /tmp/a/b
sudo mount --bind /tmp/a /tmp/a/b
rm -rf /tmp/a

Komunikat o błędzie z LANG=C:

rm: WARNING: Circular directory structure.
This almost certainly means that you have a corrupted file system.
NOTIFY YOUR SYSTEM MANAGER.
The following directory is part of the cycle:
  '/tmp/a/b'
jimmy23013
źródło
To ostrzeżenie pochodzi rm, nie bash. Nie jestem pewien, jaki język powinieneś zadeklarować w tytule, biorąc pod uwagę, że użyłeś go bashdo skonfigurowania.
2

R

Kolejne, które nie jest śmieszne i, znowu, jest ostrzeżeniem niż błędem, ale nadal jest przyjemne:

> sapply(as.list(-1:-51), log)
 [1] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
[20] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
[39] NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
There were 50 or more warnings (use warnings() to see the first 50)

Podoba mi się ostatni bit: 50 lub więcej :)

A aktualne ostrzeżenia:

1: In lapply(X = X, FUN = FUN, ...) : NaNs produced
2: In lapply(X = X, FUN = FUN, ...) : NaNs produced
....
50: In lapply(X = X, FUN = FUN, ...) : NaNs produced

ZABAWA = ZABAWA!

lebatsnok
źródło
1
Kod Nyana ?! To naprawdę dziwne!
Kroltan
Nie rozumiem, co jest nieoczekiwane lub zaskakujące. log wartości ujemnej nie produkuje liczby A (NaN) tak jak powinien.
plannapus
2

CPython

import ctypes
import sys
(ctypes.c_char * sys.getsizeof(None)).from_address(id(None))[:4] = '\x00' * 4

Wynik:

Fatal Python error: deallocating None

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Fraxtil
źródło
Jeszcze lepiej w Pythonie 3: ctypes.pythonapi._Py_Dealloc(ctypes.py_object(None)).
kirbyfan64sos
2

Bash - nieudana próba ucieczki

echo "this should definitely work!!!11!"

zwroty

-bash: !11: event not found

(podwójne cudzysłowy nie zapobiegają rozszerzaniu historii w wierszu poleceń)

Premia:

echo "I don't know what's gone wrong!! !echo is usually pretty foolproof!-1"

Wynik raczej nie będzie zgodny z oczekiwaniami. Naciśnij w górę, aby ponownie uzyskać polecenie, i zauważ, że zostało zmienione w stosunku do wpisanego tekstu. Jeśli naciśniesz w górę i wejdziesz kilka razy, prawdopodobnie Twoje wyniki zaczną wyglądać nieco przerażająco. Wypróbuj sam.

Zamieszki
źródło
2
Ta odpowiedź jest duplikatem codegolf.stackexchange.com/a/17776 .
Dennis
2

C # - Rekurencyjny, leniwy generator Fibonacciego

static void Main()
{
    Console.WriteLine(string.Join(",", fib().Take(141)));
    Console.ReadLine();
}

static IEnumerable<decimal> fib(decimal n = 0, decimal m = 1)
{
    if (n == 0)
    {
        yield return 0;
        yield return 1;
    }
    while (true)
    {
        yield return n + m;
        foreach(var x in fib(m, n+m))
        {
            yield return x;
        }
    }
}

Ten kod wygląda dobrze, prawda? Dość prosty generator Fibonacciego, doprawiony odrobiną rekurencji i leniwym wyliczaniem. Powinno działać.

Nie! Uruchomienie tego spowoduje OverflowException. Jest tak, ponieważ używamy dziesiętnych, a 141. liczba Fibonacciego (~ 8,1E28) przekracza maksymalną wartość dziesiętną (~ 7,9E28).

Jednak int nie zgłasza wyjątku OverflowException po przekroczeniu jego maksymalnej wartości. Zamiast tego, zgodnie z oczekiwaniami, przepełnia się do wartości ujemnej. Więc jeśli zastąpimy int zamiast dziesiętnym, jak w poniższym kodzie, to powinno działać, prawda?

static void Main()
{
    Console.WriteLine(string.Join(",", fib().Take(141)));
    Console.ReadLine();
}

static IEnumerable<int> fib(int n = 0, int m = 1)
{
    if (n == 0)
    {
        yield return 0;
        yield return 1;
    }
    while (true)
    {
        yield return n + m;
        foreach(var x in fib(m, n+m).ToList())
        {
            yield return x;
        }
    }
}

Jeśli czytasz kod, powinno być oczywiste, dlaczego to nie zadziała. Jeśli nie ... Nie zmieniłem tylko typu z dziesiętnego na int; Włączyłem także wywołanie funkcji ToList () w instrukcji foreach. Zmusi to moduł oceniający do niecierpliwości do oceny. Spowoduje to nie 141 rekurencji, ale nieskończoną liczbę rekurencji. W rzeczywistości na długo zanim osiągnie nieskończoność, oczywiście przepełni stos, powodując, że środowisko wykonawcze wyrzuci wyjątek StackOverflowException. (premia: tego wyjątku nie można złapać, więc spowoduje to awarię środowiska wykonawczego)

Christian Palmstierna
źródło