Quelle? Pas d'erreur? [fermé]

196

Votre tâche est simple. Ecrivez un programme qui devrait évidemment générer une erreur au premier abord, soit lors de la compilation ou de l'exécution, mais ne génère pas ou produit une autre erreur non liée. Ceci est un concours de popularité, alors soyez créatif.

Jwosty
la source
11
hmmmm .... celui-ci est un casse-tête. +1
Tim Seguine
1
J'aimerais pouvoir le trouver ... il y avait un vieil exemple PL / I qui incluait une déclaration du type "si si si = alors alors = sinon sinon = si alors sinon ..." (PL / I autorisé à utiliser ses mots-clés en tant que noms de variables et avaient une expression conditionnelle similaire à celle de C?: qui utilisait aussi les mots-clés if / then / else ...)
keshlam
8
Je suggère l'intégralité du langage brainfuck, car le code BF ne semble pas compiler.
Agi Hammerthief
@NigelNquande uniquement si vous n'êtes pas au courant ...;)
Jwosty

Réponses:

280

C ++

Assurez-vous de compiler le code suivant en mode conforme standard (par exemple, pour g ++, utilisez le drapeau -ansi):

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

Comment ça fonctionne:

?? / est une séquence de trigraphe traduite en barre oblique inverse qui échappe à la nouvelle ligne suivante, de sorte que la ligne suivante fait toujours partie du commentaire et ne génère donc pas d'erreur de syntaxe. Notez qu'en C ++, omettre le retour dans mainest bien défini et équivaut à renvoyer 0, indiquant une exécution réussie.

celtschk
la source
7
Je me sens comme la première réponse que je viens de faire, insta-won, dès le départ.
temporary_user_name
1
C'est aussi valable en C99.
R ..
1
il y a des avertissements avec
-Wall
2
@ BЈовић Wall lance toujours un avertissement à propos de tout
Kiwy
4
@Kiwy Il lance un avertissement uniquement pour le code de la poubelle comme ci-dessus. Le -Wall ne lance pas des avertissements pour tout.
Février
86

Rubis

Toujours fan de celui-ci.

x = x

Non NameError. x est maintenant nil.

Ceci est juste une "fonctionnalité" de Ruby :-)

En voici un plus banal qui m’a déjà eu:

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 

Imprime "rien à voir ici."

C'est elsif , pas elseif . (et ce n'est certainement pas elif - malheur au programmeur python capricieux (moi)!) Donc, pour l'interpréteur elseif ressemble à un appel de méthode normal, et puisque nous n'entrons pas dans le bloc x <0, nous passons directement à else et ne pas lever une exception. Ce bogue est incroyablement évident dans tout environnement de mise en évidence de la syntaxe. Heureusement (?), Le code de golf n’est pas un tel environnement.

roippi
la source
5
Tu m'as eu. J'ai déjà travaillé à la fois en Python et en Lua, et je commence maintenant avec Ruby. Lua utilise celui-là.
Riking
7
La signification de l'univers n'est rien à voir?
user80551
1
destroyallsoftware.com/talks/wat
Jakob Weisblat le
77

C?

Code assez normal ici ...

void main() = main--;

C'est Haskell, pas C. Cela définit une fonction nommée "void" qui prend deux arguments. Le premier est nommé "principal" et si le second (non-nommé) est un tuple vide, il renvoie la variable "principale". "-" commence un commentaire en Haskell, ainsi le ";" est commenté.

intx13
la source
21
Donc en d'autres termes, c'est de la triche?
M. Lister
75
Tricher est normal dans les compétitions code-challenge. Nous appelons cela la créativité. : P
Joe Z.
31
J'appellerais celui-ci tricher, pas de créativité. Vous devez définir l'environnement dans lequel vous vous trouvez avant de pouvoir même déterminer si certains codes seront erronés ou non. Sinon, je pourrais simplement vous donner le bruit de ligne malbolge et vous demander s'il compile.
Tim S.
5
C'est juste censé vous faire arrêter une seconde et aller 'hé pouvez-vous faire ça?' :)
intx13
10
@ JoeZ. Cela peut ressembler à perl dans certains cas.
user80551
72

JavaScript

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

Voilà comment cela fonctionne:

