Co? Żaden błąd? [Zamknięte]

197

Twoje zadanie jest proste. Napisz program, który oczywiście powinien generować błąd na pierwszy rzut oka, zarówno podczas kompilacji, jak i uruchamiania, ale albo nie, albo generuje jakiś inny niepowiązany błąd. To konkurs popularności, więc bądź kreatywny.

Jwosty
źródło
11
hmmmm .... to łamigłówka. +1
Tim Seguine
1
Chciałbym móc go znaleźć ... był stary przykład PL / I, który zawierał zdanie w stylu „jeśli jeśli jeśli = to wtedy, to wtedy = inaczej else = jeśli wtedy jeszcze ...” (PL / I zezwolił na użycie jego słowa kluczowe jako nazwy zmiennych, i miał wyrażenie warunkowe podobne do C ?, które również używało słów kluczowych if / then / else ...)
keshlam
8
Sugeruję cały język pieprzenia mózgów, ponieważ kod BF wygląda tak, jakby się nie skompilował.
Agi Hammerthief,
@NigelNquande tylko wtedy, gdy go nie znasz ...;)
Jwosty

Odpowiedzi:

281

C ++

Upewnij się, że skompilowałeś następujący kod w standardowym trybie zgodnym (na przykład dla g ++ użyj flagi -ansi):

int main()
{
  // why doesn't the following line give a type mismatch error??/
  return "success!";
}

Jak to działa:

?? / jest sekwencją trygraficzną, która jest tłumaczona na odwrotny ukośnik, który ucieka przed następną nową linią, więc następny wiersz jest nadal częścią komentarza i dlatego nie wygeneruje błędu składniowego. Zauważ, że w C ++ pominięcie powrotu mainjest dobrze zdefiniowane i równoznaczne ze zwróceniem 0, co oznacza pomyślne uruchomienie.

celtschk
źródło
7
Czuję, że pierwsza odpowiedź od razu wygrała to od razu.
tymczasowego
1
Jest również ważny w C99.
R ..
1
pojawiają się ostrzeżenia z
opcją
2
@ BЈовић Ściana zawsze rzuca ostrzeżenie o wszystkim
Kiwy
4
@Kiwy Zgłasza ostrzeżenie tylko dla kodu śmieci jak wyżej. -Wall nie rzuca ostrzeżeń o wszystkim.
BЈовић
86

Rubin

Zawsze fanem tego.

x = x

Nie NameError. x jest teraz nil.

To tylko „funkcja” Ruby :-)

Oto bardziej przyziemny, który już wcześniej mnie dopadł:

x = 42

if x < 0
  raise Exception, "no negatives please"
elseif x == 42
  raise Exception, "ah! the meaning of life"
else  
  p 'nothing to see here...'
end 

Drukuje „nic do zobaczenia”.

To elsif nie elseif . (i na pewno nie jest elif - biada niepoprawnemu programistowi pythonowemu (mnie)!) Więc interpreter elseif wygląda jak normalne wywołanie metody, a ponieważ nie wchodzimy do bloku x <0, przechodzimy od razu do innego i nie zgłaszaj wyjątku. Ten błąd jest niezwykle oczywisty w każdym środowisku wyróżniającym składnię, na szczęście (?) Kod golfowy nie jest takim środowiskiem.

roippi
źródło
5
Masz mnie. Zrobiłem wcześniej zarówno Python, jak i Lua, a teraz zaczynam od Ruby. Lua używa tego.
Riking
7
Znaczenie wszechświata jest niczym do zobaczenia?
user80551
77

DO?

Całkiem normalny kod tutaj ...

void main() = main--;

To Haskell, a nie C. Definiuje funkcję o nazwie „void”, która przyjmuje dwa argumenty. Pierwszy nosi nazwę „main”, a jeśli drugi (nienazwany) jest pustą krotką, zwraca zmienną „main”. „-” rozpoczyna komentarz w Haskell, więc „;” jest skomentowany.

intx13
źródło
21
Innymi słowy, to oszustwo?
Pan Lister,
75
Oszukiwanie jest normalne w zawodach wymagających kodu. Nazywamy to kreatywnością. : P
Joe Z.
31
Nazwałbym to oszustwem, a nie kreatywnością. Musisz zdefiniować środowisko, w którym działasz, zanim będziesz w stanie zastanowić się, czy jakiś kod będzie zawierał błąd, czy nie. W przeciwnym razie mógłbym dać ci szum linii, który jest Malbolge i zapytać, czy się kompiluje.
Tim S.
5
Ma to tylko sprawić, że zatrzymasz się na sekundę i powiesz „hej, możesz to zrobić ?” :)
intx13
10
@JoeZ. W niektórych przypadkach może wyglądać jak perl.
user80551
72

