Take the 2-minute tour ×
Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.

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.

share|improve this question
    
Removed tag code-challenge since there is no objective criterion given. –  Howard Jan 2 at 20:52
2  
There have been too many occurrences of these in my actual code. I can't remember any of them, though. –  Joe Z. Jan 10 at 16:47
    
Related: the Underhanded C Contest has a bunch of problems with a similar goal, and some quite clever solutions to them. –  FireFly Jan 13 at 14:29
add comment

6 Answers 6

up vote 24 down vote accepted

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

share|improve this answer
1  
init ignores SIGKILL, to kernal panic you must send it SIGSEGV, signal 11 –  MultiplyByZer0 Dec 29 '13 at 23:08
1  
Ah, rats. Edited to change, but that makes it a lot less inconspicuous. Would SIGTERM work too? –  Dennis Kaarsemaker Dec 29 '13 at 23:13
1  
3  
I would hide SIGSEGV by using numeric code. After all, it could've been a mistake. –  xfix Jan 2 at 21:56
    
I like that idea, edited :) –  Dennis Kaarsemaker Jan 2 at 22:35
show 1 more comment

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.

share|improve this answer
2  
This took me longer than it should've to figure out –  Hannesh Jan 2 at 20:57
    
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) –  Dennis Kaarsemaker Jan 2 at 22:38
    
@Dennis probably not, because lbh pna pbzcner qvssrerag ahzrevp glcrf jvgubhg reebe/jneavat, naq gur pbafgnag va dhrfgvba vf n inyvq vag. –  WChargin Jan 2 at 22:44
2  
@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. –  Kendall Frey Jan 3 at 0:24
2  
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('') –  MosheK Jan 10 at 17:26
show 4 more comments

C

#include <stdio.h>

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

(Compiler warnings will give it away.)

share|improve this answer
add comment

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.

share|improve this answer
add comment

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.

share|improve this answer
3  
["_"+ looks like a face that's a little upset with me –  corsiKa Jan 13 at 18:14
add comment

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.

share|improve this answer
    
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 :) –  Ruslan Jun 23 at 14:02
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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