Le premier aest en fait un а(c'est-à-dire, Cryllic Unicode "a").

Poignée de porte
la source
8
Cette astuce peut être appliquée à toutes les langues acceptant les jetons Unicode (par exemple, Java, C #).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
83
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳, exemplifié par votre nom d'utilisateur
TheDoctor
9
solution trop évidente
thepirat000
6
trop évident pour quiconque l'a déjà rencontré auparavant. Je suis sûr que beaucoup de débutants et de soi-disant "experts du Web" risquent de s'y prendre.
Thebluefish
42
Évident? Vous regardez donc toujours les noms de vos variables à travers leurs numéros Unicode plutôt que par leur apparence? Vous le remarquerez peut-être si vous recherchez "un" (ou "un"?) Sans parvenir à trouver ce que vous attendez, mais lorsque vous lisez simplement, vous ne pouvez pas le voir (du moins dans la police indiquée ici).
Tim S.
70

JavaScript

Lorsque je fournissais le code suivant, on me disait souvent: "Ce doit être une faute de frappe! Comment cela peut-il fonctionner?" .

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

La description ci-dessous a été copiée exactement de l' un des cas récents .

Comme vous le savez probablement, en JavaScript, tout sauf les littéraux est un objet. Les chiffres sont aussi des objets. Donc théoriquement (et pratiquement), vous pouvez obtenir des propriétés ou des méthodes d’appel de tous les types non littéraux via la notation par points, comme vous le faites 'string'.lengthou [1,2,3].pop(). En cas de nombre, vous pouvez faire la même chose, mais gardez à l'esprit qu'après un seul point, l'analyseur cherchera une fraction du nombre en attente d'une valeur flottante (comme dans 123.45). Si vous utilisez un nombre entier , vous devez « dire » l'analyseur qu'une partie décimale est vide, la fixation d' un point supplémentaire avant d' aborder une propriété: 123..method().

Vision
la source
18
En tant que lua mec, je m'attendais à422
mniip
3
Je n'ai pas vu cette utilisation avant, très soignée.
Nit
5
Je me sens mal d'être parfaitement habitué à la ..notation, mais je suis tout à fait désemparé en ce qui concerne la .toString(a freaking argument here?)notation: P Eh bien, je l'ai déjà compris :)
David Mulder
Qu'est-ce que cette sortie? Et pourquoi ? Je suis curieux.
Nicolas Barbulesco
3
Pour les paresseux, l'argument spécifie la base (donc cela affichera 42 en binaire), ce qui n'est pas important du tout pour ce code. ..est la partie déroutante.
Kat
62

frapper

#!/bin/bash

[ 1 < 2 ] && exit

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

while [[ false ]]
    do :
done

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

Résultats

  • Vous pouvez vous attendre à ce que le script ne génère aucune erreur, car il se termine après la première commande. Ce n'est pas.

  • Vous pourriez vous attendre aux messages d'erreur typiques causés par une bombe fourche en cours en raison de la forboucle. Il n'y a pas de bombe à fourche.

  • Vous pouvez vous attendre à ce que bash se plaint de la maybecommande manquante ou de l’ensemble des erreurs de syntaxe à l’intérieur du ifbloc. Ça ne va pas.

  • Le seul message d'erreur que le script peut générer se termine par 2: No such file or directory.

Explication

  • [n’est pas spécial pour bash, < 2effectue donc , comme d’habitude, une redirection. Sauf s'il existe un fichier avec un nom 2dans le répertoire en cours, cela provoquera une erreur.

  • En raison de l'erreur ci-dessus, la commande précédente &&aura un statut de sortie non nul et exitne sera pas exécutée.

  • La forboucle n'est pas infinie. En fait, il n'y a pas de boucle du tout. Puisque bash ne peut pas calculer le 64ème pouvoir de 2, le résultat de l'expression arithmétique est 0.

  • [[ false ]]teste si falseest une chaîne nulle. Ce n'est pas, donc cette whileboucle est infinie.

  • En raison de ce qui précède, l' ifinstruction n'est jamais exécutée. Aucune erreur n'est donc détectée.

Dennis
la source
55

Perl

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

Source et explication: https://stackoverflow.com/questions/11695110

foule
la source
137
Les programmes Perl ressemblent généralement à des erreurs.
Ugoren
1
@ugoren Seulement quand écrit et lu par ceux qui connaissent peu Perl.
TLP
8
Tu dois aimer que le commentaire de @ ugoren a deux fois plus de votes positifs que la réponse :)
yo
2
Cela me rappelle l’astuce du shell Windows: "Si vous êtes heureux et que vous le savez, erreur de syntaxe!"
Jwosty
47

Java

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

Aucune pile ne déborde ici; avancer.

À première vue, cela devrait produire un résultat StackOverflowError, mais ce n'est pas le cas! En fait, cela fonctionne pour toujours (à toutes fins pratiques du moins; techniquement, il prendrait fin après un temps de plusieurs ordres de grandeur plus long que l'âge de l'univers). Si vous voulez savoir comment / pourquoi cela fonctionne, voyez ceci . De plus, si vous vous demandez pourquoi nous pouvons appeler main()sans arguments alors que la méthode principale aurait généralement besoin d'un String[]argument: c'est parce que nous l'avons déclarée à argument variable, ce qui est parfaitement valide.

Arshajii
la source
3
Comme l'explique la question que vous avez liée, il ne fonctionne pas indéfiniment, mais pendant très longtemps.
Kevin
1
@ Kevin Ne devenons pas inutilement pédants ici; "plus long que l'âge de l'univers" est, à toutes fins pratiques, "pour toujours".
arshajii
8
Vous dites "Pas de débordement de pile ici", alors qu'en fait, le système continue de jeter les débordements de pile en permanence, et lève éventuellement une exception de débordement de pile. (comme vous le mentionnez, cela pourrait éventuellement prendre très longtemps) Et cela dépend de la profondeur de la pile. Sur une machine virtuelle plus petite ou sur un système intégré, la profondeur de la pile peut être beaucoup plus petite.
McKay
@ McKay Cette déclaration est clairement une simple ligne à jeter, non destinée à être prise à la lettre. Le PO demande un programme qui semble produire une erreur, mais ne le fait pas. Dans le cas général, la réponse ci-dessus répond à cette exigence. Bien sûr, nous pouvons concocter une situation obscure où ce n’est pas le cas, mais cela n’annule pas la réponse. J'espère que vous allez reconsidérer votre vote négatif.
Arshajii
3
@McKay Par ailleurs, supposons que la taille de la pile soit petite (par exemple 100 par opposition à la normale ~ 10 000) et que nous pouvons toujours passer 10 000 000 appels par seconde. Ensuite, le temps total d'exécution s'élève à 4 019 693 684 133 ans, soit encore plusieurs ordres de grandeur plus grands que l'âge de l'univers.
Arshajii
42

CoffeeScript

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

?suivi d'un espace est un opérateur qui appelle une fonction, mais seulement s'il existe. JavaScript n'a pas de fonction appelée What. Par conséquent, la fonction n'est pas appelée et ses arguments sont simplement ignorés. Les autres mots du code sont des appels de fonction qui ne sont pas appelés, car la Whatfonction n'existe pas. A la fin, ?est l'opérateur existence, car il n'est pas utilisé dans la fonction call. Les autres terminateurs de phrase, tels que .ou !ne fonctionneraient pas, comme .pour les méthodes, et !ne sont pas des opérateurs (qui ne peuvent pas être utilisés après un identifiant). Pour savoir comment CoffeeScript a converti cela en JavaScript, visitez le site http://coffeescript.org/#try:What%3F%20No%20error%3F%20Yep%2C%20this%20code%20does%20not%20have%20any2020ugugs%2C. % 20why% 20it% 20would% 3F .

Konrad Borowski
la source
36

VBScript

L' &opérateur dans VBScript est la concaténation de chaînes, mais quels sont les opérateurs &&et &&&? (Rappelez-vous que l'opérateur "et" de VBScript n'est Andpas &&.)

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

Ce fragment de programme est légal VBScript. Pourquoi? Et quelle est la valeur de x?

Le lexer décompose ceci en tant que x = 10 & 987 & &654& & &321. Un littéral entier qui commence par &est, curieusement, un littéral octal. Un littéral octal qui se termine par &est, encore plus bizarrement, un entier long. Ainsi , la valeur de x est la concaténation des valeurs décimales de ces quatre entiers: 10987428209.

Eric Lippert
la source
8
C'est juste ... wow.
Primo
27

Objectif c

Ce n'est pas grave, mais cela m'a surpris en essayant de mettre un lien dans un commentaire:

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

http est une étiquette de code ici, ces étiquettes sont utilisées dans les instructions goto

Piotr
la source
8
Cela devrait fonctionner dans n'importe quel langage de type C prenant en charge les //commentaires.
Ilmari Karonen
Ouais, probablement, je n'étais juste pas sûr en postant
Piotr
14
Limitez toutefois une URL par protocole et par portée.
Ben Voigt
1
Vous pouvez toujours utiliser https: // dans la même portée.
Florian F
25

C #

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

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

Comme la Barméthode effectue a yield, la méthode ne s'exécute pas réellement lorsqu'elle est appelée, elle renvoie un énumérateur qui, lorsqu'il est itéré, exécute la méthode.

McKay
la source
Enfin ... Voici le FOO et le BAR :)
vendredi
1
C’est à cela que servent foo et bar;) les noms de choses qui ne comptent pas vraiment.
McKay
22