JavaScript

var а = 100;
if (typeof a !== 'undefined') throw 'This should always throw, right?';
console.log('How am I still alive?');

Oto jak to działa:

Pierwszy ato tak naprawdę а(to znaczy „a” Cryllic Unicode).

Klamka
źródło
8
Tę sztuczkę można zastosować w dowolnym języku, który akceptuje token Unicode (np. Java, C #).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨dd
83
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳, na przykładzie twojej nazwy użytkownika
TheDoctor
9
zbyt oczywiste rozwiązanie
thepirat000
6
zbyt oczywiste dla każdego, kto wcześniej tego doświadczył. Jestem pewien, że wpadnie na to wielu początkujących i tak zwanych „ekspertów internetowych”.
Thebluefish
42
Oczywisty? Więc zawsze patrzysz na swoje nazwy zmiennych za pomocą ich numerów Unicode zamiast ich wyglądu? Możesz to zauważyć, jeśli wyszukujesz „a” (lub „a”?) I nie możesz znaleźć tego, czego oczekujesz, ale po prostu czytając, nie możesz tego zobaczyć (przynajmniej w pokazanej tu czcionce).
Tim S.
70

JavaScript

Kiedy podawałem następujący kod, wiele razy mi mówiono: „To musi być literówka! Jak to działa?” .

console.log( 42..toString(2) );

Poniższy opis został skopiowany dokładnie z jednego z ostatnich przypadków .

Jak zapewne wiesz, w JavaScript wszystko oprócz literałów jest przedmiotem. Liczby są również obiektami. Tak więc teoretycznie (i praktycznie) możesz uzyskać właściwości lub metody wywoływania dowolnych literałów za pomocą notacji kropkowej, tak jak ty 'string'.lengthlub [1,2,3].pop(). W przypadku liczb możesz zrobić to samo, ale należy pamiętać, że po pojedynczej kropce analizator będzie szukał ułamkowej części liczby oczekującej wartości zmiennoprzecinkowej (jak w 123.45). W przypadku korzystania z całkowitą należy „powiedzieć” parser że część ułamkowa jest pusty, wyznaczając dodatkowy kropkę przed zajęcie nieruchomości: 123..method().

Wizja
źródło
18
Jako gość 422
Lua,
3
Nie widziałem wcześniej tego użycia, bardzo porządnie.
Nit
5
Źle się czujesz, będąc doskonale przyzwyczajonym do ..notacji, ale całkowicie nieświadomy w odniesieniu do .toString(a freaking argument here?)notacji: P No cóż, już się zorientowałem :)
David Mulder
Co to wyjście? I dlaczego ? Jestem ciekaw.
Nicolas Barbulesco,
3
Dla leniwych argument określa podstawę (więc wypisuje 42 w formacie binarnym) i wcale nie jest ważny dla tego kodu. ..jest częścią mylącą.
Kat
63

grzmotnąć

#!/bin/bash

[ 1 < 2 ] && exit

for i in `seq 1 $[2 ** 64]`
    do "$0" | "$0"
done

while [[ false ]]
    do :
done

if maybe
    do [: [: [: [: [; [; [; [; ;] ;] ;] ;] :] :] :] :]
fi

Wyniki

  • Można się spodziewać, że skrypt nie generuje żadnych błędów, ponieważ kończy działanie po pierwszym poleceniu. Nie ma

  • Można się spodziewać typowych komunikatów o błędach spowodowanych trwającą bombą widełkową z powodu forpętli. Nie ma bomby widelcowej.

  • Możesz spodziewać się, że bash narzeka na brakujące maybepolecenie lub całą masę błędów składniowych w ifbloku. Nie będzie.

  • Jedyny komunikat o błędzie, który może wygenerować skrypt, kończy się 2: No such file or directory.

