Was? Kein Fehler? [geschlossen]

197

Ihre Aufgabe ist einfach. Schreiben Sie ein Programm, das beim Kompilieren oder Ausführen offensichtlich auf den ersten Blick einen Fehler erzeugt, aber entweder keinen oder einen anderen Fehler erzeugt. Dies ist ein Beliebtheitswettbewerb, also sei kreativ.

Jwosty
quelle
11
hmmmm .... das ist ein brain teaser. +1
Tim Seguine
1
Ich wünschte, ich könnte es finden ... Es gab ein altes PL / I-Beispiel, das eine Anweisung in der Form von "wenn wenn = dann dann dann = sonst sonst = wenn dann sonst ..." enthielt (PL / I erlaubte die Verwendung von seine Schlüsselwörter als Variablennamen und hatten einen ähnlichen bedingten Ausdruck wie C?: das verwendete auch die Schlüsselwörter if / then / else ...)
keshlam
8
Ich schlage die gesamte Brainfuck-Sprache vor, da BF-Code so aussieht, als würde er nicht kompiliert.
Agi Hammerthief
@ NigelNquande nur, wenn Sie nicht damit vertraut sind ...;)
Jwosty

Antworten:

281

C ++

Stellen Sie sicher, dass Sie den folgenden Code im standardkonformen Modus kompilieren (verwenden Sie für g ++ beispielsweise das Flag -ansi):

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

Wie es funktioniert:

Das ?? / ist eine Trigraph-Sequenz, die in einen Backslash übersetzt wird, der die folgende neue Zeile übergeht, sodass die nächste Zeile immer noch Teil des Kommentars ist und daher keinen Syntaxfehler erzeugt. Beachten Sie, dass das Weglassen der Rückgabe in C ++ klar maindefiniert ist und der Rückgabe von 0 entspricht, was auf eine erfolgreiche Ausführung hinweist.

Celtschk
quelle
7
Ich habe das Gefühl, als hätte die erste Antwort sofort gewonnen.
temporary_user_name
1
Es ist auch in C99 gültig.
R ..
1
Es gibt Warnungen mit -Wall
BЈовић
2
@ BЈовић Wand immer vor allem warnen
Kiwy
4
@ Kiwy Es wird nur eine Warnung für den oben genannten Müllcode ausgegeben. Die -Wand warnt nicht für alles.
Freitag,
86

Rubin

Immer ein Fan von diesem.

x = x

Nein NameError. x ist jetzt nil.

Dies ist nur ein "Feature" von Ruby :-)

Hier ist eine profane, die mir schon mal untergekommen ist:

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 

Druckt "hier gibt es nichts zu sehen."

Es ist elsif , nicht elseif . (Und für den eigensinnigen Python-Programmierer (mich) ist das sicherlich kein Problem !) Für den Interpreter sieht also elseif wie ein normaler Methodenaufruf aus, und da wir den x <0-Block nicht eingeben, fahren wir direkt mit else und fort Wirf keine Ausnahme aus. Dieser Fehler ist in jeder Syntax-Highlighting-Umgebung unglaublich offensichtlich. Zum Glück ist (?) Code Golf keine solche Umgebung.

roippi
quelle
5
Du hast mich. Ich habe sowohl Python als auch Lua gemacht und fange jetzt mit Ruby an. Lua benutzt das.
Riking
7
Die Bedeutung des Universums ist nichts zu sehen?
user80551
77

C?

Ziemlich normaler Code hier ...

void main() = main--;

Es ist Haskell, nicht C. Es definiert eine Funktion namens "void", die zwei Argumente akzeptiert. Das erste heißt "main" und wenn das zweite (unbenannt) ein leeres Tupel ist, gibt es die Variable "main" zurück. "-" startet einen Kommentar in Haskell, also das ";" ist auskommentiert.

intx13
quelle
21
Also mit anderen Worten, es betrügt?
Mr Lister
75
Betrug ist bei Code-Challenge-Wettbewerben normal. Wir nennen es Kreativität. : P
Joe Z.
31
Ich würde dies als Betrug bezeichnen, nicht als Kreativität. Sie müssen die Umgebung definieren, in der Sie ausgeführt werden, bevor Sie überhaupt überlegen können, ob Code fehlerhaft ist oder nicht. Ansonsten könnte ich dir einfach das Leitungsrauschen geben, das Malbolge ist und dich fragen, ob es kompiliert.
Tim S.
5
Es soll dich nur für eine Sekunde innehalten lassen und sagen : "Hey, kannst du das?" :)
intx13
10
@JoeZ. Es könnte wie Perl in einigen Fällen suchen.
user80551
72