C

main=195;

Fonctionne sur les plates-formes x86, où 195 est l'opcode pour ret. Ne fait rien,

Ugoren
la source
L'opcode Ret est 195, pas 193, n'est-ce pas?
Dennis
Ca ne marche pas pour moi Je m'attendrais à ce que cela exécute le code à l'adresse 195.
nwellnhof
Tbanks @ Dennis, le code était correct, l'explication erronée.
Ugoren
3
Sur toutes les plates-formes (y compris les x86 modernes ) où les pages peuvent être lisibles sans être également exécutables, cela se bloquera lors de la saisie maincar il maina été placé dans le segment de données, qui n'est pas exécutable. Plaisamment, const int main=195ne pas tomber en panne (x86) (mais produira un état de sortie des ordures) , car .rodatapar défaut est mis dans le même segment que .textet est donc exécutable. ( const char main[]="1\300\303";va sortir avec succès! (toujours sur x86))
zwol
2
Je suis sur une machine 64 bits (je ne sais pas si cela changera quoi que ce soit) et main = 195 donne un segfault, mais const int main = 195; travaux.
w4etwetewtwet
21

Java

Probablement trop évident.

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

Quelle?

Lance une erreur de syntaxe après \u000d. \u000dest l'unicode pour une nouvelle ligne. Même s'il est commenté, le compilateur Java traite ce qui se trouve après comme un code puisqu'il n'est plus commenté.