Wyjaśnienie

  • [nie jest specjalny do bash, więc < 2wykonuje, jak zwykle, przekierowanie. Jeśli 2w bieżącym katalogu nie ma pliku o nazwie , spowoduje to błąd.

  • Z powodu powyższego błędu powyższe polecenie &&będzie miało niezerowy status wyjścia i exitnie zostanie wykonane.

  • forPętli nie jest nieskończona. W rzeczywistości nie ma w ogóle pętli. Ponieważ bash nie może obliczyć 64 potęgi 2, wynikiem wyrażenia arytmetycznego jest 0.

  • [[ false ]]sprawdza, czy falsejest łańcuchem zerowym. Tak nie jest, więc ta whilepętla jest nieskończona.

  • Z tego powodu ifinstrukcja nigdy nie zostanie wykonana, więc nie zostaną wykryte żadne błędy.

Dennis
źródło
55

Perl

use strict;
use warnings;
Syntax error!
exit 0;

Źródło i wyjaśnienie: https://stackoverflow.com/questions/11695110

tłum
źródło
137
Programy w Perlu ogólnie wyglądają jak błędy.
ugoren,
1
@ugoren Tylko wtedy, gdy są napisane i przeczytane przez osoby z niewielką znajomością Perla.
TLP
8
Uwielbiasz, że komentarz @ ugoren ma dwa razy więcej głosów pozytywnych niż odpowiedź :)
yo
2
Przypomina mi sztuczkę powłoki systemu Windows: „Jeśli jesteś szczęśliwy i wiesz, błąd składniowy!”
Jwosty
47

Jawa

class Gotcha {
    public static void main(String... args) {
        try  {
            main();
        } finally {
            main();
        }
    }
}

Tutaj nie ma przepełnienia stosu; poruszać się.

Na pierwszy rzut oka powinno to dać StackOverflowError, ale tak nie jest! W rzeczywistości po prostu działa wiecznie (przynajmniej do wszystkich praktycznych celów; technicznie zakończyłby się po pewnym czasie o wiele rzędów wielkości dłużej niż wiek wszechświata). Jeśli chcesz wiedzieć, jak / dlaczego to działa, zobacz to . Ponadto, jeśli zastanawiasz się, dlaczego możemy wywoływać main()bez argumentów, gdy główna metoda generalnie potrzebuje String[]argumentu, to dlatego, że zadeklarowaliśmy go tutaj jako argument zmienny, co jest całkowicie poprawne.

arshajii
źródło
3
Jak wyjaśnia pytanie, które połączyłeś, nie działa ono w nieskończoność, ale przez bardzo długi czas.
Kevin
1
@Kevin Nie bądźmy niepotrzebnie pedantyczni; „dłuższy niż wiek wszechświata” jest, dla wszystkich praktycznych celów, „na zawsze”.
arshajii
8
Mówisz „Tutaj nie ma przepełnienia stosu”, kiedy w rzeczywistości system ciągle przepuszcza przepełnienie stosu i ostatecznie wygeneruje wyjątek przepełnienia stosu. (jak wspomniałeś, ostatecznie może to potrwać bardzo długo) I zależy to od głębokości stosu. Na mniejszej maszynie wirtualnej lub systemie osadzonym głębokość stosu może być znacznie mniejsza.
McKay,
@McKay To stwierdzenie jest wyraźnie zwykłą, niepotrzebną linią, której nie należy traktować dosłownie. OP prosi o program, który wygląda jak powinien powodować błąd, ale nie robi tego. W ogólnym przypadku powyższa odpowiedź spełnia ten wymóg. Jasne, możemy wymyślić niejasną sytuację, w której tak nie jest, ale to nie unieważnia odpowiedzi. Mam nadzieję, że ponownie rozpatrzysz swoją opinię.
arshajii
3
@McKay Nawiasem mówiąc, załóżmy, że rozmiar stosu jest niewielki (np. 100 w przeciwieństwie do normalnego ~ 10 000) i nadal możemy wykonywać 10 000 000 połączeń na sekundę. Następnie całkowity czas pracy wynosi 4 019 693 684,133,147 lat - wciąż wiele rzędów wielkości większych niż wiek wszechświata.
arshajii
42

CoffeeScript

What? No error? Yep, this code does not have any bugs, why would it?

?po nim spacja to operator, który wywołuje funkcję, ale tylko jeśli istnieje. JavaScript nie ma wywoływanej funkcji What, dlatego funkcja nie jest wywoływana, a jej argumenty są po prostu ignorowane. Inne słowa w kodzie to wywołania funkcji, które w rzeczywistości nie są wywoływane, ponieważ Whatfunkcja nie istnieje. Na koniec ?jest operatorem istnienia, ponieważ nie jest używany w funkcji wywołania. Inne zakończenia zdań, takie jak .lub !nie działałyby tak jak w .przypadku metod, i !nie są operatorem (którego nie można użyć po identyfikatorze). Aby dowiedzieć się, jak CoffeeScript przekonwertował to na JavaScript, odwiedź http://coffeescript.org/#try:What%3F%20No%20error%3F%20Yep%2C%20this%20code%20does%20not%20have%20any%20bugs%2C % 20 dlaczego% 20it% 20 chciałbym% 3F .

Konrad Borowski
źródło
36

VBScript

&Operator w VBScript jest ciąg konkatenacji, ale to, co na ziemi są &&i &&&operatorów? (Pamiętaj, że operator „i” w VBScript Andnie jest &&.)