JavaScript

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

So funktioniert das:

Das erste aist tatsächlich ein а(dh Cryllic Unicode "a").

Türknauf
quelle
8
Dieser Trick kann auf alle Sprachen angewendet werden, die Unicode-Token akzeptieren (z. B. Java, C #).
n̴̖̋h̷͉̃a̷̭̿h̷̭̿d̸̡̅ẗ̵̨́
83
@ n̴̖̋h̷͉̃ã̷͉h̷̭̿d̷̰̀ĥ̷̳, am Beispiel Ihres Benutzernamens
TheDoctor
9
zu offensichtliche Lösung
thepirat000
6
zu offensichtlich für jeden, der es schon einmal erlebt hat. Ich bin mir sicher, dass viele Neulinge und so genannte "Web-Experten" darauf stolpern könnten.
Thebluefish
42
Offensichtlich? Sie betrachten Ihre Variablennamen also immer anhand ihrer Unicode-Nummern und nicht danach, wie sie aussehen? Sie werden es vielleicht bemerken, wenn Sie nach "a" (oder "à"?) Suchen und nicht finden, was Sie erwarten, aber wenn Sie es einfach lesen, können Sie es nicht sehen (zumindest in der hier gezeigten Schriftart).
Tim S.
70

JavaScript

Als ich den folgenden Code zur Verfügung stellte, wurde mir oft gesagt: "Es muss ein Tippfehler sein! Wie kann es funktionieren?" .

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

Die folgende Beschreibung wurde genau aus einem der letzten Fälle kopiert .

Wie Sie wahrscheinlich wissen, ist in JavaScript alles außer Literalen ein Objekt. Zahlen sind auch Objekte. Theoretisch (und praktisch) können Sie also Eigenschaften abrufen oder Methoden eines beliebigen Nicht-Literalen über die Punktnotation aufrufen, wie Sie dies tun 'string'.lengthoder tun [1,2,3].pop(). Bei Zahlen können Sie dasselbe tun, aber Sie sollten berücksichtigen, dass der Parser nach einem einzelnen Punkt nach einem Bruchteil der Zahl sucht, der einen Gleitkommawert erwartet (wie in 123.45). Wenn Sie eine ganze Zahl verwenden , sollten Sie „sagen“ , um den Parser, der ein Bruchteil leer ist, einen zusätzlichen Punkt Einstellung bereits vor dem Adressieren: 123..method().

Vision
quelle
18
Als Lua-Typ hatte ich erwartet422
Mittwoch,
3
Ich habe diese Verwendung noch nie gesehen, sehr ordentlich.
Nit
5
Fühlen Sie sich schlecht, wenn Sie perfekt an die ..Notation gewöhnt sind, aber völlig ahnungslos in Bezug auf die .toString(a freaking argument here?)Notation: P Na ja, ich habe es inzwischen herausgefunden :)
David Mulder
Was gibt diese Ausgabe aus? Und warum ? Ich bin neugierig.
Nicolas Barbulesco
3
Für die Faulen gibt das Argument die Basis an (dies gibt also 42 binär aus) und ist für diesen Code überhaupt nicht wichtig. ..ist der verwirrende Teil.
Kat
63

Bash

#!/bin/bash

[ 1 < 2 ] && exit

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

while [[ false ]]
    do :
done

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

Ergebnisse

  • Sie können erwarten, dass das Skript überhaupt keine Fehler erzeugt, da es nach dem ersten Befehl beendet wird. Das tut es nicht.

  • Sie können die typischen Fehlermeldungen erwarten, die durch eine fortlaufende Gabelbombe aufgrund der forSchleife verursacht werden. Es gibt keine Gabelbombe.

  • Sie können davon ausgehen, dass sich Bash über den fehlenden maybeBefehl oder den gesamten Syntaxfehler im ifBlock beschwert . Das wird es nicht.

  • Die einzige Fehlermeldung, die das Skript möglicherweise ausgibt, endet mit 2: No such file or directory.

