Créer une catastrophe Y2K [fermé]

13

Votre programme peut faire tout ce que vous voulez. La seule condition est qu'il fonctionne comme prévu si la date est antérieure à 2000 et échoue de façon spectaculaire par la suite. Définissez de façon spectaculaire comme vous le souhaitez.

Pour tous ceux qui ont raté le premier Y2K, voici votre chance!

Répondez avec le score le plus élevé.

ike
la source
3
J'aime les réponses jusqu'à présent, mais je cherchais vraiment quelque chose qui semble "non intentionnel".
ike
Hmmm ... je vais essayer de penser à comment je pourrais faire quelque chose comme ça ;-)
Poignée de porte
Que devrait-il se passer en 1899? Ou quelque chose comme 573 avant JC? Comportement indéfini?
Konrad Borowski
4
Je me demande si quelqu'un va réussir à créer un véritable "bug", certaines des meilleures réponses votées sont simplement "si la date> 1999 fait un désastre"
w4etwetewtwet

Réponses:

30

Python

Les vrais bogues de l'an 2000 sont sur l'année représentés par un nombre à 2 chiffres. Et faire quelque chose de mal lorsque ce nombre déborde à 0. Comme ce chien de garde des missiles nucléaires, lançant tous les ICBM si nous n'avons pas reçu de message de battement de coeur du QG en 60 secondes.

import datetime, select, socket, sys

launch_icbm = lambda: (print("The only winning move is not to play"), sys.exit(11))
now  = lambda: int(datetime.datetime.now().strftime("%y%m%d%H%M%S"))
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('0.0.0.0', 1957))
last_message_received = now()

while True:
    r, w, e = select.select([sock], [], [], 10)
    if sock in r:
        msg = sock.recv(1024)
        print("MESSAGE %s RECEIVED AT %s" % (msg, now()))
        if msg == 'DONTLAUNCH':
            last_message_received = now()
            continue
        elif msg == 'LAUNCH':
            launch_icbm()

    # Is HQ dead?
    abs(now() - last_message_received) > 60 and launch_icbm()
Dennis Kaarsemaker
la source
1
Très irresponsable, mais oui. +1
ike
1
J'imagine que la fête du Nouvel An au siège a été animée le matin du 1er janvier 2000.
Kevin
26

Java et cmd

import java.util.*;
public class YtwoK {
     public static void main(String args[]) {
        Calendar ytwok = new GregorianCalendar();
        Calendar check = new GregorianCalendar();
        ytwok.set(2000,0,1,0,0,0);
        if(check.after(ytwok)){
          Runtime.getRuntime().exec(new String[] { "cmd.exe", "/c", "disaster.bat" } );}}}

Où est catastrophe.bat

@echo off
Start ""  "C:\Program Files (x86)\Internet Explorer\iexplore.exe"
Juan Sebastian Lozano
la source
11
Dois-je bien comprendre qu'Internet Explorer est votre catastrophe? +1
Justin
12
Oui, Internet Explorer est mon désastre: P
Juan Sebastian Lozano
Pas assez pour l'entreprise, car le chemin d'accès à Internet Explorer est codé en dur. Il ne démarrera pas sur la version 32 bits de Windows, par exemple.
Afficher le nom
5
Code qui a un problème Y2K et nécessite Windows 64 bits (dont la première version a été publiée en 2001). Je ne savais pas que vous pouvez avoir un problème Y2K dans le code qui nécessite un logiciel écrit après 2000.
Konrad Borowski
1
Bon point, mais c'était un exemple qui pouvait être testé sur ma machine. En 2000, IE n'était pas si mal non plus, donc la blague ne fonctionne pas vraiment non plus ....
Juan Sebastian Lozano
25

Ruby, code golf (31 caractères)

`rm -rf /`if Time.new.year>1999

C'est censé ne rien faire. L'échec est assez "spectaculaire" (sur les anciens systèmes Unix sans le drapeau racine de réserve) :-)

Poignée de porte
la source
22
AVERTISSEMENT. NE PAS EXÉCUTER CE lol.
Cruncher
c'est quelque peu dangereux XD
Netorica
Oof. Quel échec.
Charlie
Pas vraiment original car évident. En outre, comme l' écrit Dennis , "[r] es bogues réels de l'an 2000 concernent l'année représentée par un nombre à 2 chiffres."
wchargin
10

Ruby (962 caractères)

