19
\$\begingroup\$

There are a range of questions revolving around this concept, but these all seem to just involve causing a crash, resulting in many answers which are very obviously designed to cause a crash. So the challenge I set you is to write some plausible code (although what the codes supposed "intention" is I leave up to you), that crashes either the entire target OS, or just itself, in a way which is not immediately obvious. (I realize that what counts as "immediately obvious" is subjective, but hopefully the challenge is still reasonably clear).

The winner is the answer with the most votes after 5 days.

\$\endgroup\$
4
  • \$\begingroup\$ Removed tag code-challenge since there is no objective criterion given. \$\endgroup\$
    – Howard
    Jan 2, 2014 at 20:52
  • 2
    \$\begingroup\$ There have been too many occurrences of these in my actual code. I can't remember any of them, though. \$\endgroup\$
    – Joe Z.
    Jan 10, 2014 at 16:47
  • \$\begingroup\$ Related: the Underhanded C Contest has a bunch of problems with a similar goal, and some quite clever solutions to them. \$\endgroup\$
    – FireFly
    Jan 13, 2014 at 14:29
  • 1
    \$\begingroup\$ I'm voting to close this question as off-topic because underhanded challenges are no longer on-topic on this site. meta.codegolf.stackexchange.com/a/8326/20469 \$\endgroup\$
    – cat
    Apr 18, 2016 at 14:47

6 Answers 6

30
\$\begingroup\$

C, linux. Crashes system if run as 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 */
}

By changing != to =!, an innocent comparison is turned into an assignment. And given that pid 1 is init, and killing init causes a kernel panic, this is not code you would want to run as root :)

\$\endgroup\$
6
  • 1
    \$\begingroup\$ init ignores SIGKILL, to kernal panic you must send it SIGSEGV, signal 11 \$\endgroup\$ Dec 29, 2013 at 23:08
  • 1
    \$\begingroup\$ Ah, rats. Edited to change, but that makes it a lot less inconspicuous. Would SIGTERM work too? \$\endgroup\$ Dec 29, 2013 at 23:13
  • 1
    \$\begingroup\$ No: unix.stackexchange.com/questions/7441/… \$\endgroup\$ Dec 29, 2013 at 23:14
  • 3
    \$\begingroup\$ I would hide SIGSEGV by using numeric code. After all, it could've been a mistake. \$\endgroup\$ Jan 2, 2014 at 21:56
  • \$\begingroup\$ I like that idea, edited :) \$\endgroup\$ Jan 2, 2014 at 22:35
27
\$\begingroup\$

C#

Let's just initialize a list of bytes with every byte value from 0 to 255.

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

Out of memory? I distinctly recall having more than 256 bytes installed...

Spoiler:

A byte will always be less than or equal to 255. Addition wraps around from 255 to 0.

\$\endgroup\$
9
  • 3
    \$\begingroup\$ This took me longer than it should've to figure out \$\endgroup\$
    – Hannesh
    Jan 2, 2014 at 20:57
  • \$\begingroup\$ Doesn't the C# compiler warn you that you're pbzcnevat jvgu n pbafgnag gung'f bhg bs obhaqf? (rot13'd to not spoil the riddle) \$\endgroup\$ Jan 2, 2014 at 22:38
  • \$\begingroup\$ @Dennis probably not, because lbh pna pbzcner qvssrerag ahzrevp glcrf jvgubhg reebe/jneavat, naq gur pbafgnag va dhrfgvba vf n inyvq vag. \$\endgroup\$
    – wchargin
    Jan 2, 2014 at 22:44
  • 2
    \$\begingroup\$ @DennisKaarsemaker It does warn you if lbh hfr 'yrff-guna gjb svsgl fvk' which is why I didn't do that. There are no warnings here though. \$\endgroup\$ Jan 3, 2014 at 0:24
  • 2
    \$\begingroup\$ Here's a decode/encoder 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('') \$\endgroup\$
    – MosheK
    Jan 10, 2014 at 17:26
7
\$\begingroup\$

C

#include <stdio.h>

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

(Compiler warnings will give it away.)

\$\endgroup\$
3
\$\begingroup\$

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

Working quicksort, except for the fact that lack of semicolon on the line I marked with a comment causes it to parse wrong and crash.

Adding a semicolon at the end of that line fixes it.

\$\endgroup\$
0
\$\begingroup\$

C++

Inputs names and store them in a vector. Prints names upon entry of flag value. Asks if user thought of more names; if so, inputs names.

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

For non-C++, Java, C users, the error is in print()s for statement. It should be for (int i = 0; i < names.size(); i++). This is an easy error to make and overlook (until you get the compiler message) because it is only 1 character and because the >= operator is sometimes required in for loops.

\$\endgroup\$
1
  • \$\begingroup\$ Dunno, spotted it right at the beginning of reading. Maybe would be better to put print() somewhere later in code, so that the reader would get a bit tired before coming to the mistake :) \$\endgroup\$
    – Ruslan
    Jun 23, 2014 at 14:02
0
\$\begingroup\$

GTB

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

Crashes the calculator because [_+ should be ["_"+, but since it isn't, the calculator runs out of memory, potentially clearing the RAM in the wrong way.

\$\endgroup\$
1
  • 3
    \$\begingroup\$ ["_"+ looks like a face that's a little upset with me \$\endgroup\$
    – corsiKa
    Jan 13, 2014 at 18:14

Not the answer you're looking for? Browse other questions tagged or ask your own question.