Zune 30 – перше покоління MP3-плеєрів від Microsoft. Випускалися пристої з 2006 року, а у 2011 випуск усієї лінійки припинився. Усього було 4 покоління: 1) Zune 30, 2) Zune 4, 8, 80, 3) Zune 16, 120, 4) Zune HD.
Баг про який йде мова був лише в коді Zune 30.
Сам код:
1: year = ORIGINYEAR; /* = 1980 */
2:
3: while (days > 365)
4: {
5: if (IsLeapYear(year))
6: {
7: if (days > 366)
8: {
9: days -= 366;
10: year += 1;
11: }
12: }
13: else
14: {
15: days -= 365;
16: year += 1;
17: }
18: }
Цей код як бачите вираховує рік на основі лічильника днів (лічильник починається з 1/1/1980).
Тепер слідкуємо за руками.
Уявимо що у нас останній день 2008-го року:
- У рядку 3 код перевіряє кількість днів, умова виконується (366 > 365)
- У рядку 5 функція IsLeapYear() повертає true бо 2008 високосний рік
- Умова у рядку 7 не виконується (366 > 366)
- Переходимо до рядка 3
Ну от ми і в нескінченному циклі!
Таким чином усі пристрої у першу секунду 2009-го року перетворилися на тикви, тобто перестали реагувати на будь-що.
Справедливості заради треба сказати що це був код не Microsoft, а Freescale – драйвер для їхнього чіпа-годинника. Були і інші пристрої що зловили точно таку ж проблему, наприклад медіа-плеєр від Toshiba. Інші моделі Zune мали інший чіп і там цієї проблеми не виникло.
Офіційно рекомендованим способом вирішити проблему було розрядити остаточно батарею і поставити пристрій на зарядку (таким чином 1 січня 2009-го було б 367-мим днем якщо рахувати від 1/1/2008).