Tom Verelst
la source
11
vous varargsn'êtes pas varargs;)
Navin
La question était "le code qui semble échouer mais ne le fait pas", pas "le code qui semble échouer, mais le fait différemment". Avoir une erreur de syntaxe au lieu d'une exception est toujours une erreur.
Nzall
19
Je pense que vous devriez relire la question initiale: "ou produit une autre erreur sans rapport."
Tom Verelst
En réalité, sans le \u000d, il utiliserait une référence à la valeur indéfinie 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';
}

Pourquoi?

NULLest une constante intergale, elle correspond donc à la intsurcharge strictement meilleure que celle- int*ci. Néanmoins, la plupart des programmeurs ont NULLassocié des pointeurs, donc on peut s'attendre à une déréférencement de pointeur nul.

Angew
la source
11
Heureusement, C ++ 11 permet aux implémentations de définir en NULLtant que nullptr, et les implémentations qui le font (aucune à ma connaissance, mais je les attends) donneront l'erreur de segmentation attendue.
hvd
16

Python

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

Parfaitement valide, mais le résultat est difficile à deviner. Les trois premiers caractères "commencent une chaîne multiligne et les deux suivants font partie de la chaîne. À la fin, les trois premiers" s terminent la chaîne et les deux derniers sont un littéral chaîne vide qui est concaténé par l'analyseur à la chaîne multiligne .

Fraxtil
la source
20
Juste un 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...";
}

Comment ça fonctionne:

Il existe une infinité positive et négative dans JS, et aucune erreur de division par zéro.

nom_utilisateur_temporel
la source
2
Tu devrais aussi être capable de faire quelques tours avec NaN ...
Intx13 Le 07
8
meh, cela se produit dans n'importe quelle langue avec des flotteurs.
Navin
3
@Navin: dans toutes les langues avec des flottants où la division par zéro ne provoque pas d'erreur.
nwk
2
@nwk La norme IEEE pour les flotteurs dit que la division par zéro doit être une inf. Je ne connais aucune langue qui change cela.
Navin
1
La norme IEEE 754 spécifie deux modèles: la signalisation NaN / Inf (qui soulève des exceptions sur la division zéro FP, la racine carrée à partir de -1, le dépassement de capacité / débordement, etc.) et la non-signalisation (qui traite NaN/ Infcomme des valeurs argébriques normales avec des calculs bien définis sur eux). Le matériel FP moderne peut être configuré pour fonctionner dans les deux sens. Langue-agnostique; dommage de ne pas savoir.
ulidtko
14

