Непреднамеренно выглядящая, но вызывающая сбой ошибка [закрыто]


19

Существует целый ряд вопросов, связанных с этой концепцией, но, похоже, что все они просто связаны с возникновением сбоя, что приводит к множеству ответов, которые, очевидно, предназначены для сбоя. Поэтому задача, которую я поставил перед вами, состоит в том, чтобы написать некоторый правдоподобный код (хотя я и оставляю за вами код, который якобы «намерением»), который приводит к сбою как всей целевой ОС, так и только ее самой, что не сразу очевидно. (Я понимаю, что то, что считается «сразу очевидным», субъективно, но, надеюсь, проблема все еще достаточно ясна).

Победителем считается ответ, набравший наибольшее количество голосов через 5 дней.


Удален тег code-challenge, так как нет объективного критерия.
Говард

2
В моем реальном коде их было слишком много . Я не могу вспомнить ни одного из них, хотя.
Джо З.

В связи с этим: у Underhanded C Contest есть куча проблем с похожей целью, и есть несколько довольно умных решений для них.
FireFly

1
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что скрытые проблемы больше не обсуждаются на этом сайте. meta.codegolf.stackexchange.com/a/8326/20469
кошка,

Ответы:


30

С, Linux. Сбой системы при запуске от имени пользователя 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 */
}

При изменении !=на =!невинное сравнение превращается в назначение. И учитывая, что pid 1 есть init, а убийство initвызывает панику ядра, это не тот код, который вы хотели бы запустить от имени пользователя root :)


1
init игнорирует SIGKILL, для паники в ядре вы должны отправить его SIGSEGV, сигнал 11
MultiplyByZer0

1
Ах, крысы. Отредактировано, чтобы измениться, но это делает его намного менее незаметным. Будет ли SIGTERM работать тоже?
Деннис Каарсемакер


3
Я бы спрятался SIGSEGV, используя числовой код. В конце концов, это могло быть ошибкой.
Конрад Боровски

Мне нравится эта идея, отредактировано :)
Деннис Kaarsemaker

27

C #

Давайте просто инициализируем список байтов с каждым байтовым значением от 0 до 255.

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

Недостаточно памяти? Я отчетливо помню, что было установлено более 256 байт ...

Спойлер:

Байт всегда будет меньше или равен 255. Добавление оборачивается от 255 до 0.


3
Это заняло у меня больше времени, чем нужно было понять
Ханнеш

Разве компилятор C # не предупреждает вас, что вы pbzcnevat jvgu n pbafgnag gung'f bhg bs obhaqf? (rot13'd, чтобы не испортить загадку)
Деннис Kaarsemaker

@ Деннис, вероятно, нет, потому что я не знаю, потому что я знаю, что ты любишь.
wchargin

2
@DennisKaarsemaker Он предупреждает вас, если lbh hfr 'yrff-guna gjb svsgl fvk', поэтому я этого не сделал. Здесь нет никаких предупреждений.
Кендал Фрей

2
Вот 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('')
декодер

7

С

#include <stdio.h>

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

(Предупреждения компилятора передадут это.)


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))

Рабочая быстрая сортировка, за исключением того факта, что отсутствие точки с запятой в строке, помеченной комментарием, приводит к неправильному анализу и аварийному завершению.

Добавление точки с запятой в конце этой строки исправляет это.


0

C ++

Вводит имена и сохраняет их в векторе. Печатает имена при вводе значения флага. Спрашивает, думал ли пользователь о большем количестве имен; если это так, вводит имена.

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

Для не-C ++, Java, C пользователей ошибка в выражении print()s for. Так и должно быть for (int i = 0; i < names.size(); i++). Это простая ошибка, которую можно сделать и пропустить (пока вы не получите сообщение компилятора), потому что это всего 1 символ и потому что оператор> = иногда требуется в forциклах.


Не знаю, заметил это в самом начале чтения. Может быть, было бы лучше поместить что- print()нибудь позже в коде, чтобы читатель немного устал перед ошибкой :)
Руслан

0

GTB

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

Сбои калькулятора, потому что [_+должно быть ["_"+, но, поскольку это не так, калькулятор исчерпывает память, потенциально очищая RAM неправильно.


3
["_"+выглядит как лицо, которое немного расстроено мной
corsiKa
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.