Erläuterung

  • [ist nicht speziell für das Bashing, < 2führt also wie gewohnt eine Umleitung durch. Sofern sich 2im aktuellen Verzeichnis keine Datei mit Namen befindet , wird ein Fehler verursacht.

  • Aufgrund des oben genannten Fehlers hat der Befehl zuvor &&einen Exit-Status ungleich Null und exitwird nicht ausgeführt.

  • Die forSchleife ist nicht unendlich. Tatsächlich gibt es überhaupt keine Schleife. Da bash die 64. Potenz von 2 nicht berechnen kann, lautet das Ergebnis des arithmetischen Ausdrucks 0.

  • [[ false ]]testet, ob falsees sich um eine Nullzeichenfolge handelt. Ist es nicht, also ist diese whileSchleife unendlich.

  • Aus diesem Grund wird die ifAnweisung nie ausgeführt, sodass keine Fehler erkannt werden.

Dennis
quelle
55

Perl

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

Quelle und Erklärung: https://stackoverflow.com/questions/11695110

Mob
quelle
137
Perl-Programme sehen im Allgemeinen wie Fehler aus.
Ugoren
1
@ugoren Nur wenn geschrieben und gelesen von Personen mit geringen Perl-Kenntnissen.
TLP
8
Du wirst es lieben, wenn @ ugorens Kommentar doppelt so viele positive Stimmen hat wie die Antwort :)
yo '
2
Erinnert mich an den Windows-Shell-Trick "Wenn Sie zufrieden sind und es wissen, Syntaxfehler!"
Jwosty
47

Java

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

Hier läuft kein Stapel über; weitergehen.

Auf den ersten Blick sollte dies ein Ergebnis liefern StackOverflowError, aber das tut es nicht! Es läuft eigentlich nur für immer (zumindest für alle praktischen Zwecke; technisch würde es nach einer Zeit enden, die viele Größenordnungen länger ist als das Alter des Universums). Wenn Sie wissen möchten, wie / warum dies funktioniert, lesen Sie dies . Wenn Sie sich fragen, warum wir main()ohne Argumente aufrufen können, wenn die main-Methode im Allgemeinen ein String[]Argument benötigt: Wir haben es hier als variables Argument deklariert, was durchaus gültig ist.

arshajii
quelle
3
Wie die von Ihnen verlinkte Frage erklärt, läuft sie nicht auf unbestimmte Zeit, sondern über einen extrem langen Zeitraum.
Kevin
1
@ Kevin Lassen Sie uns hier nicht unnötig pedantisch werden; "länger als das Zeitalter des Universums" ist praktisch "für immer".
Arshajii
8
Sie sagen "Hier läuft kein Stapel über", obwohl das System ständig Stapelüberläufe auslöst und schließlich eine Stapelüberlauf-Ausnahme auslöst. (Wie Sie bereits erwähnt haben, kann dies möglicherweise sehr lange dauern.) Und es hängt von der Stapeltiefe ab. Auf einer kleineren VM oder einem eingebetteten System könnte die Stapeltiefe viel geringer sein.
McKay
@McKay Diese Aussage ist eindeutig eine bloße Wegwerflinie, die nicht wörtlich genommen werden soll. Das OP fragt nach einem Programm, das wie ein Fehler aussieht, dies aber nicht tut. Im allgemeinen Fall erfüllt die obige Antwort diese Anforderung. Sicher, wir können eine obskure Situation schaffen, in der dies nicht der Fall ist, aber das macht die Antwort nicht ungültig. Ich hoffe, dass Sie Ihre Ablehnung überdenken.
Arshajii
3
@McKay Angenommen, die Stack-Größe ist klein (z. B. 100 im Gegensatz zu den normalen ~ 10.000), und wir können immer noch 10.000.000 Anrufe pro Sekunde tätigen. Dann ergibt sich eine Gesamtlaufzeit von 4.019.693.684.133.147 Jahren - immer noch viele Größenordnungen größer als das Alter des Universums.
Arshajii
42

CoffeeScript

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

?gefolgt von einem Leerzeichen ist ein Operator, der eine Funktion aufruft, jedoch nur, wenn sie existiert. JavaScript hat keine aufgerufene Funktion What, daher wird die Funktion nicht aufgerufen und ihre Argumente werden einfach ignoriert. Die anderen Wörter im Code sind Funktionsaufrufe, die eigentlich nicht aufgerufen werden, weil die WhatFunktion nicht vorhanden ist. Am Ende ?steht der Existenzoperator, da er in der Aufruffunktion nicht verwendet wird. Andere Satzende wie .oder !würden nicht funktionieren, wie dies .für Methoden !der Fall ist, und sind kein Operator (der nicht nach einem Bezeichner verwendet werden kann). Um zu lesen, wie CoffeeScript dies in JavaScript konvertiert hat, besuchen Sie http://coffeescript.org/#try:What%3F%20No%20error%3F%20Yep%2C%20this%20code%20does%20not%20have%20any%20bugs%2C % 20Warum% 20ist% 20würde% 3F .