C ++

Mélanger des trigraphes et des lambdas sans espace peut être assez déroutant et donner l’impression erronée à ceux qui ne sont pas au courant des trigraphes:

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

Comment ça fonctionne:

Certaines séquences composées de 3 symboles, commençant par ??, sont appelées trigrammes et seront remplacées par un préprocesseur entièrement conforme. Prétraité, la ligne en question a l'aspect suivant: return ~ [] () {return "\ x00FF"; } () [0]; Comme on peut le constater, il ne s’agit que d’une fonction lambda superflue renvoyant une chaîne constituée du caractère 0xFFth. Le [0] extrait simplement ce caractère et ~ NON, alors 0 est renvoyé.

aVoX
la source
12
Le programme C ++ valide int main(){(([](){})());}pourrait également avoir l’air sympa quand il est déclenché ...
Angew
1
Que fait-on même?
Joe Z.
1
@ Joe Z [](){}est une fonction lambda, tout comme [](int a){return a+1;}une. ([](){})()appelle cette fonction, revenant voidsi je ne me trompe pas. Le tout (([](){})());se résume ensuite à (void);une affirmation qui ne fait rien. mainpuis retourne simplement zéro, comme il se doit, sans returndéclaration.
tomsmeding
13

VBA / VB6

Private Sub DivByZero()

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

    Debug.Print 1 / UBound(x)

End Sub

Fractionner une chaîne vide délimitée par des virgules devrait donner un tableau vide. Devrait être une division évidente par zéro erreur, non?

Nan. Étonnamment, quand une chaîne de longueur zéro est fractionnée, le temps d'exécution vous donne un tableau avec une limite inférieure de 0 et une limite supérieure de -1. Le code ci-dessus affichera -1.

Komintern
la source
@ minitech En fait, si vous passez un tableau vide à UBound, vous obtiendrez une erreur Indice en dehors des limites.
Komintern
… bien. Je reprends ça. VBA = /
Ry-
1
@minitech Oui. Je comprends que c’était un bogue dans l’implémentation originale de Split dans VB6. Dans .NET, ils ont intentionnellement "ajouté" (ou peut-être documenté est le mot le plus approprié) le comportement des tableaux vides renvoyant un UBound de -1 afin de maintenir la compatibilité avec tout le code VB6 qui exploitait ce hack. Fractionner une chaîne nulle est le seul moyen d'obtenir nativement ce tableau dans VBA / VB6 sans appels API Windows.
Komintern
12

Javascript

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

Donne: 5

Tandis que:

5.toString();

Donne SyntaxError

Comment ça fonctionne:

JavaScript tente d'analyser les points d'un nombre en tant que littéral à virgule flottante

Sumeet Kashyap
la source
13
Comment se fait-il que vous ayez posté exactement le même cas que moi une heure après moi?
VisioN
1
Hey Vision, désolé mais je n'ai pas vérifié ta réponse. J'ai aussi ajouté un cas avec de l'espace. J'ai lu ceci une fois sur javascript garden rien d'autre.
Sumeet Kashyap
1
Sumeet, ne sois pas désolé. Votre réponse est plus agréable - et bien plus claire - que celle de @VisioN.
Nicolas Barbulesco
12

HTML

Premier message ici, je ne suis pas sûr de comprendre cela ou non, mais voilà.

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

C'est un .htmlfichier ...

Albzi
la source
9
Donc, le truc, c'est juste qu'il n'exécutera pas le bloc PHP car le fichier a une .htmlextension et que votre serveur Web n'est pas configuré pour analyser des .htmlfichiers en tant que PHP?
VisioN
5
Oui. Est-ce tricher? @VisioN
Albzi
2
Je suis sûr que c'est de la triche. Au moins, écrivez "HTML" en gras en haut.
Navin
Agréable ! :-) Le truc a fonctionné sur moi.
Nicolas Barbulesco
1
J'ai édité pour préciser la langue dans laquelle il est écrit
vijrox
9

PHP (40 octets)

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

Voici la réponse que j'ai donnée dans cette question: Programme de contrôle de la folie

L'idée était de créer un code source d'erreurs.

La 1ère erreur à laquelle nous allons penser est une erreur de syntaxe.

Il n'y a pas d'erreur de syntaxe ...

Autre serait que la classe / fonction n'existe pas.

Ça ne va pas si loin ...

