Erreurs d'exécution ridicules [fermé]


40

Ecrivez des programmes qui génèrent des erreurs d'exécution folles, obscures, ridicules ou tout simplement stupides. Obfuscation et golfitude (brièveté) non requis.

  • les solutions qui semblent bien fonctionner sont préférables.
  • les solutions qui semblent devoir se briser d'un côté, mais d'un autre, sont meilleures.
  • les solutions non déterministes sont préférables tant qu'elles sont parfois reproductibles.
  • les solutions avec une longue distance entre cause d'erreur et manifestation sont meilleures.
  • points de bonus pour la production d'erreurs qui devraient être impossible.
  • points bonus pour les erreurs qui font planter le moteur d'exécution (comme une erreur de segment python) ou le système d'exploitation.

L'unité de score doit être upvotes.

Addendum 1

Les comportements incorrects du compilateur sont bien aussi.


2
Faire segfault en Python est facile:import sys; sys.setrecursionlimit(~-2**31); x=lambda x:x(x); x(x);
marinus

Peter: oups. J'ai repositionné la question à mi-chemin en l'écrivant: S
Wug

... Qu'en est-il de malbolge ou d'INTERCAL? Je suis presque sûr qu'ils auraient des erreurs assez folles, ils peuvent probablement le faire avec un seul personnage aussi.
acolyte

1
C'est certainement le meilleur lien pour la solution: destroyallsoftware.com/talks/wat :-)
seri

Réponses:


69

Le PHP one obligatoire (qui n’a toujours pas été corrigé à partir de 5.4):

<?::

Les sorties:

Erreur d'analyse: erreur de syntaxe, T_PAAMAYIM_NEKUDOTAYIM inattendu sur la ligne 1

Whaa?


12
J'aime bien celui-ci. Ce pourrait être mon message d'erreur préféré. Mis à part la fois où mon ami a essayé de démarrer son ordinateur portable Windows sur la partition de récupération, l'écran entier a été transformé en une boîte blanche avec des lettres géantes rouges orthographiées "ERROR".
Wug

4
Délibéré, mais bizarre quand même: "Paamayim Nekudotayim semblerait au premier abord un choix étrange pour nommer un double-colon. Cependant, tout en écrivant le Zend Engine 0.5 (qui alimente PHP 3), c'est ce que l'équipe de Zend a décidé de l'appeler En fait, cela signifie double-colon - en hébreu! " php.net/manual/en/language.oop5.paamayim-nekudotayim.php
Jon Gauthier

12
@HansEngel: Oui, cela signifie double-colon en hébreu. Utiliser l'anglais pour chaque jeton sauf celui-ci a du sens parce que ...? Je suppose que je devrais juste demander à l'équipe PHP.
Ry-

Désolé mec, mais vous appelez simplement la méthode statique / variable ''(chaîne vide) de la classe ''(chaîne vide)
Ismael Miguel

1
@IsmaelMiguel: C'est déroutant à cause de l'hébreu, pas parce que c'est faux.
Ry-

61

Erreur de compilation Gcc:

int main()
{
        long long long a;
}

erreur: long long long est trop long pour GCC


6
Ils savaient simplement que quelqu'un essaierait long long long, si longet long longsont valables.
Konrad Borowski

3
Je pense "a est trop long!" aurait été un meilleur message d'erreur, mais c'est toujours une bonne réponse.
Wug

52

Invite de commande Windows

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

Sortie:

heureux était inattendu à cette époque.


1
J'ai essayé cette commande pour vérifier le résultat, mais il affichait ^V:( dur jours
Fabricio

8
@ Fabricio, était-ce juste en appuyant sur CTRL + V pour coller la ligne? Dans l'invite de commande, le "raccourci" du clavier pour coller est ALT + ESPACE, E, P.
Hand-E-Food

42

PHP

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

Vous ne pouvez pas passer une chaîne à une fonction, vous devez plutôt passer une chaîne!

Mise à jour: Ce code N'EST PAS une erreur en PHP 7. Passez la souris sur / cliquez / touchez un spoiler pour vérifier pourquoi (contient des spoilers expliquant le fonctionnement du code).

Une nouvelle fonctionnalité appelée déclaration de type scalaire a été ajoutée dans PHP 7. Cette fonctionnalité permet d'utiliser des types scalaires dans les déclarations de fonction.


6
Qu'est-ce que le f *** php.
Wug

