Um bug de aparência não intencional, mas causadora de falha [fechado]


19

Há uma série de perguntas em torno desse conceito, mas todas parecem envolver apenas causar um acidente, resultando em muitas respostas que são obviamente projetadas para causar um acidente. Portanto, o desafio que eu defino é escrever um código plausível (embora o que os códigos supostamente "intenção" sejam deixo para você), que trava o sistema operacional de destino inteiro, ou apenas a si mesmo, de uma maneira que não é imediatamente óbvia. (Eu percebo que o que conta como "imediatamente óbvio" é subjetivo, mas espero que o desafio ainda seja razoavelmente claro).

O vencedor é a resposta com mais votos após 5 dias.


Removido o desafio do código da tag, pois não há um critério objetivo.
Howard

2
Houve muitas ocorrências disso no meu código real . Não me lembro de nenhum deles, no entanto.
Joe Z.

Relacionado: o concurso Underhanded C tem muitos problemas com um objetivo semelhante e algumas soluções bastante inteligentes para eles.
FireFly

11
Estou votando para encerrar esta questão como fora de tópico, porque os desafios secretos não estão mais no tópico neste site. meta.codegolf.stackexchange.com/a/8326/20469
cat

Respostas:


30

C, Linux. Falha no sistema se executado como 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 */
}

Ao mudar !=para =!, uma comparação inocente é transformada em uma atribuição. E dado que o pid 1 é init, e matar initcausa pânico no kernel, esse não é o código que você deseja executar como root :)


11
init ignora SIGKILL, para o pânico kernal você deve enviá-lo SIGSEGV, sinal 11
MultiplyByZer0

11
Ah, ratos. Editado para mudar, mas isso o torna muito menos imperceptível. O SIGTERM também funcionaria?
Dennis Kaarsemaker


3
Eu esconderia SIGSEGVusando código numérico. Afinal, poderia ter sido um erro.
precisa saber é o seguinte

Eu gosto dessa idéia, editado :)
Dennis Kaarsemaker

27

C #

Vamos apenas inicializar uma lista de bytes com cada valor de byte de 0 a 255.

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

Fora da memória? Lembro-me claramente de ter mais de 256 bytes instalados ...

Spoiler:

Um byte sempre será menor ou igual a 255. A adição envolve 255 a 0.


3
Isso me levou mais tempo do que deveria para descobrir
Hannesh

O compilador C # não avisa que você é pbzcnevat jvgu n pbafgnag gung'f bhg bs obhaqf? (rot13'd para não estragar o enigma)
Dennis Kaarsemaker

@ Dennis provavelmente não, porque lbh pna pbzcner qvssrerag ahzrevp glcrf jvgubhg reebe / jneavat, naq gur pbafgnag va dhrfgvba vf n inyvq vag.
precisa saber é o seguinte

2
@DennisKaarsemaker Ele avisa se você não sabe o que é isso porque eu não fiz isso. Porém, não há avisos aqui.
Kendall Frey

2
Aqui está uma decodificação / codificadorstr.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;
}

(Os avisos do compilador serão revelados.)


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

Trabalho rápido, exceto pelo fato de que a falta de ponto e vírgula na linha que eu marquei com um comentário faz com que ele analise errado e trave.

A adição de um ponto-e-vírgula no final dessa linha o corrige.


0

C ++

Introduz nomes e armazena-os em um vetor. Imprime nomes após a entrada do valor do sinalizador. Pergunta se o usuário pensou em mais nomes; Nesse caso, insira nomes.

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

Para usuários não C ++, Java, C, o erro está na instrução print()s for. Deveria ser for (int i = 0; i < names.size(); i++). Esse é um erro fácil de ser ignorado (até você receber a mensagem do compilador) porque ele tem apenas 1 caractere e porque o operador> = às vezes é necessário em forloops.


Não sei, viu logo no início da leitura. Talvez seria melhor para colocar print()em algum lugar mais tarde no código, para que o leitor iria ficar um pouco cansado antes de vir para o erro :)
Ruslan

0

GTB

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

Falha na calculadora porque [_+deveria estar ["_"+, mas como não está, a calculadora fica sem memória, potencialmente limpando a RAM da maneira errada.


3
["_"+parece um rosto que é um pouco chateado comigo
corsiKa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.