x = 10&987&&654&&&321

Ten fragment programu jest legalnym VBScript. Dlaczego? Jaka jest wartość x?

Lexer rozbija to jako x = 10 & 987 & &654& & &321. Literał całkowity, który zaczyna się od, &jest, co dziwne, literałem ósemkowym. Oktalowy literał, który kończy się, &jest, co bardziej dziwne, długą liczbą całkowitą. Więc wartość x jest połączeniem wartości dziesiętnych tych czterech liczb: 10987428209.

Eric Lippert
źródło
8
To tylko ... wow.
primo
27

Cel C

Nie jest to wielka sprawa, ale zaskoczyło mnie, gdy próbowałem umieścić link w komentarzu:

http://www.google.com
        return 42;

http jest tutaj etykietą kodową, takie etykiety są używane w instrukcjach goto

Piotr
źródło
8
Powinno to działać w każdym języku podobnym do C, który obsługuje //komentarze.
Ilmari Karonen,
Tak, prawdopodobnie nie byłem pewien podczas pisania
Piotr
14
Ogranicz jednak jeden adres URL na protokół na zakres.
Ben Voigt
1
Nadal możesz używać https: // w tym samym zakresie.
Florian F
25

DO#

class Foo
{
    static void Main(string[] args)
    {
        Bar();
    }

    static IEnumerable<object> Bar()
    {
        throw new Exception("I am invincible!");
        yield break;
    }
}

Ponieważ Barmetoda wykonuje a yield, metoda faktycznie nie działa po wywołaniu, zwraca moduł wyliczający, który po iteracji s uruchamia metodę.

McKay
źródło
Nareszcie ... Oto FOO i BAR :)
VVK
1
Do tego służą foo i bar;) nazwy rzeczy, które tak naprawdę nie mają znaczenia.
McKay,
22

do

main=195;

Działa na platformach x86, gdzie 195 to kod operacji dla ret. Nic nie robi,

ugoren
źródło
Kod operacji dla ret to 195, a nie 193, prawda?
Dennis
Nie działa dla mnie. Spodziewałbym się, że spowoduje to wykonanie kodu pod adresem 195.
nwellnhof
Tbanks @Dennis, kod był poprawny, wyjaśnienie błędne.
ugoren
3
Na dowolnej platformie (w tym współczesnej x86), w której strony mogą być odczytywane bez możliwości wykonywania, spowoduje to awarię po wejściu na, mainponieważ mainzostało umieszczone w segmencie danych, który nie jest wykonywalny. Zabawnie, const int main=195będzie nie upaść (na x86) (ale będzie produkować śmieci status wyjścia), ponieważ .rodatadomyślnie jest umieszczany w tym samym segmencie, .texta zatem jest wykonywalny. ( const char main[]="1\300\303";zakończy się sukcesem! (wciąż na x86))
zwolnij
2
Jestem na komputerze 64-bitowym (nie wiem, czy to cokolwiek zmieni), a main = 195 daje awarię, ale const int main = 195; Pracuje.
w4etwetewtwet
21

Jawa

Prawdopodobnie zbyt oczywiste.

public static void main(String[] varargs) throws Exception{
    char a, b = (char)Integer.parseInt("000d",16);
    // Chars have \u000d as value, so they're equal
    if(a == b){
        throw new Exception("This should be thrown");
    }
}

Co?

Zgłasza błąd składni po \u000d. \u000djest Unicode dla nowej linii. Mimo że jest komentowany, kompilator Java traktuje to, co po nim, jako kod, ponieważ nie jest już komentowany.

Tom Verelst
źródło
11
Twój varargsnie są varargs;)
Navin
Pytanie brzmiało: „kod, który wygląda, jakby zawiódł, ale nie”, a nie „kod, który wygląda, że ​​zawodzi, ale robi to w inny sposób”. Błąd składniowy zamiast wyjątku jest nadal błędem.
Nzall,
19
Myślę, że powinieneś ponownie przeczytać oryginalne pytanie: „lub wywołuje inny niepowiązany błąd”.
Tom Verelst,
Właściwie bez \u000dtego użyłby odniesienia do niezdefiniowanej wartości a.
LegionMammal978
19

C ++

#include <iostream>

int succ(int x)
{
  return x + 1;
}

int succ(double x)
{
  return int(x + 1.0);
}

int succ(int *p)
{
  return *p + 1;
}

int main()
{
  std::cout << succ(NULL) << '\n';
}

Dlaczego?