Konrad Borowski
quelle
36

VBScript

Der &Operator in VBScript ist die Verkettung von Zeichenfolgen, aber was in aller Welt sind die Operatoren &&und &&&? (Denken Sie daran, dass der Operator "und" in VBScript Andnicht ist &&.)

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

Dieses Programmfragment ist legal VBScript. Warum? Und was ist der Wert von x?

Der Lexer zerlegt dies als x = 10 & 987 & &654& & &321. Ein ganzzahliges Literal, das mit beginnt, &ist seltsamerweise ein oktales Literal. Ein oktales Literal, das mit endet, &ist noch seltsamerweise eine lange ganze Zahl. So wird der Wert von x ist die Verkettung der Dezimalwerte dieser vier Zahlen: 10987428209.

Eric Lippert
quelle
8
Das ist nur ... wow.
Primo
27

Ziel c

Keine große Sache, aber es hat mich überrascht, als ich versuchte, einen Link in einen Kommentar einzufügen:

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

http ist hier ein Code-Label, solche Labels werden in goto-Anweisungen verwendet

Piotr
quelle
8
Dies sollte in jeder C-ähnlichen Sprache funktionieren, die //Kommentare unterstützt .
Ilmari Karonen
Ja, wahrscheinlich war ich mir beim Posten nicht sicher
Piotr
14
Beschränken Sie jedoch eine URL pro Protokoll und Bereich.
Ben Voigt
1
Sie können https: // weiterhin im selben Bereich verwenden.
Florian F
25

C #

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

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

Da die BarMethode a ausführt yield, wird sie beim Aufruf nicht ausgeführt. Sie gibt einen Enumerator zurück, der die Methode bei ihrer Iteration ausführt.

McKay
quelle
Endlich ... Hier sind FOO und BAR :)
VVK
1
Dafür sind foo und bar da;) Namen von Dingen, die eigentlich keine Rolle spielen.
McKay
22

C

main=195;

Funktioniert auf x86-Plattformen, wobei 195 der Operationscode für ret ist. Tut nichts,

ugoren
quelle
Der Opcode für ret ist 195, nicht 193, oder?
Dennis
Funktioniert bei mir nicht. Ich würde davon ausgehen, dass der Code unter der Adresse 195 ausgeführt wird.
nwellnhof
Tbanks @Dennis, der Code war korrekt, die Erklärung falsch.
Ugoren
3
Auf jeder Plattform (einschließlich modernem x86), auf der Seiten lesbar sind, ohne dass sie auch ausführbar sind, stürzt dies beim Zugriff auf ab, mainweil mainsie in das Datensegment gestellt wurden, das nicht ausführbar ist. Amüsanterweise stürzt const int main=195es nicht ab (auf x86) (sondern erzeugt einen Garbage-Exit-Status), da es .rodatastandardmäßig im selben Segment abgelegt ist wie .textund daher ausführbar ist. ( const char main[]="1\300\303";wird erfolgreich beendet! (noch auf x86))
zwol
2
Ich bin auf einer 64-Bit-Maschine (ich weiß nicht, ob dies irgendetwas ändern wird) und main = 195 gibt einen Segfault, aber const int main = 195; funktioniert.
w4etwetewtwet
21

Java

Wahrscheinlich zu offensichtlich.

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");
    }
}

Was?

Wirft einen Syntaxfehler nach \u000d. \u000dist der Unicode für eine neue Zeile. Obwohl es auskommentiert ist, behandelt der Java-Compiler das, was danach steht, als Code, da es nicht mehr auskommentiert ist.

Tom Verelst
quelle
11
Sie varargssind nicht varargs;)
Navin
Die Frage lautete "Code, der so aussieht, als ob er fehlschlage, aber nicht", nicht "Code, der so aussieht, als ob er fehlschlage, aber auf andere Weise". Ein Syntaxfehler anstelle einer Ausnahme ist immer noch ein Fehler.
Nzall
19
Ich denke, Sie sollten die ursprüngliche Frage noch einmal lesen: "oder erzeugt einen anderen Fehler, der nichts damit zu tun hat."
Tom Verelst
Tatsächlich würde ohne die \u000deine Referenz auf den undefinierten Wert verwendet 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';
}

