sprachkonstrukt.de

Die Erklärung eines Microsoft-Bugs

Am 1. Januar ging es durch alle Tech- und vor allem Apple-Blogs: Der Zune der ersten Generation (der iPod-Klon von […]

Am 1. Januar ging es durch alle Tech- und vor allem Apple-Blogs: Der Zune der ersten Generation (der iPod-Klon von Microsoft) funktionierte plötzlich nicht mehr, da er offenbar mit dem Jahreswechsel nicht zurechtkam – also eine Art verspäteter Jahr-2000-Bug.
Inzwischen tauchte der dafür verantwortliche Quelltext auf, der uns auf faszinierende Weise zeigt, wie sorgfältig bei Microsoft programmiert wird.
Folgender Code wird verwendet, um das Jahr in der Uhr des Zunes umzustellen:

while (days > 365)
    {
        if (IsLeapYear(year))
        {
            if (days > 366)
            {
                days -= 366;
                year += 1;
            }
        }
        else
        {
            days -= 365;
            year += 1;
        }
    }

Zur Erklärung: Ist der Wert des Tageszählers größer als 365, soll dieser zurückgesetzt und die Jahreszahl um 1 erhöht werden. Ist das aktuelle Jahr kein Schaltjahr, funktioniert das auch wunderbar (else-Teil). Andernfalls wird jedoch nur überprüft, ob der Wert des Tageszählers größer als 366 ist, also der 2. Januar oder später – in diesem Fall „klappt“ der Jahreswechsel. Wenn jedoch der Wert genau bei 366 ist, wir also den 1. Januar eines Jahres nach einem Schaltjahr haben, geschieht gar nichts, insbesondere fehlt die Abbruchbedingung der While-Schleife – eine Endlosschleife ist die Folge, und mit ihr ein Absturz des Zune.

Ein wunderschönes Beispiel, wie viel Wert bei Microsoft auf Qualität gelegt wird.