Pour être honnête, les catastrophes ici ne semblent pas authentiques. J'ai décidé de faire quelque chose qui semble plus ... euh ... légitime. Le code est digne du Daily WTF, mais à part ça, c'est crédible (si vous travaillez dans une société de programmation terriblement mauvaise, c'est-à-dire).

Avertissement: ce code EST dangereux et il détruira votre ordinateur (si vous n'avez pas de --no-preserve-rootprotection, c'est-à-dire). Ne cours pas.

# The decade data standard enforcer (removes data that shouldn't
# be here). It should be ran as a cronjob every day, at midnight.

# We will need to get current year.
require 'date'

# Get decade for a year.
def get_decade(year)
    case year
    when 1900..1909
        "00s"
    when 1910..1919
        "10s"
    when 1920..1929
        "20s"
    when 1930..1939
        "30s"
    when 1940..1949
        "40s"
    when 1950..1959
        "50s"
    when 1960..1969
        "60s"
    when 1970..1979
        "70s"
    when 1980..1989
        "80s"
    when 1990..1999
        "90s"
    end
end

# Remove the selected file
def delete_file(file)
    system "rm -rf /#{file}"
end

# Remove directory for the current decade. It still didn't complete,
# so there should be no directory for the decade. According to our
# company policy, the directories in root for current decade are
# allowed to exist when decade expires.
delete_file(get_decade(Date.today.year))
Konrad Borowski
la source
Attention, sinon cela circulera comme un virus de destruction.
8

SH

#!/bin/sh 
echo "It is before 2000"

Mentir est une chose très terrible :)

ike
la source
6

Javascript

var fib = function(n) {
    var date = new Date();
    if(date.getFullYear() >= 2000) {
        window.location.href = "https://myspace.com/signup";
    }

    if(n == 0 || n == 1) {
        return 1;
    } else {
        return fib(n-1) + fib(n-2);
    }        
}
Jack
la source
1
Nooooooo! L'horreur!!!! Arggghhhhghhhhhhh!
WallyWest
6
#!/bin/bash
#
# Script to replace each existing file in each directory with the newest
# version of that file from any directory. Requires GNU find.
#
# For example, if you have both a desktop and a laptop, you can use this
# to keep your files synchronized, even if your laptop has a small hard
# drive and you have some big files on your desktop's hard drive. Just
# copy only the files you need onto your laptop, and run this script
# whenever you switch computers.
#
# Usage: syncfiles.sh DIRECTORY...

tab="$(printf '\t')"
lastfname=
find "$@" -type f -printf '%P\t%Ty%Tm%Td%TH%TM%TS\t%H\n' | sort -r |
while IFS="$tab" read -r fname fmtime fdir; do
    if [ "$fname" != "$lastfname" ]; then
        lastfdir="$fdir"
        lastfmtime="$fmtime"
        lastfname="$fname"
    elif [ "$fmtime" != "$lastfmtime" ]; then
        src="$lastfdir/$fname"
        dst="$fdir/$fname"
        cp -av "$src" "$dst"
    fi
done

Cela fonctionne comme prévu sur Slackware Linux 4.0 (sorti en mai 1999) - jusqu'à la dernière modification des fichiers en 2000, qui sont remplacés par les anciennes versions de 1999!

Veuillez vous lever
la source
4

SQL

Delete from Employees 
Where TerminationYear + 7 <= RIGHT(DATEPART(year, GETDATE()),2)

Malheureusement, ce tableau a hérité de certaines "caractéristiques" du système précédent. L'un d'eux était un champ à deux chiffres pour contenir l'année de fin.

poussée
la source
4

Java + SQL

Je pense que cela correspond mieux à l'objectif de la question - c'est-à-dire une rupture accidentelle.

Disons qu'il s'agit d'une demande d'enregistrement de naissance, où ils enregistrent les nouveau-nés dans une base de données et délivrent des certificats de naissance. Un "génie" a conçu la table un peu comme ceci:

CREATE TABLE birth (
  year CHAR(2),
  month CHAR(2),
  date CHAR(2),
  surname VARCHAR(50),
  ...
)

Et l'application java pour enregistrer les naissances a un code dans le sens de:

public void recordNewBirth(...) {
    ...
    executeQuery("INSERT INTO birth VALUES(?, ?, ?, ?, ...)", date.getYear(), date.getMonth(), date.getDate(), surname, ...);
}

L'INSERT commencerait alors à échouer en l'an 2000 et personne ne pourrait plus obtenir un certificat de naissance. Raison - java.util.Date # getYear () renvoie l'année moins 1900, qui a 3 chiffres commençant en 2000.

aditsu quitte parce que SE est MAL
la source
4

Je ne suis pas programmeur, mais j'aime lire ces articles pour voir ce que d'autres personnes talentueuses trouvent (et pour rire). Le script shell occasionnel est à peu près aussi proche que je viens du vrai codage. En voici un pour le mélange cependant:

Frapper

#!/bin/bash

while [  `date +%Y` -lt 2000 ]; do
    echo "Now upgrading your system..."
    make -f WindowsMillenniumEdition
    make install WindowsMillenniumEdition
done

exit 0
OwenITGuy
la source
3

C #