Warum?

NULList eine Intergal-Konstante, daher passt sie intbesser zur Überladung als die int*eine. Dennoch haben die meisten Programmierer NULLZeiger zugeordnet, so dass eine Nullzeiger-Dereferenzierung erwartet werden kann.

Angew
quelle
11
Zum Glück können Implementierungen in C ++ 11 NULLals definiert werden nullptr, und Implementierungen, die dies tun (noch keine, die ich kenne, aber ich erwarte sie), führen zu dem erwarteten Segmentierungsfehler.
HDV
16

Python

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

Perfekt gültig, aber die Ausgabe ist schwer zu erraten. Die ersten 3 "-Zeichen beginnen eine mehrzeilige Zeichenfolge und die nächsten beiden sind Teil der Zeichenfolge. Am Ende beenden die ersten drei die Zeichenfolge und die letzten beiden sind ein leeres Zeichenfolgenliteral, das vom Parser mit der mehrzeiligen Zeichenfolge verknüpft wird .

Fraxtil
quelle
20
Nur ein 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...";
}

Wie es funktioniert:

Es gibt eine positive und negative Unendlichkeit in JS und keinen Fehler beim Teilen durch Null.

temporärer_benutzername
quelle
2
Du solltest auch ein paar Tricks mit NaN machen können ...
intx13
8
meh, das passiert in jeder sprache mit floats.
Navin
3
@Navin: In jeder Sprache mit Gleitkommazahlen, bei denen die Division durch Null keinen Fehler verursacht.
9.
2
@nwk Der IEEE-Standard für Floats besagt, dass die Division durch Null eine inf sein muss. Ich kenne keine Sprachen, die das ändern.
Navin
1
IEEE 754 spezifiziert zwei Modelle: Signalisierung von NaN / Inf (die Ausnahmen bei der FP- Nulldivision auslösen , Quadratwurzel von -1, Unterlauf / Überlauf usw.) und Nicht-Signalisierung (die reguläre argebraische Werte mit genau definierter Mathematik behandelt NaN/ Infgenau wie diese auf sie). Moderne FP-Hardware kann für den Betrieb in beide Richtungen konfiguriert werden. Sprachunabhängig; schade nicht zu wissen.
ulidtko
14

C ++

Das Mischen von Trigraphen und raumlosen Lambdas kann ziemlich verwirrend sein und auf jeden Fall für Leute, die sich der Trigraphen nicht bewusst sind, falsch aussehen:

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

Wie es funktioniert:

Einige Sequenzen, die aus 3 Symbolen bestehen und mit ?? beginnen, werden als Trigraphs bezeichnet und durch einen vollständig kompatiblen Präprozessor ersetzt. Vorverarbeitet sieht die betreffende Zeile folgendermaßen aus: return ~ [] () {return "\ x00FF"; } () [0]; Wie man sehen kann, ist dies nichts anderes als eine überflüssige Lambda-Funktion, die einen String zurückgibt, der aus dem Zeichen 0xFFth besteht. Die [0] extrahiert nur dieses Zeichen und ~ NOTs es, so dass 0 zurückgegeben wird.

aVoX
quelle
12
Das gültige C ++ - Programm int main(){(([](){})());}könnte auch gut aussehen, wenn es mit einem Dreifachdruck versehen wird ...
Angew
1
Was macht der überhaupt?
Joe Z.
1
@ Joe Z [](){}ist eine Lambda-Funktion, genau wie [](int a){return a+1;}eine. ([](){})()ruft diese Funktion auf und kehrt zurück, voidwenn ich mich nicht irre. Das Ganze läuft (([](){})());dann darauf hinaus (void);, was eine Aussage ist, die nichts bewirkt. maindann wird einfach null zurückgegeben, wie es ohne returnAnweisung sein sollte.
Tomsmeding
13

VBA / VB6

Private Sub DivByZero()

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

    Debug.Print 1 / UBound(x)

End Sub

Das Aufteilen einer leeren, durch Kommas getrennten Zeichenfolge sollte ein leeres Array ergeben. Sollte eine offensichtliche Division durch Null Fehler sein, oder?

Nee. Überraschenderweise gibt Ihnen die Laufzeit ein Array mit einer unteren Grenze von 0 und einer oberen Grenze von -1, wenn eine Zeichenfolge mit der Länge Null geteilt wird. Der obige Code gibt -1 aus.