7
PHP tente d'obtenir la classe string(qui est valide). L'indication de type (cette chose que vous faites) ne fonctionne que pour les classes. Comme la classe stringn'existe pas, une erreur est générée.
Ismael Miguel

Vous pouvez vérifier ici que votre code fonctionne correctement: sandbox.onlinephpfunctions.com/code/…
Ismael Miguel

2
@IsmaelMiguel: Oui, je comprends pourquoi cela se produit, mais l'erreur est toujours ridicule à mon avis.
Konrad Borowski

1
Alors essaie array(''=>array()'').
Ismael Miguel

33

frapper

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

Et vous penseriez que bash accepterait un simple "Hello, world!" programme.


Explication de ceci: les chaînes passées entre guillemets comme arguments de programmes dans bash sont développées, ce qui signifie `echo hi`qu'elles se transforment en l' hiintérieur de la chaîne entre guillemets. !est utilisé comme préfixe pour les désignateurs d'événement . Ainsi, bash essaie d'évaluer !", mais ne peut pas trouver l'événement référencé.
Mego

31

Python 2.7

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

Génère le peu utile:

SyntaxError: encoding problem: with BOM

Comment un simple commentaire peut-il générer une erreur?


12
Dans les derniers interprètes Python: si les 2 premières lignes commencent par # et contiennent la chaîne, coding:mot suivant utilisé comme description d'encodage
AMK

31

Mathematica

Lorsque vous utilisez Mathematica pour créer une sortie graphique, il se produit parfois des messages d'erreur formatés en fonction des spécifications utilisées dans le programme lui-même. Voici un exemple trivial.

Rotate[f/0, .6]

entrez la description de l'image ici


11
Ce n'est pas vraiment un message d'erreur, n'est-ce pas? C'est simplement la valeur que Mathematica renvoie lorsque vous divisez quelque chose par zéro.
Ilmari Karonen

26

Calculatrice graphique TI-89

J'ai découvert cela en apprenant la différenciation implicite dans le calcul au lycée. Si vous entrez:

d(xy+x=0,x)

Vous obtenez ce qui suit:

1 = 0

Avec cette mise en garde, imprimée en minuscules lettres au bas de l'écran:

Warning: May produce false equation

Cela se produit parce que xy n’est pas interprété comme x * y, mais plutôt comme son propre symbole xy.

Bizarrement, si vous le faites d(xy=0,x), vous recevez 0 = 0le même avertissement.


22

Vous pouvez faire exploser le cerveau du compilateur Haskell:

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

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

22

Rubis

Règles abuser.

class StandardError

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

  to_s(3)

end

Si exécuté sur OSX, produit, par exemple

