Un bug dall'aspetto non intenzionale ma che causava arresti anomali [chiuso]


19

Ci sono una serie di domande che ruotano attorno a questo concetto, ma tutte sembrano comportare solo un crash, dando luogo a molte risposte che sono ovviamente progettate per causare un crash. Quindi la sfida che ti pongo è quella di scrivere un codice plausibile (anche se ciò che i codici supponevano "intenzione" è lasciare a te), che si blocca l'intero sistema operativo di destinazione, o solo se stesso, in un modo che non è immediatamente ovvio. (Mi rendo conto che ciò che conta come "immediatamente ovvio" è soggettivo, ma spero che la sfida sia ancora ragionevolmente chiara).

Il vincitore è la risposta con il maggior numero di voti dopo 5 giorni.


Rimossa la sfida del codice tag poiché non è stato fornito alcun criterio oggettivo.
Howard,

2
Ci sono state troppe occorrenze di queste nel mio codice attuale . Non ricordo nessuno di loro, però.
Joe Z.

Correlati: il Underhanded C Contest ha un sacco di problemi con un obiettivo simile e alcune soluzioni abbastanza intelligenti per loro.
FireFly

1
Sto votando per chiudere questa domanda come fuori tema perché le sfide subdole non sono più in argomento su questo sito. meta.codegolf.stackexchange.com/a/8326/20469
cat

Risposte:


30

C, Linux. Arresta in crash se eseguito come 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 */
}

Passando !=a =!, un confronto innocente si trasforma in un compito. E dato che pid 1 è init, e uccidere initprovoca un panico nel kernel, questo non è un codice che vorresti eseguire come root :)


1
init ignora SIGKILL, per il panico di Kernal devi inviarlo SIGSEGV, segnale 11
MultiplyByZer0

1
Ah, topi. Modificato per cambiare, ma questo lo rende molto meno appariscente. Funzionerebbe anche SIGTERM?
Dennis Kaarsemaker,


3
Vorrei nascondere SIGSEGVutilizzando il codice numerico. Dopotutto, avrebbe potuto essere un errore.
Konrad Borowski il

Mi piace quell'idea, curata :)
Dennis Kaarsemaker il

27

C #

Inizializziamo un elenco di byte con ogni valore di byte compreso tra 0 e 255.

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

Fuori dalla memoria? Ricordo distintamente di aver installato più di 256 byte ...

spoiler:

Un byte sarà sempre inferiore o uguale a 255. L'aggiunta va da 255 a 0.


3
Mi ci è voluto più tempo di quanto avrebbe dovuto capire
Hannesh,

Il compilatore C # non ti avverte che sei pbzcnevat jvgu n pbafgnag gung'f bhg bs obhaqf? (ruotato per non rovinare l'enigma)
Dennis Kaarsemaker,

@Dennis probabilmente no, perché lbh pna pbzcner qvssrerag ahzrevp glcrf jvgubhg reebe / jneavat, naq gur pbafgnag va dhrfgvba vf n inyvq vag.
mercoledì

2
@DennisKaarsemaker Ti avverte se lbh hfr 'yrff-guna gjb svsgl fvk' ed è per questo che non l'ho fatto. Non ci sono avvertimenti qui però.
Kendall Frey,

2
Ecco un decodificatore / codificatorestr.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('')
MosheK,

7

C

#include <stdio.h>

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

(Gli avvisi del compilatore lo daranno via.)


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 funzionante, tranne per il fatto che la mancanza di punto e virgola sulla riga contrassegnata con un commento provoca l'analisi errata e l'arresto anomalo.

L'aggiunta di un punto e virgola alla fine di quella riga lo risolve.


0

C ++

Inserisce i nomi e li memorizza in un vettore. Stampa i nomi al momento dell'inserimento del valore della bandiera. Chiede se l'utente ha pensato a più nomi; in tal caso, immette i nomi.

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

Per utenti non C ++, Java, C, l'errore è nell'istruzione print()s for. Dovrebbe essere for (int i = 0; i < names.size(); i++). Questo è un errore facile da fare e trascurare (fino a quando non ricevi il messaggio del compilatore) perché ha solo 1 carattere e perché l'operatore> = è talvolta richiesto nei forcicli.


Non so, l'ho notato proprio all'inizio della lettura. Forse sarebbe meglio inserire print()qualche codice più tardi, in modo che il lettore si stancasse un po 'prima di arrivare all'errore :)
Ruslan,

0

GTB

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

Si arresta in modo anomalo sulla calcolatrice perché [_+dovrebbe essere ["_"+, ma poiché non lo è, la calcolatrice esaurisce la memoria, cancellando potenzialmente la RAM in modo errato.


3
["_"+sembra un viso un po 'arrabbiato con me
corsiKa
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.