Komintern
quelle
@minitech Wenn Sie ein leeres Array an UBound übergeben, erhalten Sie einen Indexfehler außerhalb des gültigen Bereichs.
Comintern
… Gut. Ich nehme das zurück. VBA = /
Ry-
1
@minitech Yep. Ich verstehe, dass dies ein Fehler in der ursprünglichen Implementierung von Split in VB6 war. In .NET haben sie absichtlich das Verhalten für leere Arrays, die ein UBound von -1 zurückgeben, "hinzugefügt" (oder vielleicht ist dies das bessere Wort), um die Abwärtskompatibilität mit dem gesamten VB6-Code zu gewährleisten, der diesen Hack ausgenutzt hat. Das Teilen einer Nullzeichenfolge ist die einzige Möglichkeit, dieses Array in VBA / VB6 ohne Windows-API-Aufrufe nativ abzurufen.
Komintern
12

Javascript

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

Gibt: 5

Wohingegen:

5.toString();

Gibt SyntaxError zurück

Wie es funktioniert:

JavaScript versucht, Punkte auf einer Zahl als Gleitkomma-Literal zu analysieren

Sumeet Kashyap
quelle
13
Wie kam es, dass Sie genau den gleichen Fall gepostet haben wie eine Stunde nach mir?
VisioN
1
Hey Vision, sorry, aber ich habe deine Antwort nicht überprüft. Ich habe auch einen Fall mit Leerzeichen hinzugefügt. Ich habe dies mal auf Javascript Garden nichts anderes gelesen.
Sumeet Kashyap
1
Sumeet, sei nicht traurig. Ihre Antwort ist schöner - und viel klarer - als die Antwort von @VisioN.
Nicolas Barbulesco
12

HTML

Erster Beitrag hier, ich bin nicht sicher, ob ich das bekomme oder nicht, aber hier geht es.

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

Es ist eine .htmlDatei ...

Albzi
quelle
9
Der Trick ist also, dass der PHP-Block nicht ausgeführt wird, weil die Datei die .htmlErweiterung hat und Ihr Webserver nicht so konfiguriert ist, dass er .htmlDateien als PHP analysiert .
VisioN
5
Ja. Betrügt das? @VisioN
Albzi
2
Ich bin mir ziemlich sicher, dass das schummelt. Schreiben Sie mindestens "HTML" in Fettdruck oben.
Navin
Nett ! :-) Der Trick hat bei mir funktioniert.
Nicolas Barbulesco
1
Ich habe bearbeitet, um zu verdeutlichen, in welcher Sprache dies geschrieben ist
vijrox
9

PHP (40 Bytes)

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

Dies war die Antwort, die ich in dieser Frage gab: Insanity Check Program

Die Idee war, einen Code zu erstellen, der Fehler erzeugt.

Der erste Fehler, an den wir denken werden, ist ein Syntaxfehler.

Es gibt keine Syntaxfehler ...

Eine andere wäre, dass die Klasse / Funktion nicht existiert.

Es läuft nicht so weit ...

Andere wären ein Timeout oder ein Speicherüberlauf, aber auch hier reicht es nicht so weit ...

Testen Sie den Code hier: http://writecodeonline.com/php/ (entfernen Sie das <?am Anfang zu testende).

Ismael Miguel
quelle
3
Dies ist ein Beliebtheitswettbewerb. Sie müssen Ihren Code nicht verkrampfen, um Bytes zu sparen. Formatieren Sie es einfach neu, um die Lesbarkeit zu verbessern;)
Songo
Ich werde später eine lesbare Version hinzufügen. Ich habe dieselbe exakte Antwort verwendet und sie überhaupt nicht bearbeitet.
Ismael Miguel
foreach(e()as&$e);ist der Kern dieser Lösung. e()ist nur, um den Syntax-Checker am Laufen zu halten und &$edanach, aswas den Fehler verursacht.
TheConstructor
Eigentlich spielt alles eine wichtige Rolle.
Ismael Miguel
9

VBScript

Visual Basic 6-Benutzer werden das wissen

If Blah Then Foo Bar

ist legal, wie es ist

If Blah Then 
    Foo Bar
End If

Aber was ist mit

If Blah Then Foo Bar End If

? Es stellt sich heraus, dass dies in VBScript zulässig ist, in VB6 jedoch nicht. Warum?