$ ruby weird_runtime_error.rb 
weird_runtime_error.rb:9:in `to_s': Sculpturation contingence explicate tappet(phonendoscope ethopoeia nannandrous) (ArgumentError)
    from weird_runtime_error.rb:9:in `<class:StandardError>'
    from weird_runtime_error.rb:1:in `<main>'

6
Qu'est-ce que ça veut dire?
TRiG

9
Ça veut dire wrong number of arguments(1 for 0). Cela s'exprime par le biais d'une langue générée de manière stochastique et paresseuse en utilisant le vocabulaire anglais sans trop se soucier de la plausibilité linguistique.
Histocrat

21

Invite DOS

c:\>make love

vous donne

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

Je suis tombé sur cela alors que j'essayais d'insulter mon ordinateur pour son manque de coopération. Cela m'a rendu un peu triste jusqu'à ce que je découvre que cela ne se produit que si l'amour n'existe pas. S'il existe, il le fera volontiers.


5
Ceci est en fait dédié à l' makeutilitaire, pas au DOS lui-même.
Vovanium

1
Je reçois:make: *** No rule to make target 'love'. Stop.
agtoever

@ agtoever Vous exécutez la mauvaise marque.
Navin

Je comprends: make: Fatal error: Don't know how to make target 'love'mais c'est sur Unix. Sous DOS, je comprends make is not recognized as an internal or external command, operable program or batch file.
lebatsnok

17

Bash (erreur Quine)

Cette erreur est une Quine in Bash!

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

Bien sûr, vous devez avoir le pertinent locale(anglais ici).


1
Le mien n'a pas imprimé le ...à la fin, donc j'ai dû l'omettre aussi dans l'entrée originale.
Zev Eisenberg

16

CSH

Une cshblague vraiment classique :

% make fire?
make: No match.

15

Bash - récréation précise d'un message d'erreur historique rare

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

Sortie:

lp0 on fire

Nécessite que le code source du noyau Linux soit décompacté à l’emplacement habituel.

Fait amusant: j’ai une fois reçu ce message sérieusement lors de l’exécution d’une vieille imprimante à ruban.


Est-ce un message d'erreur ou juste une sortie d'un programme?
Yo '23

1
@yo 'le bash one-liner lui-même revient avec succès, mais le résultat généré est un véritable message d'erreur; le script extrait simplement l'erreur de la source du pilote d'imprimante.
Riot

ah ok, c'est une chose difficile à faire :-)
yo '

1
Incidemment, l'erreur signifie que l'impression continue de se produire dans un bourrage papier, ce qui présente un risque d'incendie.
Josué

13

C (++)

Si les erreurs de compilation comptent, en voici un (en supposant un fichier nommé "crash.c").

#include "crash.c"

int main(){ return 0; }

Cela remplit l'écran avec ceci lors de la compilation (avoir Ctrl-C à portée de main)

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

Un autre extrait qui compile parfaitement (aucun avertissement sous -Wallet illustre la belle sécurité de type de C </ s>

#include <stdio.h>
int i;

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

Le lancer donne:

Floating point exception (core dumped)

13

Rubis

C'est étrange que cela se produise dans un langage de haut niveau.

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

produit

ArgumentError: recursive array join

10

C'est très vieux, mais pour ceux qui se souviennent de BCPL,

GET "LIBHDR"

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

se plaindre

$8
 ^
"( ) or 8 expected"

10

R

Ce n’est techniquement pas une erreur mais un avertissement mais c’est quand même ridicule et cela se produit pour des raisons complètement ésotériques.

[[EDIT]] Il semblerait que la cause de certaines parties des avertissements amusants réside dans RStudio plutôt que R en tant que tel, donc c'est moins intéressant que je ne le pensais au départ. Le premier exemple, c’est-à plot(1:2, NotAGraphicalParameter = "ignore.me")- dire , cependant, est toujours reproductible dans "naked" R et est assez drôle en soi. [[/ EDIT]]

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

C'est comme si R se souvenait de nos insultes. Mais pas pour longtemps.

Je ne peux pas vraiment expliquer pourquoi cela se produit - mais c'est reproductible. En fait, cela se produit chaque fois que vous fournissez du "pas un paramètre graphique" au tracé 1, puis effectuez un tracé 2 de manière totalement impeccable. Il est particulièrement amusant de recevoir 12 avertissements "pas un paramètre graphique" pour le deuxième tracé, mais seulement 6 pour le premier. Une autre chose amusante est que si vous fournissez "pas un paramètre graphique" avec une valeur NULL, aucune condition n'est levée:

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

Et pour être encore plus ridicule, tracez quelques lignes au-dessus de l'intrigue précédemment dessinée:

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

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

Ceci devrait ne pas gagner gros temps à moins qu'il n'y ait pas de justice.


1
Quelle version de R utilisez-vous? Parce que je ne peux pas reproduire le paquet d'avertissements que vous recevez plot(2:3)juste après avoir utilisé plot(1:2, NotAGraphicalParameter = "ignore.me"). Avez-vous redéfini quelque chose dans votre .Rprofile?
Plannapus

1
Cela ressemble à cela est spécifique à l'exécution de R dans Rstudio (à la fois sous Windows et Ubuntu), mais ne se produit pas lorsque vous exécutez R dans un terminal linux ou Windows Rgui.
lebatsnok

Je pense avoir vu quelque chose de similaire avec les fonctions de modélisation (lm ou glm) sans Rstudio mais je ne peux pas le reproduire maintenant. (C'est-à-dire que des avertissements plus tôt apparaissaient lorsqu'ils n'étaient plus pertinents.)
lebatsnok

9

Script de commande Windows

ATTENTION, ceci est une fourchette!

Si vous essayez de quitter la console de quelque manière que ce soit, cela posera des questions compliquées sur la façon de quitter.

%0|%0|%0

Bonus:

  • Rendra le système pratiquement inutilisable jusqu'au redémarrage
  • Empêche de quitter le script, ce qui devrait être impossible

2
Danger Will Robinson?
Jacob

7

q vous insulte

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

`` `u #` `indique qque chaque élément d'une liste est unique (donc il peut probablement construire une sorte d'index basé sur le hachage). C'est ce qui arrive quand ce n'est pas vraiment vrai.


