# An unintentional-looking but crash-causing bug [closed]

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.

• Removed tag code-challenge since there is no objective criterion given. – Howard Jan 2 '14 at 20:52
• There have been too many occurrences of these in my actual code. I can't remember any of them, though. – Joe Z. Jan 10 '14 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 '14 at 14:29
• 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 – cat Apr 18 '16 at 14:47

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

• init ignores SIGKILL, to kernal panic you must send it SIGSEGV, signal 11 – MultiplyByZer0 Dec 29 '13 at 23:08
• 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
• – MultiplyByZer0 Dec 29 '13 at 23:14
• I would hide SIGSEGV by using numeric code. After all, it could've been a mistake. – Konrad Borowski Jan 2 '14 at 21:56
• I like that idea, edited :) – Dennis Kaarsemaker Jan 2 '14 at 22:35

## 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++)
{
}


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.

• This took me longer than it should've to figure out – Hannesh Jan 2 '14 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 '14 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 '14 at 22:44
• @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 '14 at 0:24
• 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 '14 at 17:26

# C

#include <stdio.h>

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


(Compiler warnings will give it away.)

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


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.

# 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.

• 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 '14 at 14:02

## 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.

• ["_"+ looks like a face that's a little upset with me – corsiKa Jan 13 '14 at 18:14