Wie eine If-Abfrage ein MP3-Player lahmlegen kann …

Würde es einen Preis für den letzten Bug des Jahres 2008 geben, so dürfte er an Musikplayer mit dem Freescale MC13783 Prozessor gehen. Zu dem bekanntesten Musikplayer mit diesem Prozessor gehört zum Beispiel die erste Generation des Microsoft Zune Player. 

Pünktlich zum Jahreswechsel berichteten Besitzer des Zuneplayers [1] [2] [3], dass der Player von selbst neu gestartet sei und als der Ladebalken die 100% erreichte sei das Gerät eingefroren. Ein reaktivieren sei nicht mehr möglich gewesen. Besitzer der Player gaben dem Bug sogleich den einprägsamen Namen “Y2K9-Bug” – in Anlehnung an das “Y2K-Problem”.

Was genau den Fehler auslöste wurde mittlerweile auch ausfindig gemacht, da der relative Quellcode direkt auf der Freescale-Seite zum Download bereitstellt. Der relevante Teil des Codes ist dabei dieser hier:

[geshi lang=c]year = ORIGINYEAR;
while (days > 365) {
    if (IsLeapYear(year)) {
        if (days > 366) {
            days -= 366;
            year += 1;
        }
    } else {
        days -= 365;
        year += 1;
    }
}[/geshi]

Auch ohne größeren C‑Kenntnisse kann man erkennen, dass der Quellcode im Zusammenhang mit den Schaltjahren zu tun hat. Um es möglichst vereinfacht zu erklären passiert hier folgendes. Da der 31.12.2008 in einem Schaltjahr war, handelte es sich um den Tag 366 des Jahres, sodass die While-Schleife aktiv wurde. Allerdings gibt es in der Schleife absolut kein Programmcode der besagt, was bei “days = 366” ablaufen soll (siehe If-Abfrage in Zeile 4). Diese springt erst an, wenn “days” größer als 366 ist. Dadurch gibt es absolut keine Chance aus der While-Schleife auszubrechen und damit haben wir an der Stelle eine klassische Schleife. 

Man kann jetzt natürlich darüber streiten, ob hier nicht ein switch angebracht gewesen wäre. Für den Verbraucher ist jedenfalls gut zu wissen, dass die Hardware nicht zum unbrauchbaren Stück Plastik und Metall wurde. Auf Golem.de befindet sich ein Hinweis, wie man den Player wiederbeleben kann. 

Immerhin hat Microsoft jetzt wieder 4 Jahre Zeit den Bug im Player zu beseitigen ;-)