NULLjest stałą międzygalową, więc odpowiada intprzeciążeniu ściśle lepiej niż ta int*. Mimo to większość programistów ma NULLpowiązania ze wskaźnikami, więc można się spodziewać zerowego odchylenia wskaźnika.

Angew
źródło
11
Na szczęście C ++ 11 pozwala implementacjom zdefiniować NULLjako nullptr, a implementacje, które to robią (jeszcze nie wiem, ale ich oczekuję) spowodują oczekiwany błąd segmentacji.
hvd
16

Pyton

print """""quintuple-quoted strings!"""""

Idealnie poprawny, ale wynik jest trudny do odgadnięcia. Pierwsze 3 "znaki rozpoczynają ciąg wielowierszowy, a następne dwa są częścią ciągu. Na końcu pierwsze trzy" kończą ciąg, a ostatnie dwa są literałami pustych ciągów, które są parowane przez analizator składni z ciągiem wielowierszowym .

Fraxtil
źródło
20
Tylko bonus: print """""""""Python strings don't have to start with the same number of quotes they end with.""""".
Konrad Borowski
15

JavaScript

if (1/0 === -1/0) {
  throw "Surely there's an error in here somewhere...";
}

Jak to działa:

W JS występuje dodatnia i ujemna nieskończoność i nie ma błędu przy dzieleniu przez zero.

nazwa_użytkownika tymczasowego
źródło
2
Powinieneś także być w stanie wykonać kilka sztuczek z NaN ...
intx13
8
meh, dzieje się tak w dowolnym języku z pływakami.
Navin
3
@Navin: w dowolnym języku ze zmiennoprzecinkowymi, gdzie dzielenie przez zero nie powoduje błędu.
nwk
2
@nwk Standard IEEE dla liczb zmiennoprzecinkowych mówi, że dzielenie przez zero musi być inf. Nie znam języków, które to zmieniają.
Navin,
1
IEEE 754 określa dwa modele: sygnalizowanie NaN / Inf (które podnoszą wyjątki w podziale zera FP, pierwiastek kwadratowy z -1, niedopełnienie / przepełnienie itp.) Oraz brak sygnalizacji (który traktuje NaN/ Infpodobnie jak zwykłe wartości argebraiczne z dobrze zdefiniowaną matematyką na nich). Nowoczesny sprzęt FP można skonfigurować do pracy w obie strony. Niezależne od języka; wstyd nie wiedzieć.
ulidtko
14

C ++

Mieszanie trygrafów i lambda bez przestrzeni może być dość mylące i zdecydowanie wyglądać błędnie dla osób, które nie są świadome trygrafów:

int main()
{
    return??-??(??)()??<return"??/x00FF";??>()??(0??);
}

Jak to działa:

Niektóre sekwencje składające się z 3 symboli, zaczynające się od ??, nazywane są trigrafami i zostaną zastąpione przez w pełni zgodny preprocesor. Wstępnie przetworzona linia, o której mowa, wygląda następująco: return ~ [] () {return "\ x00FF"; } () [0]; Jak widać, jest to tylko zbędna funkcja lambda zwracająca ciąg znaków składający się ze znaku 0xFFth. [0] właśnie wydobywa tę postać i ~ niezapominajki, więc 0 jest zwracana.

aVoX
źródło
12
Prawidłowy program w C ++ int main(){(([](){})());}może również wyglądać ładnie, gdy trygraped ...
Angew
1
Co on w ogóle robi?
Joe Z.
1
@Joe Z [](){}jest funkcją lambda, podobnie jak [](int a){return a+1;}jedna. ([](){})()wywołuje tę funkcję, zwracając, voidjeśli się nie mylę. Całość (([](){})());sprowadza się więc do (void);, co jest stwierdzeniem, że nic nie robi. mainwtedy po prostu zwraca zero, tak jak powinno bez returninstrukcji.
tomsmeding
13

VBA / VB6

Private Sub DivByZero()

    Dim x() As String
    x = Split(vbNullString, ",")

    Debug.Print 1 / UBound(x)

End Sub

Rozdzielenie pustego łańcucha rozdzielanego przecinkami powinno dać pustą tablicę. Czy powinien być oczywisty podział przez zero błędów, prawda?

Nie. Zaskakujące jest, że gdy dowolny ciąg o zerowej długości jest dzielony, środowisko wykonawcze daje tablicę z dolną granicą 0 i górną granicą -1. Powyższy kod wyświetli -1.