Es ist ein Fehler im Parser. dies sollte abgelehnt werden. Der Code, der das erkennt, End Ifsollte auch prüfen, ob es sich um eine mehrzeilige IfAnweisung handelt. Als ich versuchte, das Problem zu beheben, und eine Beta-Version mit dem Update verschickte, entdeckte eine bestimmte einflussreiche Nachrichtenorganisation der Branche, dass sie diese Codezeile in einem ihrer VBScript-Programme hatte, und sagte, sie würden der neuen Version eine niedrige Bewertung geben, wenn wir sie nicht entfernen. Behebung des Fehlers, da sie ihren Quellcode nicht ändern wollten.

Eric Lippert
quelle
Hat es einen Nachteil, den Fehler nicht zu beheben, abgesehen davon, dass Sie VBS-Code schreiben können, der in VB6 nicht gültig ist?
Gabe
1
@Gabe: Nein, es gibt keinen Nachteil, außer dass es schwieriger ist, VBScript-Code nach VB zu portieren.
Eric Lippert
1
Ein Name ! Wer ist diese Nachrichtenorganisation?
Nicolas Barbulesco
9

C

Dies erinnerte mich an einen Fehler, auf den ich gestoßen war, als ich C lernte. Leider scheint die ursprüngliche Variante nicht mit einem aktuellen GCC zu funktionieren, aber dies tut es immer noch:

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

Dies schlägt offensichtlich fehl, weil wir einen Nullzeiger dereferenzieren, richtig?

Falsch - eigentlich ist es eine Endlosschleife, da unsere Schleifenbedingung um eins abweicht. Läuft aufgrund der Präfix-Dekrementierung ivon 1023 bis -1. Das heißt, die Zuordnung überschreibt nicht nur alle Elemente in arr, sondern auch den Speicherort direkt davor - also den iSpeicherort. Bei Erreichen -1, iüberschrieben sich mit 0und damit die Schleifenbedingung wieder erfüllt ...

Dies war die ursprüngliche Variante I, die ich nicht mehr reproduzieren kann:

Das Gleiche funktionierte i, wenn man von 0 aufwärts ging und um eins abbrach. Der neueste GCC speichert immer ivorher arrim Speicher. Dies muss in älteren Versionen anders gewesen sein (möglicherweise abhängig von der Reihenfolge der Deklaration). Es war ein tatsächlicher Fehler, den ich in einem meiner ersten Spielzeugprogramme mit Arrays verursachte.

Dies ist auch offensichtlich, wenn Sie wissen, wie Zeiger in C funktionieren, aber es kann überraschend sein, wenn Sie nicht:

Sie könnten denken, dass die Zuweisung zu (--i)[arr]einen Fehler auslöst, aber es ist gültig und äquivalent zu arr[--i]. Ein Ausdruck a[x]ist nur syntaktischer Zucker, für *(a + x)den der Zeiger auf das indizierte Element berechnet und dereferenziert wird. der zusatz ist natürlich kommutativ und damit äquivalent zu *(x + a).

l4mpi
quelle
1
Soweit ich sehen kann, sollte der Schleifenkörper niemals ausgeführt werden (da 1234 <= 0 false ergibt). Wollten Sie vielleicht "> =" schreiben?
Celtschk
1
@celtschk ja, das war ein Tippfehler. Danke fürs bemerken!
14.
Ist diese Speicherausrichtung tatsächlich festgelegt oder in einigen Compilern nur so implementiert?
Paŭlo Ebermann,
9

Java

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...");
    }
}

Warum funktioniert das?

Unitialisierte Felder haben Standardwerte. In diesem Fall ist d nur 0 . 0/0 = NaN in doppelter Division, und NaN ist niemals gleich sich selbst, daher gibt if false zurück. Beachten Sie, dass dies nicht funktionieren würde, wenn Sie 0/0 == 0/0 hätten, da at eine Ganzzahl von 0/0 wäre hätten eine ArithmeticException ausgelöst würde .

durron597
quelle
8

C ++ 11

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

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

Kompiliert und läuft ohne Warnung mit g++ -pedantic-errors -std=c++11 .

complist eine Standardalternative für ~, genau wie noteine Alternative für !. complwird hier verwendet, um zuerst operator~einen Destruktor zu überschreiben und dann zu definieren. Ein weiterer Trick ist, dass operator compes sich um eine Konvertierungsfunktion vom Typ compzu sich selbst handelt. Überraschenderweise verbietet der Standard eine solche Konvertierungsfunktion nicht - aber es heißt, dass eine solche Funktion niemals verwendet wird.