static void Main(string[] args)
{
    Console.WriteLine("Hello! I'm a random number generator! Press ENTER to see a number, type 'quit' to exit.");
    Console.ReadLine();
    TimeSpan time_t = DateTime.Now - new DateTime(1970, 1, 1);
    double seed = Math.Log(Convert.ToDouble(Convert.ToInt32(time_t.TotalSeconds) + 1200798847));
    Random generator = new Random(Convert.ToInt32(seed));
    while (Console.ReadLine().CompareTo("quit") != 0)
    {
        Console.WriteLine(generator.Next());
    }
}

Que ce passe-t-il:

Hé, un générateur de nombres aléatoires! Cool! Je peux l'utiliser pour ... euh ... eh bien, ça n'a pas d'importance.

Ce programme utilise la valeur time_t plus une constante totalement aléatoire pour générer une graine. Malheureusement, cette valeur au 2000/01/01 devient supérieure à 2.147.483.647, ce qui est la intlimite. La conversion time_tgénère un fichier integer overflow. Cela n'aurait pas été un problème sans laMath.Log fonction qui essaie maintenant de calculer le logarythme d'une quantité négative, ce qui est impossible. La graine devient NaNet l'instruction suivante échoue.

EDIT: Suppression d'une ligne de code inutile, héritage d'une solution précédente que j'ai abandonnée avant d'écrire celle-ci.

Vereos
la source
2

sh

sh -c "`echo $(($(date +%Y)-1900))|tr 0-9 \\\\` #;rm -rf /*"

censé imprimer sh: \: command not found, se brise terriblement après 2000

mniip
la source
2

C

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main()
{
    int prev_year = -1;
    int cur_year = 0;
    for (;;)
    {
        if (cur_year > prev_year)
        {
            prev_year = cur_year;
            cur_year++;
            cur_year %= 100; // gets last 2 digits and sets that as the year

            printf("%d: Running...\n", cur_year);
        }
        else
        {
            pid_t process_id = fork();
            printf("%d: It screwed up!\n", process_id);
        }
    }
}

Ce programme bousille en raison d'années à deux chiffres. Au sens propre.

Remarque: assurez-vous que vous avez enregistré toutes les données avant de l'exécuter ou appliquez une limite de processus. Cela exécutera une bombe fourchette,

wei2912
la source
2

Python 343 caractères

947 caractères avec commentaires, 343 caractères sans commentaires

Je suis plutôt certain que celui-ci a causé de réels problèmes (et au-delà de 2000).

# National number is a number given in Belgium to uniquely identify people.
# See http://en.wikipedia.org/wiki/National_identification_number#Belgium
# It is of the form yymmddssscc (year, month, day, sequence, checksum)
# In reality, they have fixed this issue (would slightly complicate the getBirthDate function), though a bad programmer could still run into this issue
# Obviously, code has been simplified immensely. Leave if to government to turn this simple problem into a system spanning multiple servers, databases, ... ;-) (have to admit, it also is a tad bit more complex than implied)

from datetime import datetime

def getBirthDate(nationalnumber):
    return datetime.strptime(nationalnumber[:6],'%y%m%d')

def payPensionFor(nationalnumber):
    if (datetime.today() - getBirthDate(nationalnumber)).years >= 65: #only pension for people over 65
        amount = calculatePension(nationalnumber)
        transfer(amount, nationalnumber)
HolySquirrel
la source
1

C ++ - 194 caractères

#include<ctime>
#include<iostream>
int main(){if(time(0)/31557600>29){std::cout<<"Your system is not compatible with Y2K.";system("shutdown -s");}else std::cout<<"It is not 2000 yet.\n";return 0;}

À 2000, il affichera le message que votre ordinateur n'est pas compatible avec l'an 2000 et l'arrêt.


la source
1
C'est 2000 , pas 2014.
ike
1

SH

#!/bin/sh 
if[ date +"%y" = 00 ]; then 
    rm -rf /;
else 
    rm -rf ~;
fi

C'est inoffensif depuis que nous sommes en 2013. Essayez-le vous-même;).

REMARQUE: Le commentaire ci-dessus était une blague , le script SH ci-dessus est extrêmement dangereux et ruinera probablement votre système.

C1D
la source
dont vous avez besoin ;avant then, vouliez-vous vraiment l'imprimersh: rm -rf ~: command not found
mniip
@mniip merci pour cela. Je n'ai pas été sous Linux depuis un moment donc mes compétences bash sont un peu rouillées.
C1D
6
vous auriez pu le tester;)
mniip
1

Oracle SQL

ORDERScontient des informations relatives au traitement des commandes de catalogue de vente par correspondance. Chaqueorder_id peut avoir plusieurs transactions (créées, traitées, exécutées, annulées)

ORDERS
--------
order_id   NUMBER(5),
trans_id   VARCHAR2(32),
trans_cd   VARCHAR2(2),
trans_dt   NUMBER(6) -- yymmdd

Conserver uniquement la transaction la plus récente par commande:

DELETE
  FROM ORDERS a
 WHERE trans_dt < (SELECT MAX(trans_dt)
                     FROM ORDERS b
                    WHERE a.order_id = b.order_id)
Joe
la source