Niezamierzony, ale powodujący awarię błąd [zamknięty]

19

Istnieje wiele pytań dotyczących tej koncepcji, ale wszystkie one wydają się po prostu powodować awarię, w wyniku czego powstaje wiele odpowiedzi, które są bardzo wyraźnie zaprojektowane, aby spowodować awarię. Wyzwaniem, które postawiłem przed tobą, jest napisanie jakiegoś wiarygodnego kodu (chociaż to, co kody mają „intencją”, pozostawiam tobie), powoduje awarię całego docelowego systemu operacyjnego lub po prostu samego, w sposób, który nie jest od razu oczywisty. (Zdaję sobie sprawę, że to, co liczy się jako „natychmiast oczywiste”, jest subiektywne, ale mam nadzieję, że wyzwanie jest nadal dość jasne).

Zwycięzca jest odpowiedzią z największą liczbą głosów po 5 dniach.

w4etwetewtwet
źródło
Usunięto wyzwanie kodu znacznika, ponieważ nie podano obiektywnego kryterium.
Howard
2
W moim rzeczywistym kodzie wystąpiło ich zbyt wiele . Jednak nie pamiętam żadnego z nich.
Joe Z.
Powiązane: Konkurs Underhanded C ma wiele problemów o podobnym celu i kilka całkiem sprytnych rozwiązań.
FireFly,
1
Głosuję za zamknięciem tego pytania jako nie na temat, ponieważ nieudane wyzwania nie są już na ten temat na tej stronie. meta.codegolf.stackexchange.com/a/8326/20469
kot

Odpowiedzi:

30

C, Linux. Awaria systemu, jeśli działa jako 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 */
}

Zmiana !=na =!niewinne porównanie zamienia się w zadanie. A biorąc pod uwagę, że pid 1 jest init, a zabijanie initpowoduje panikę jądra, nie jest to kod, który chciałbyś uruchomić jako root :)

Dennis Kaarsemaker
źródło
1
init ignoruje SIGKILL, aby wywołać paniczną kernal, należy wysłać go SIGSEGV, sygnał 11
MultiplyByZer0
1
Ach, szczury. Edytowane w celu zmiany, ale dzięki temu jest o wiele mniej widoczne. Czy SIGTERM też by działał?
Dennis Kaarsemaker
3
Chowałbym SIGSEGVsię za pomocą kodu numerycznego. W końcu to mógł być błąd.
Konrad Borowski
Podoba mi się ten pomysł, zredagowany :)
Dennis Kaarsemaker
27

DO#

Po prostu zainicjujmy listę bajtów każdą wartością bajtu od 0 do 255.

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

Brak pamięci? Pamiętam wyraźnie, że zainstalowałem ponad 256 bajtów ...

Spojler:

Bajt zawsze będzie mniejszy lub równy 255. Dodawanie obejmuje około 255 do 0.

Kendall Frey
źródło
3
Zajęło mi to więcej czasu, niż powinienem zrozumieć
Hannesh
Czy kompilator C # nie ostrzega cię, że jesteś pbzcnevat jvgu n pbafgnag gung'f bhg bs obhaqf? (zgnilizna by nie zepsuć zagadki)
Dennis Kaarsemaker
@ Dennis prawdopodobnie nie, ponieważ lbh pna pbzcner qvssrerag ahzrevp glcrf jvgubhg reebe / jneavat, naq gur pbafgnag va dhrfgvba vf n inyvq vag.
wchargin
2
@DennisKaarsemaker To ostrzega, jeśli lbh hfr „yrff-guna gjb svsgl fvk”, dlatego tego nie zrobiłem. Nie ma tu jednak żadnych ostrzeżeń.
Kendall Frey
2
Oto dekodowanie / koderstr.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

do

#include <stdio.h>

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

(Ostrzeżenia kompilatora to zdradzą.)

Nate Eldredge
źródło
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))

Działa Quicksort, z wyjątkiem faktu, że brak średnika w linii, którą zaznaczyłem komentarzem, powoduje, że jest on źle analizowany i ulega awarii.

Dodanie średnika na końcu tego wiersza rozwiązuje ten problem.

Klamka
źródło
0

C ++

Wprowadza nazwy i przechowuje je w wektorze. Wyświetla nazwy po wprowadzeniu wartości flagi. Pyta, czy użytkownik pomyślał o większej liczbie nazw; jeśli tak, wprowadź nazwy.

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

W przypadku użytkowników innych niż C ++, Java, C błąd występuje w instrukcji print()s for. Tak powinno być for (int i = 0; i < names.size(); i++). Jest to łatwy błąd do zrobienia i przeoczenia (dopóki nie pojawi się komunikat kompilatora), ponieważ ma on tylko 1 znak i ponieważ operator> = jest czasami wymagany w forpętlach.

Hosch250
źródło
Dunno zauważył to na początku czytania. Może lepiej byłoby umieścić print()gdzieś później w kodzie, aby czytelnik zmęczył się przed popełnieniem błędu :)
Ruslan
0

GTB

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

Awaria kalkulatora, ponieważ tak [_+powinno być ["_"+, ale ponieważ tak nie jest, w kalkulatorze zabrakło pamięci, potencjalnie usuwając pamięć RAM w niewłaściwy sposób.

Timtech
źródło
3
["_"+wygląda jak twarz trochę mnie zdenerwowana
corsiKa