han
quelle
8

VBScript

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

'Output: :)

Was es macht:

Funktions-, Unter- und Variablennamen in VBScript können beliebig sein, wenn Sie eckige Klammern verwenden. In diesem Skript werden eine Funktion :(und ein Argument aufgerufen. "):"Da sie jedoch nicht der normalen Namenskonvention entsprechen, sind sie in eckige Klammern eingeschlossen. Der Rückgabewert wird auf den Parameterwert gesetzt. Ein zusätzlicher Doppelpunkt wird verwendet, um alles in einer Zeile abzurufen. Die Msgbox-Anweisung erhält einen Verweis auf die Funktion (benötigt jedoch keine eckigen Klammern) und ruft sie mit einem Smiley :)als Parameter auf.

AutomatedChaos
quelle
1
So viele stirnrunzelnde Gesichter :(
Joe Z.
8

C #

Eigentlich habe ich mich dabei ertappt, wie ich das versehentlich getan habe :)

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

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

werfen , nicht zurückkehren .

Spuk
quelle
Haha, willkommen auf der Seite! Ein dickes Lob für die Tapferkeit dieses ersten Beitrags. :)
Jonathan Van Matre
7

Java

enum derp
{

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

Und so funktioniert das:

Sie glauben, die Aufzählung sei nicht gültig, aber sie ist gültig. dann denkst du, es wird ein Standard-Point-Objekte-Attribute drucken, aber Gotcha! Aufgrund der Serialisierung von Snakeyaml wird ein reibungsloser StackOverFLow-Fehler angezeigt

Und noch einer:

enum derp
{

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

    static
    {
        System.exit(x);
    }
}

Sie denken, ein Stackoverflow wird aufgrund der offensichtlichen Rekursion auftreten, aber das Programm missbraucht die Tatsache, dass beim Ausführen der static{} blockzuerst ausgeführt wird und dass er beendet wird, bevor main () geladen wird

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;
}

Dieser /*Error*/basiert auf dem auskommentierten Code als Endpunkt für den Kommentar, der vor dem ab = 0 geöffnet wurde. Das EXPLAIN über die Ganzzahl ab bis 0x000d verbirgt die neue Zeile, um das Auskommentieren der nächsten Zeile zu aktivieren

masterX244
quelle
1
Ich kann im Moment nicht, aber es wäre schön, wenn Sie dies, wenn möglich, neu formatieren würden. Es ist ein bisschen schwer zu lesen, wie es ist ...: P
Jwosty
machte sie offensichtlicher; und Spoiler-Tags sind vorgesehen, da die Tricks auf den ersten Blick nicht offensichtlich sind
masterX244
2
Warten Sie, damit der erste tatsächlich einen Fehler erzeugt? Das ist das Gegenteil von dem, was die Frage stellt. Und warum nicht gleich System.exit (1) in der Sekunde?
Riking
3
Kein Java-Programmierer würde einen Stapelüberlauf im zweiten Snippet erwarten. Entschuldigung, das ist bei weitem zu offensichtlich.
Tobias
1
@ VVK Codegolf Gewohnheit zu verwenden, enum{anstatt class{ein Byte zu speichern, dann
masterX244
6

C

Strings und Arrays in c können ziemlich verwirrend sein

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
quelle
9
Es ist schwer zu lesen, aber ich weiß nicht, welche Art von Fehler die Leute davon erwarten
Bryan Chen
3
Ich wollte die Leute nur an eine gültige, aber unkonventionelle Schreibweise erinnern - machen Sie daraus, was Sie wollen. Ich würde mit Sicherheit dreimal hinschauen, bevor ich sage, dass dies gültig ist. Erstens sind Ausdrücke wie 5 [string] einem zufälligen Codierer nicht gut bekannt und widersprechen der Logik der Array-Indizierung. Zweitens sieht '' + string wie das Hinzufügen von 2 Strings aus, jedoch mit falschen Anführungszeichen. Und drittens sieht & i ++ wie die Adresse einer ganzen Zahl aus (aber die Rangfolge übernimmt dies). Schließlich schreiben wir über das String-Literal hinaus (aber nicht über den größeren Hintergrundpuffer hinaus).
Orion
Scheint nicht so schlimm. Ich habe nur ein bisschen in C ++ programmiert, aber ich kann das herausfinden.
Navin