Komintern
źródło
@minitech Właściwie, jeśli przekażesz pustą tablicę do UBound, otrzymasz błąd poza zakresem indeksu dolnego.
Comintern,
… dobrze. Cofam tamto. VBA = /
Ry-
1
@minitech Yep. Rozumiem, że to był błąd w oryginalnej implementacji Split w VB6. W .NET celowo „dodali” (a może udokumentowano to lepsze słowo) zachowanie pustych tablic zwracających UBound równe -1 w celu zachowania kompatybilności wstecznej z całym kodem VB6, który skorzystał z tego hacka. Dzielenie łańcucha zerowego jest jedynym sposobem na natywne uzyskanie tej tablicy w VBA / VB6 bez wywołań interfejsu API systemu Windows.
Comintern
12

JavaScript

5..toString();
5 .toString();

Daje: 5

Natomiast:

5.toString();

Podaje błąd SyntaxError

Jak to działa:

JavaScript próbuje parsować kropkę na liczbie jako literał zmiennoprzecinkowy

Sumeet Kashyap
źródło
13
Jak to się stało, że opublikowałeś dokładnie tę samą sprawę, co godzinę po mnie?
VisioN
1
Hej Wizja, przepraszam, ale nie sprawdziłem twojej odpowiedzi. Dodałem także skrzynkę z miejscem. Czytałem to raz w javascript garden nic więcej.
Sumeet Kashyap
1
Sumeet, nie przepraszaj. Twoja odpowiedź jest ładniejsza - i znacznie jaśniejsza - niż odpowiedź @VisioN.
Nicolas Barbulesco
12

HTML

Pierwszy post tutaj, nie jestem pewien czy dostaję to czy nie, ale proszę bardzo.

<html>
    <head></head>
    <body>
        <?php $_POST['non-existant'] = $idontexisteither ?>
    </body>
</html>

To jest .html plik ...

Albzi
źródło
9
Więc sztuczka polega na tym, że nie wykona bloku PHP, ponieważ plik ma .htmlrozszerzenie, a twój serwer internetowy nie jest skonfigurowany do analizowania .htmlplików jako PHP?
VisioN
5
Tak. Czy to oszustwo? @VisioN
Albzi
2
Jestem prawie pewien, że to oszustwo. Przynajmniej napisz „HTML” pogrubioną czcionką u góry.
Navin
Miły ! :-) Sztuczka zadziałała na mnie.
Nicolas Barbulesco,
1
Zredagowałem, aby wyjaśnić, w jakim języku jest to napisane
vijrox
9

PHP (40 bajtów)

<?for(;;$e.=$e++)foreach($e::$e()as&$e);

Oto odpowiedź, którą udzieliłem w tym pytaniu: Program kontroli szaleństwa

Pomysł polegał na stworzeniu kodu, który powodował błędy.

Pierwszy błąd, o którym pomyślimy, to błąd składniowy.

Brak błędów składniowych ...

Innym byłoby to, że klasa / funkcja nie istnieje.

To nie biegnie tak daleko ...

Innym byłoby przekroczenie limitu czasu lub przepełnienie pamięci, ale znowu nie osiąga aż tak daleko ...

Przetestuj kod tutaj: http://writecodeonline.com/php/ (usuń <?na początku, aby przetestować).

Ismael Miguel
źródło
3
To konkurs popularności. Nie trzeba ograniczać swojego kodu, aby zaoszczędzić bajty. Po prostu sformatuj go dla lepszej czytelności;)
Songo
Później dodam czytelną wersję. Użyłem tej samej dokładnej odpowiedzi i wcale jej nie edytowałem.
Ismael Miguel
foreach(e()as&$e);jest rdzeniem tego rozwiązania. e()jest po prostu utrzymanie sprawdzania składni i &$epo tym, asco powoduje awarię.
TheConstructor
W rzeczywistości wszystko odgrywa ważną rolę.
Ismael Miguel
9

VBScript

Użytkownicy Visual Basic 6 będą o tym wiedzieć

If Blah Then Foo Bar

jest legalne, jak jest

If Blah Then 
    Foo Bar
End If

Ale co z

If Blah Then Foo Bar End If

? Okazuje się, że jest to legalne w VBScript, ale nie w VB6. Dlaczego?

To błąd w parserze; celem było odrzucenie tego. Kod, który wykrywa, End Ifmiał także sprawdzić, czy była to Ifinstrukcja wieloliniowa , a nie zrobił tego. Kiedy próbowałem to naprawić i wysłałem wersję beta z poprawką, pewna wpływowa organizacja branżowa odkryła, że ​​ma ten wiersz kodu w jednym ze swoich programów VBScript i powiedziała, że ​​przyznają nowej wersji niską ocenę, chyba że usuniemy naprawiono błąd, ponieważ nie chcieli zmieniać kodu źródłowego.

