Un error de aspecto no intencionado pero que causa un accidente [cerrado]


19

Hay una serie de preguntas que giran en torno a este concepto, pero todas estas parecen implicar simplemente causar un bloqueo, lo que resulta en muchas respuestas que están muy obviamente diseñadas para causar un bloqueo. Entonces, el desafío que le planteé es escribir un código plausible (aunque lo que los códigos supusieron "intención" es dejarlo a usted), que bloquea el sistema operativo objetivo completo o solo a sí mismo, de una manera que no es inmediatamente obvia. (Me doy cuenta de que lo que cuenta como "inmediatamente obvio" es subjetivo, pero espero que el desafío aún sea razonablemente claro).

El ganador es la respuesta con más votos después de 5 días.


Se eliminó el desafío de código de etiqueta ya que no hay un criterio objetivo dado.
Howard

2
Ha habido demasiadas ocurrencias de estos en mi código real . Sin embargo, no recuerdo ninguno de ellos.
Joe Z.

Relacionado: el concurso Underhanded C tiene un montón de problemas con un objetivo similar y algunas soluciones bastante inteligentes para ellos.
FireFly

1
Estoy votando para cerrar esta pregunta como fuera de tema porque los desafíos poco claros ya no están en el tema en este sitio. meta.codegolf.stackexchange.com/a/8326/20469
gato

Respuestas:


30

C, Linux. Se bloquea el sistema si se ejecuta 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 */
}

Al cambiar !=a =!, una comparación inocente se convierte en una tarea. Y dado que pid 1 es init, y matar initprovoca un pánico en el núcleo, este no es el código que desea ejecutar como root :)


1
init ignora SIGKILL, para el pánico interno debe enviarlo SIGSEGV, señal 11
MultiplyByZer0

1
Ah, ratas. Editado para cambiar, pero eso lo hace mucho menos discreto. ¿SIGTERM también funcionaría?
Dennis Kaarsemaker


3
Me escondería SIGSEGVusando código numérico. Después de todo, podría haber sido un error.
Konrad Borowski

Me gusta esa idea, editada :)
Dennis Kaarsemaker

27

C#

Inicialicemos una lista de bytes con cada valor de byte de 0 a 255.

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

¿Sin memoria? Recuerdo claramente tener más de 256 bytes instalados ...

Revelación:

Un byte siempre será menor o igual a 255. La suma se ajusta de 255 a 0.


3
Esto me llevó más tiempo del que debería haber
entendido

¿El compilador de C # no te advierte que eres pbzcnevat jvgu n pbafgnag gung'f bhg bs obhaqf? (Rot13'd para no estropear el acertijo)
Dennis Kaarsemaker

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

2
@DennisKaarsemaker Te advierte si lbh hfr 'yrff-guna gjb svsgl fvk' es por eso que no hice eso. Sin embargo, no hay advertencias aquí.
Kendall Frey

2
Aquí hay un decodificador / 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;
}

(Las advertencias del compilador lo delatarán).


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

Ordenación rápida de trabajo, excepto por el hecho de que la falta de punto y coma en la línea que marqué con un comentario hace que se analice mal y se bloquee.

Agregar un punto y coma al final de esa línea lo arregla.


0

C ++

Ingresa nombres y los almacena en un vector. Imprime nombres al ingresar el valor del indicador. Pregunta si el usuario pensó en más nombres; si es así, ingresa nombres.

#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 usuarios que no son C ++, Java, C, el error está en print()la fordeclaración de s . Debería ser for (int i = 0; i < names.size(); i++). Este es un error fácil de hacer y pasar por alto (hasta que reciba el mensaje del compilador) porque es solo 1 carácter y porque el operador> = a veces se requiere en los forbucles.


No sé, lo vi justo al comienzo de la lectura. Tal vez sería mejor ponerlo en print()algún lugar más adelante en el código, para que el lector se canse un poco antes de cometer el error :)
Ruslan

0

GTB

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

Bloquea la calculadora porque [_+debería serlo ["_"+, pero dado que no lo es, la calculadora se queda sin memoria, lo que puede eliminar la RAM de la manera incorrecta.


3
["_"+parece una cara que está un poco molesta conmigo
corsiKa
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.