Autre serait un temps mort ou un débordement de mémoire, mais encore une fois, cela n'atteint pas ce stade ...

Testez le code ici: http://writecodeonline.com/php/ (supprimez <?le au début pour tester).

Ismael Miguel
la source
3
C'est un concours de popularité. Inutile de forcer votre code pour économiser des octets. Il suffit de le reformater pour une meilleure lisibilité;)
Songo
Je vais ajouter une version lisible plus tard. J'ai utilisé la même réponse exacte et je ne l'ai pas modifiée du tout.
Ismael Miguel
foreach(e()as&$e);est le cœur de cette solution. e()est juste de garder le vérificateur de syntaxe en cours et &$eaprès asest la cause de l'échec.
TheConstructor
En fait, tout joue un rôle important.
Ismael Miguel
9

VBScript

Les utilisateurs de Visual Basic 6 sauront que

If Blah Then Foo Bar

est légal, comme c'est

If Blah Then 
    Foo Bar
End If

Mais qu'en est-il

If Blah Then Foo Bar End If

? Il s'avère que c'est légal dans VBScript mais pas dans VB6. Pourquoi?

C'est un bug dans l'analyseur; l'intention était de rejeter cela. Le code qui détecte le End Ifdevait également vérifier s'il s'agissait d'une Ifdéclaration multiligne , et ce n'est pas le cas. Lorsque j'ai essayé de résoudre ce problème et d'envoyer une version bêta avec ce correctif, une organisation de presse influente du secteur a découvert qu'elle avait cette ligne de code dans l'un de ses programmes VBScript et a dit qu'elle attribuerait une note basse à la nouvelle version, à moins que nous ne le fassions. corrigé le bogue, car ils ne voulaient pas changer leur code source.

Eric Lippert
la source
Y a-t-il un inconvénient à laisser le bogue sans solution, si ce n'est vous permettre d'écrire du code VBS qui n'est pas valide dans VB6?
Gabe
1
@ Gabe: Non, il n'y a pas d'inconvénient à ce qu'il soit plus difficile de porter du code VBScript vers VB.
Eric Lippert
1
Un nom ! Qui est cette organisation de nouvelles?
Nicolas Barbulesco
9

C

Cela m'a rappelé une erreur que j'ai rencontrée lorsque j'ai appris C. Malheureusement, la variante d'origine ne semble pas fonctionner avec un GCC actuel, mais celle-ci continue de fonctionner:

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

Ceci évidemment segfaults parce que nous déréférencons un pointeur nul, non?

Faux - en réalité, il s’agit d’une boucle infinie car notre condition de boucle est décochée. En raison du préfixe décrément, ipasse de 1023 à -1. Cela signifie que l'affectation écrase non seulement tous les éléments arr, mais également l'emplacement de la mémoire située juste avant, qui se trouve être l'emplacement où iest stocké. En atteignant -1, is’écrase 0et ainsi la condition de boucle est remplie à nouveau ...

C’était la variante originale I que je ne peux plus reproduire:

La même chose a fonctionné avec imonter à partir de 0 et être décalé d'un point. Le dernier GCC stocke toujours iavant arren mémoire; cela devait être différent dans les anciennes versions (peut-être en fonction de l'ordre de la déclaration). C'est une erreur réelle que j'ai produite dans l'un de mes premiers programmes de jouets traitant de tableaux.

En outre, ceci est évident si vous savez comment fonctionnent les indicateurs en C, mais peut être surprenant si vous ne le faites pas:

Vous pensez peut-être que l'affectation (--i)[arr]génère une erreur, mais elle est valide et équivalente arr[--i]. Une expression a[x]est simplement un sucre syntaxique pour *(a + x)lequel calcule et supprime le pointeur sur l'élément indexé; l'addition est bien sûr commutative et donc équivalente à *(x + a).

l4mpi
la source
1
Autant que je sache, le corps de la boucle ne doit jamais être exécuté (car 1234 <= 0 est égal à false). Vouliez-vous éventuellement écrire "> ="?
celtschk
1
@celtschk oui, c'était une faute de frappe. Merci d'avoir remarqué!
l4mpi
Cet alignement de la mémoire est-il réellement spécifié ou est-il simplement implémenté de cette manière dans certains compilateurs?
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...");
    }
}

Pourquoi ça marche:

Les champs unitialisés ont des valeurs par défaut. Dans ce cas, d est juste 0 . 0/0 = NaN en double division et NaN n'est jamais égal à lui-même, donc le si retourne faux. Notez que cela ne fonctionnerait pas si vous aviez 0/0 == 0/0 , car à 0% , une division entière VOUDRAIT lancer une exception arithmétique .

durron597
la source
8

C ++ 11

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

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

Compile et s'exécute sans aucun avertissement avec g++ -pedantic-errors -std=c++11.

complest une alternative standard pour l'orthographe ~, tout comme notune alternative pour !. complest utilisé ici pour d'abord remplacer operator~et ensuite définir un destructeur. Une autre astuce consiste à utiliser operator compune fonction de conversion du type compvers lui-même. Étonnamment, la norme n'interdit pas une telle fonction de conversion - mais elle dit qu'une telle fonction n'est jamais utilisée.

han
la source
8

VBScript

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

'Output: :)

Ce qu'il fait:

Les noms de fonction, de sous-nom et de variable dans VBScript peuvent être n'importe quoi si vous utilisez des crochets. Ce script crée une fonction appelée :(et un argument, "):"mais comme ils ne suivent pas la convention de dénomination normale, ils sont entourés de crochets. La valeur de retour est définie sur la valeur du paramètre. Un colon supplémentaire est utilisé pour tout obtenir sur une seule ligne. L'instruction Msgbox obtient une référence à la fonction (mais n'a pas besoin des crochets) et l'appelle avec un smiley en :)tant que paramètre.

Chariots automatisés
la source
1
Tant de visages froncés :(
Joe Z.
8

C #

En fait, je me suis surpris à le faire à tort :)

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

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

jeter , pas revenir .

Effrayer
la source
Haha, bienvenue sur le site! Bravo pour la bravoure de ce premier post. :)
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()));
    }
}

Et comment ça marche:

D'abord vous pensez que l'énum n'est pas valide mais son valide; alors vous pensez qu'il va imprimer les attributs d'un objet Point standard mais Gotcha! En raison de la sérialisation de Snakeyaml, vous obtenez une erreur lisse StackOverFLow

Et un autre:

enum derp
{

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

    static
    {
        System.exit(x);
    }
}

vous pensez qu'un flux Stackoverflow va se produire en raison d'une récursion évidente, mais le programme abuse du fait que lorsque vous l'exécutez, il static{} blocksera exécuté en premier et que, de ce fait, il se termine avant le chargement de 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;
}

celui-ci s'appuie sur ce /*Error*/code commenté comme point de fermeture pour le commentaire ouvert avant l'ab = 0; l'explication sur l'entier ab à 0x000d masque la nouvelle ligne pour activer le commentaire de la ligne suivante

masterX244
la source
1
Je ne peux pas pour le moment, mais ce serait bien si vous reformuliez ceci, si possible. C'est un peu difficile à lire tel
quel
les a rendus plus évidents; et balises spoiler sont destinés à provoquer les astuces ne sont pas évidentes au premier abord
masterX244
2
Attendez, alors le premier produit effectivement une erreur? C'est le contraire de ce que la question demande. Et pourquoi ne pas simplement System.exit (1) dans la seconde?
Riking
3
Aucun programmeur Java ne s'attend à un débordement de pile dans le deuxième extrait. Désolé, c'est de loin trop évident.
Tobias
1
@VVK habitude de codegolfing à utiliser à la enum{place de la class{sauvegarde d'un octet alors
masterX244
6

C

Les chaînes et les tableaux en c peuvent être assez déroutants

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
la source
9
c'est difficile à lire, mais je ne sais pas quel genre d'erreur les gens attendent de cela
Bryan Chen
3
Je voulais juste rappeler aux gens une notation valide mais non conventionnelle - faites-en ce que vous voulez. Je regarderais certainement trois fois avant de dire ceci est valide. Tout d'abord, des expressions comme 5 [chaîne] ne sont pas bien connues des codeurs occasionnels et défient toute logique d'indexation de tableaux. Deuxièmement, '' + string ressemble à l'ajout de 2 chaînes, mais avec un type de guillemet incorrect. Et troisièmement, & i ++ ressemble à l'adresse d'un entier (mais la priorité s'en occupe). Enfin, nous écrivons au-delà du littéral chaîne (mais pas au-delà du tampon de sauvegarde le plus important).
orion
Ça ne semble pas trop grave. Je n'ai qu'un peu codé en C ++, mais je peux comprendre cela.
Navin