Eric Lippert
źródło
Czy jest jakaś wada polegająca na pozostawieniu błędu nie naprawionego, oprócz umożliwienia pisania kodu VBS, który nie jest prawidłowy w VB6?
Gabe
1
@Gabe: Nie, nie ma innej wady, poza tym trudniejsze jest przeniesienie kodu VBScript na VB.
Eric Lippert,
1
Imię ! Kim jest ta organizacja wiadomości?
Nicolas Barbulesco,
9

do

Przypomniało mi to błąd, który napotkałem, gdy nauczyłem się C. Niestety, oryginalny wariant nie działa z obecnym GCC, ale ten nadal:

#define ARR_SIZE 1234
int main() {
    int i = ARR_SIZE;
    int arr[ARR_SIZE];
    while(i >= 0) {
        (--i)[arr] = 0;
    }
    i = *(int*)0;
}

To oczywiście segreguje, ponieważ nie uwzględniamy wskaźnika zerowego, prawda?

Źle - w rzeczywistości jest to nieskończona pętla, ponieważ nasz stan pętli jest wyłączony o jeden. Z powodu zmniejszenia przedrostka idziała od 1023 do -1. Oznacza to, że przypisanie zastępuje nie tylko wszystkie elementy arr, ale także lokalizację pamięci bezpośrednio przed nią - która przypadkiem jest miejscem iprzechowywania. Po osiągnięciu -1, inadpisuje się z 0a więc warunek jest spełniony pętla ponownie ...

To był oryginalny wariant I, którego nie mogę już odtworzyć:

To samo działało z iprzejściem w górę od 0 i wyłączeniem jednego. Najnowszy GCC zawsze zapisuje iwcześniej arrw pamięci; musiało być inaczej w starszych wersjach (być może w zależności od kolejności deklaracji). To był prawdziwy błąd, który popełniłem w jednym z moich pierwszych programów zabawek dotyczących tablic.

Jest to również oczywiste, jeśli wiesz, jak działają wskaźniki w C, ale może być zaskakujące, jeśli nie:

Możesz pomyśleć, że przypisanie do (--i)[arr]powoduje błąd, ale jest prawidłowe i równoważne z arr[--i]. Wyrażenie a[x]jest po prostu cukrem składniowym, dla *(a + x)którego oblicza i odsyła wskaźnik do indeksowanego elementu; dodanie jest oczywiście przemienne, a zatem równoważne z *(x + a).

l4mpi
źródło
1
Z tego co widzę, ciało pętli nigdy nie powinno być wykonywane (ponieważ 1234 <= 0 ma wartość false). Czy miałeś na myśli napisać „> =”?
celtschk
1
@celtschk tak, to była literówka. Dzięki za zauważenie!
l4mpi,
Czy to wyrównanie pamięci jest rzeczywiście określone, czy tylko zaimplementowane w ten sposób w niektórych kompilatorach?
Paŭlo Ebermann
9

Jawa

public class WhatTheHeckException extends RuntimeException {
    private static double d;        // Uninitialized variable
    public static void main(String... args) {
        if (d/d==d/d) throw new WhatTheHeckException();
        // Well that should always be true right? == is reflexive!

        System.out.println("Nothing to see here...");
    }
}

Dlaczego to działa:

Jednostkowe pola mają wartości domyślne. W tym przypadku d wynosi tylko 0 . 0/0 = NaN w podwójnym dzieleniu, a NaN nigdy się nie równa, więc if zwraca false. Zauważ, że to nie zadziałałoby, gdybyś miał 0/0 == 0/0 , ponieważ w przy całkowitym podziale 0/0 Mógłby wygenerować wyjątek ArithmeticException .

durron597
źródło
8

C ++ 11

struct comp {
    comp operator compl () { return comp { }; }
    operator comp () { return comp { }; }
    compl comp () { return; comp { }; }
};

int main() {
    comp com;
    compl com;
}

Kompiluje i uruchamia się bez żadnych ostrzeżeń z g++ -pedantic-errors -std=c++11.

compljest standardową alternatywną pisownią dla ~, tak jak notjest alternatywą dla !. complsłuży tutaj do nadpisania, operator~a następnie zdefiniowania destruktora. Inną sztuczką jest to, że operator compjest to funkcja konwersji z typu compna samą. Co zaskakujące, standard nie zabrania takiej funkcji konwersji - ale mówi, że taka funkcja nigdy nie jest używana.

Han
źródło
8

VBScript

