Un bogue involontaire mais provoquant un crash [fermé]


19

Il existe un éventail de questions qui tournent autour de ce concept, mais elles semblent toutes impliquer simplement de provoquer un crash, résultant en de nombreuses réponses qui sont très évidemment conçues pour provoquer un crash. Donc, le défi que je vous lance est d'écrire du code plausible (bien que ce que les codes supposent "intention" soit je vous laisse), qui plante soit tout le système d'exploitation cible, soit juste lui-même, d'une manière qui n'est pas immédiatement évidente. (Je me rends compte que ce qui compte comme "immédiatement évident" est subjectif, mais j'espère que le défi est encore assez clair).

Le gagnant est la réponse avec le plus de votes après 5 jours.


Suppression du défi de code de balise car aucun critère objectif n'est donné.
Howard

2
Il y en a eu trop dans mon code actuel . Je ne me souviens cependant d'aucun d'entre eux.
Joe Z.

En relation: le Concours Underhanded C a un tas de problèmes avec un objectif similaire, et des solutions assez intelligentes.
FireFly

1
Je vote pour fermer cette question comme hors sujet car les défis sournois ne sont plus sur le sujet sur ce site. meta.codegolf.stackexchange.com/a/8326/20469
cat

Réponses:


30

C, linux. Crashes du système s'il est exécuté en tant que root

/* Fork child process, wait 5 seconds and kill it */
pid_t pid = fork();
if(pid =! 0) {
    /* Parent */
    sleep(5);
    kill(pid, 11);
}
else {
    /* Child process. Would contain some code */
}

En changeant !=en =!, une comparaison innocente se transforme en tâche. Et étant donné que pid 1 est init, et tuer initprovoque une panique du noyau, ce n'est pas du code que vous voudriez exécuter en tant que root :)


1
init ignore SIGKILL, à la panique kernale vous devez lui envoyer SIGSEGV, signal 11
MultiplyByZer0

1
Ah, les rats. Modifié pour changer, mais cela le rend beaucoup moins discret. SIGTERM fonctionnerait-il aussi?
Dennis Kaarsemaker


3
Je me cacherais SIGSEGVen utilisant du code numérique. Après tout, cela aurait pu être une erreur.
Konrad Borowski

J'aime cette idée, éditée :)
Dennis Kaarsemaker

27

C #

Disons simplement initialiser une liste d'octets avec chaque valeur d'octet de 0 à 255.

List<byte> bytes = new List<byte>();
for (byte i = 0; i <= 255; i++)
{
    bytes.Add(i);
}

Mémoire insuffisante? Je me souviens clairement d'avoir installé plus de 256 octets ...

Divulgacher:

Un octet sera toujours inférieur ou égal à 255. L'addition passe de 255 à 0.


3
Cela m'a pris plus de temps que
prévu

Le compilateur C # ne vous avertit-il pas que vous êtes pbzcnevat jvgu n pbafgnag gung'f bhg bs obhaqf? (rot13'd pour ne pas gâcher l'énigme)
Dennis Kaarsemaker

@Dennis probablement pas, car lbh pna pbzcner qvssrerag ahzrevp glcrf jvgubhg reebe / jneavat, naq gur pbafgnag va dhrfgvba vf n inyvq vag.
wchargin

2
@DennisKaarsemaker Cela vous avertit si lbh hfr 'yrff-guna gjb svsgl fvk', c'est pourquoi je ne l'ai pas fait. Il n'y a cependant aucun avertissement ici.
Kendall Frey

2
Voici un str.toLowerCase().split('').map(function(c) { return c < 'a' || c > 'z' ? c : String.fromCharCode(((c.charCodeAt(0) - 'a'.charCodeAt(0) + 13) % 26) + 'a'.charCodeAt(0)); }).join('')
décodeur

7

C

#include <stdio.h>

int main(void) {
   fputs(stdout, "Hello, world!\n");
   return 0;
}

(Les avertissements du compilateur le donneront.)


3

Javascript

var arr = [3,6,1,54,2,-4,8,10,3,7]
function qs(a) {
    if (a.length < 2) return a
    var part = a.shift()
    var higher = [], lower = []
    for (var i = 0; i < a.length; i ++) {
        var x = a[i] // *** THIS LINE ***
        (x < part ? lower : higher).push(x)
 }
    return qs(lower).concat([part]).concat(qs(higher))
}
alert(qs(arr))

Quicksort de travail, sauf pour le fait que le manque de point-virgule sur la ligne que j'ai marquée avec un commentaire le fait mal analyser et planter.

L'ajout d'un point-virgule à la fin de cette ligne le corrige.


0

C ++

Saisit les noms et les stocke dans un vecteur. Imprime les noms lors de la saisie de la valeur du drapeau. Demande si l'utilisateur a pensé à plus de noms; si c'est le cas, saisit les noms.

#include <iostream>
#include <string>
#include <vector>
using namespace std;

void print(const vector<string>& v) {

  for (int i = 0; i <= names.size(); i++)
    cout << v[i] << endl;
}

void input(vector<string>& v) {

  string tmp;

  cout << "Enter a list of names seperated by returns: ";

  do {
    getline(cin, tmp);

    if (tmp != "-1")
      v.push_back(tmp);

  } while (tmp != "-1");

  print(v);
}

int main() {

  vector<string> names;

  string tmp;

  do {
    input(names);

    cout << "Do you have any more names to input (y or n)? ";
    cin >> tmp;

  } while (tmp == "y");

  return 0;
}

Pour les utilisateurs non C ++, Java, C, l'erreur se trouve dans l' instruction print()s for. Ça devrait l'être for (int i = 0; i < names.size(); i++). C'est une erreur facile à faire et à ignorer (jusqu'à ce que vous obteniez le message du compilateur) car il ne contient qu'un seul caractère et parce que l'opérateur> = est parfois requis dans les forboucles.


Dunno, l'a repéré juste au début de la lecture. Il serait peut-être préférable de mettre print()quelque part plus tard dans le code, afin que le lecteur se fatigue un peu avant de se tromper :)
Ruslan

0

GTB

:""→_[_+"+"→_]

Bloque la calculatrice car elle [_+devrait l'être ["_"+, mais comme ce n'est pas le cas, la calculatrice manque de mémoire, ce qui pourrait effacer la RAM de la mauvaise manière.


3
["_"+ressemble à un visage qui est un peu contrarié par moi
corsiKa
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.