1
Quelle est la langue? J'ai essayé de chercher la langue "q vous insulte", mais je n'aurais rien pu trouver.
Konrad Borowski

Désolé pour la cryptographie involontaire, la langue est [q] ( en.m.wikipedia.org/wiki/ . Elle fonctionne aussi en k4, BTW.
Aaron Davies

6

Qu'en est-il des erreurs d'optimisation du compilateur:

#include <stdio.h>

#define N 4

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

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

Ceci est spécifique à gcc> = 4.7. Compile et fonctionne bien avecgcc -O0 -Wall . Compile avec gcc -O2 -Wallmais aboutit à une boucle inf.

Notez également comment gcc voit le problème pour les plus petits N, par exempleN = 3 :

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

Btw, cela a été pris à partir d'un rapport de bogue, je ne me souviens pas du numéro de bogue cependant.


3
Eh bien, c'est un comportement indéfini, donc le compilateur est autorisé à faire n'importe quoi. Mais il est toujours étrange que le compilateur ait décidé de changer une affectation en dehors du tableau local qui n’est jamais utilisée et d’utiliser une valeur non déclarée en une boucle infinie, même si la norme C le permet (après tout, cela dépend d’un comportement indéfini - accéder arr[N](en dehors du tableau), et accéder arr[0](ce qui n’est pas initialisé)). Étant donné que tout est permis pour un comportement indéfini, il ne s'agit pas d'une erreur d'optimisation, mais très probablement de ce que l'utilisateur souhaitait.
Konrad Borowski

4
Ce n'est pas explicitement une erreur d'optimisation du compilateur. UB est UB, et le compilateur aurait raison même s’il décidait de supprimer toutes vos données de votre disque dur.
H2CO3

5

J'ai toujours aimé cette bizarrerie dans APL:

      ⍝ évidemment une erreur de syntaxe
      {(]} 3  
ERREUR DE SYNTAXE
      {(]} 3

      ⍝ mais:
      {(]} 1 ÷ 0
ERREUR DE DOMAINE
      {(]} 1 ÷ 0 

      Cela fonctionne même avec des fonctions statiquement définies
      ∇z ← fx
[1] z ← [{]} x
[2]
      f 1 ÷ 0
ERREUR DE DOMAINE
      f 1 ÷ 0
     ∧
      f 3
ERREUR DE SYNTAXE
f [1] z ← [{]} x     

Il analyse paresseusement l'intérieur des fonctions!


4

PHP

<?php
[][] = 42;

[]est utilisé pour pousser des éléments. Cependant, si vous l'utilisez pour un littéral de tableau, PHP crée un message d'erreur insensé, même si vous l'assignez pour pousser. Requiert PHP> = 5.4, car auparavant, vous ne pouviez pas indexer les littéraux de tableaux.

Sortie:

Erreur fatale : impossible d'utiliser [] pour lire [...] sur [...] la ligne 2


4

Python

Blocs imbriqués

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

Python 2.7: SystemError: too many statically nested blocks

Listes d'auto-référencement

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

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

Python 2.7

True n'est pas une constante

Le problème dans l'exemple suivant est celui de Python 2.7 Trueet Falsene sont pas des constantes. Et Trueet Falsepeut automatiquement être projeté sur 1et 0:

True=False
a=10/True

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

Python 2.7:

Intendation

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

Avez-vous l'erreur?

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

Le mélange des onglets et des espaces était correct dans Python 2.7 ... mais faites attention au niveau d'indentation!


1
L'exemple des espaces de mélange et des tabulateurs ne fonctionne pas correctement car la plateforme Stack Exchange n'autorise pas les tabulateurs dans le code.
Konrad Borowski

@xfix: D'accord, mais je pense que les personnes qui lisent ceci comprennent le problème. La plupart des éditeurs n’indiquent pas non plus d’espace / de tabulation (à l’exception des espaces de fin) et s’ils le montrent, la plupart du temps, ils sont gris. Et dans toutes les autres langues (à l'exception des espaces), les espaces ne comptent pas, à condition qu'il y en ait au moins un.
Martin Thoma

Vous devriez écrire vos programmes dans le langage de programmation Whitespace.
Alexander

Le Python 3 est-il une blague?
Ry-

@minitech Je n'en ai aucune idée. C'est ce que c'est censé faire avec print a.
Justin

3

Je vais commencer:

#include <iostream>

using namespace std;

class A
{
public:
    A()
    {
    }

    void doSomethingDiabolical()
    {
        delete this;
    }

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

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

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

int main()
{
    jane();
}

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

Des suppositions pourquoi ce programme se bloque? :RÉ

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


1
N'est-ce pas une récursion infinie plutôt simple? B::BreakHorriblys’appelle avant de doSomethingDiabolicals’appeler, donc delete thisn’est jamais atteint.
marinus

Ce programme explose pour un grand nombre de raisons. Son comportement change si vous supprimez différentes instructions d'impression. Cependant, vous avez raison. Je n'ai pas eu le temps de reproduire le comportement indéfini que j'avais une fois, mais j'ai fini par recevoir un appel de fonction virtuelle pure au moment de l'exécution.
Wug

2
Vous ne dites pas que vous avez une fois accidentellement tapé quelque chose comme delete this, n'est-ce pas?
cessé de tourner dans

Non, c'était beaucoup plus subtil que cela, mais le résultat final était le même: un destructeur a été appelé pour une classe lors de l'exécution d'une fonction membre
Wug

3

Frapper

Je l’ai compris aujourd’hui lorsque j’ai essayé de savoir s’il était possible de protéger le système rm -rf /.

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

Le message d'erreur avec LANG=C:

rm: WARNING: Circular directory structure.
This almost certainly means that you have a corrupted file system.
NOTIFY YOUR SYSTEM MANAGER.
The following directory is part of the cycle:
  '/tmp/a/b'

Cet avertissement vient de rm, pas bash. Vous ne savez pas quelle langue vous devez déclarer dans le titre, étant donné que vous l’avez utilisé bashpour le configurer.

2

R

Un autre qui n'est pas ridicule et, encore une fois, un avertissement plutôt qu'une erreur, mais toujours agréable:

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

J'aime le dernier bit: 50 ou plus :)

Et les avertissements réels:

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

FUN = FUN!


1
Code Nyan?! Eh bien, c'est vraiment étrange!
Kroltan

Je ne vois pas ce qui est inattendu ou surprenant. log d'un produit négatif pas un nombre (NaN) comme il se doit.
Plannapus

2

CPython

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

Le résultat:

Fatal Python error: deallocating None

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Mieux encore en Python 3: ctypes.pythonapi._Py_Dealloc(ctypes.py_object(None)).
kirbyfan64sos

2

Bash - échec d'échappement contre-intuitif

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

résultats

-bash: !11: event not found

(les guillemets doubles n'empêchent pas l'expansion de l'historique sur la ligne de commande)

Prime:

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

Il est peu probable que la sortie soit celle attendue. Appuyez vers le haut pour obtenir à nouveau la commande et notez que sa modification est différente de celle que vous avez saisie. Si vous appuyez plusieurs fois vers le haut et entrez, il est probable que votre sortie commencera à avoir un aspect horrible. Essayez par vous-même.


2
Cette réponse est une copie de codegolf.stackexchange.com/a/17776 .
Dennis

2

C # - Générateur de Fibonacci récursif et paresseux

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

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

Ce code a l'air bien, non? Un générateur de Fibonacci assez simple, agrémenté de récursion et de dénombrement paresseux. Devrait marcher.

Nan! Cela entraînera une OverflowException. En effet, nous utilisons le nombre décimal et le 141e nombre de Fibonacci (~ 8.1E28) dépasse la valeur maximale du nombre décimal (~ 7.9E28).

Cependant, l'int ne lève pas d'exception OverflowException lorsque vous dépassez sa valeur maximale. Au lieu de cela, comme prévu, déborde à une valeur négative. Donc, si nous remplaçons int par decimal, comme dans le code suivant, cela devrait fonctionner, non?

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

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

Si vous lisez le code, vous comprendrez pourquoi cela ne fonctionnera pas. Si vous ne l'avez pas fait ... je n'ai pas simplement changé le type décimal en int; Je me suis également faufilé dans un appel à ToList () dans la déclaration foreach. Cela forcera l'énumérateur renvoyé à être évalué avec impatience. Cela ne causera pas 141 récursions, mais un nombre infini de récursions. En réalité, bien avant qu’il atteigne l’infini, il débordera bien entendu de la pile, ce qui obligera l’exécution à lancer une exception StackOverflowException. (bonus: cette exception ne peut pas être interceptée, elle va donc crasher le runtime)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.