function[:(](["):"]):[:(]=["):"]:
end function
msgbox getref(":(")(":)")

'Output: :)

Co to robi:

Nazwy funkcji, sub i zmiennych w VBScript mogą być dowolne, jeśli używasz nawiasów kwadratowych. Ten skrypt tworzy wywoływaną funkcję :(i jeden argument, "):"ale ponieważ nie przestrzegają normalnej konwencji nazewnictwa, są otoczone nawiasami kwadratowymi. Wartość zwracana jest ustawiona na wartość parametru. Dodatkowy dwukropek służy do uzyskania wszystkiego w jednej linii. Instrukcja Msgbox pobiera odwołanie do funkcji (ale nie potrzebuje nawiasów) i wywołuje ją z uśmieszkiem :)jako parametrem.

AutomatedChaos
źródło
1
Tak wiele frownich twarzy :(
Joe Z.
8

DO#

Właściwie złapałem się na tym, że mylnie to robię :)

public static object Crash(int i)
{
    if (i > 0)
        return i + 1;
    else
        return new ArgumentOutOfRangeException("i");
}

public static void Main()
{
    Crash(-1);
}

rzucać , nie wracać .

Zjawa
źródło
Haha, witamy na stronie! Wyrazy uznania za odwagę jako pierwszy post. :)
Jonathan Van Matre
7

Jawa

enum derp
{

    public static void main(String[] a)
    {
        System.out.println(new org.yaml.snakeyaml.Yaml().dump(new java.awt.Point()));
    }
}

I jak to działa:

Podejrzewasz, że uważasz, że Enum jest nieważne, ale jest ważne; wtedy myślisz, że wypisze standardowe atrybuty obiektów Point, ale Gotcha! ze względu na sposób serializacji Snakeyaml otrzymujesz płynny błąd StackOverFLow

I kolejny:

enum derp
{

    ;public static void main(String[] a)
    {
        main(a);
    }
    static int x = 1;

    static
    {
        System.exit(x);
    }
}

myślisz, że wystąpi przepełnienie stosu z powodu oczywistej rekurencji, ale program nadużywa faktu, że kiedy go uruchomisz, static{} blockzostanie on wykonany jako pierwszy i dlatego kończy działanie przed ładowaniem main ()

enum derp
{

    ;
        public static void main(
            String[] a)
    {
        int aa=1;
        int ab=0x000d;
        //setting integer ab to \u000d  /*)
        ab=0;

        /*Error!*/
        aa/=ab;
    }
    static int x = 1;
}

ten opiera się na tym /*Error*/-komentowanym kodzie jako punkcie końcowym komentarza otwartego przed ab = 0; wyjaśnienie liczby całkowitej ab do 0x000d ukrywa nowy wiersz, aby aktywować komentarz do następnego wiersza

masterX244
źródło
1
Nie mogę teraz, ale byłoby miło, gdybyś sformatował to, jeśli to możliwe. Jest to trochę trudne do odczytania, ponieważ ...: P
Jwosty
uczyniły ich bardziej oczywistymi; a znaczniki spoilera są zamierzone, ponieważ sztuczki na początku nie są oczywiste
masterX244
2
Poczekaj, więc pierwszy rzeczywiście powoduje błąd? To jest przeciwieństwo pytania. A dlaczego nie tylko System.exit (1) w drugim?
Riking
3
Żaden programista Java nie spodziewałby się przepełnienia stosu w drugim fragmencie. Przepraszam, to zdecydowanie zbyt oczywiste.
Tobias
1
@VVK przyzwyczajenie się do używania kodu enum{zamiast class{oszczędzania bajtu
masterX244
6

do

Ciągi i tablice wc mogą być dość mylące

main(){
  int i=0;
  char string[64]="Hello world;H%s";
  while(strlen(&i++[string])){
    i[' '+string]=string[i]-' ';
  }
  5[string]=44;
  return printf(string,'!'+string);
}
orion
źródło
9
jest trudny do odczytania, ale nie wiem, jakiego rodzaju błędu oczekują od tego ludzie
Bryan Chen
3
Chciałem tylko przypomnieć ludziom o ważnej, ale niekonwencjonalnej notacji - zrób to, co chcesz. Z pewnością rozejrzałbym się trzy razy, zanim powiem, że to jest ważne. Po pierwsze, wyrażenia takie jak 5 [ciąg] nie są dobrze znane zwykłemu koderowi i są sprzeczne z logiką indeksowania tablic. Po drugie, ciąg „” + wygląda jak dodanie 2 ciągów, ale z niewłaściwym typem cudzysłowu. Po trzecie, i i ++ wygląda jak adres liczby całkowitej (ale pierwszeństwo to załatwia). Wreszcie, piszemy poza literałem ciągów (ale nie poza większym buforem kopii zapasowej).
Orion
Nie wydaje się tak źle. Napisałem tylko trochę w C ++, ale mogę to rozgryźć.
Navin