The following code from Microsoft's Zune music player calculates today's
date from the years/days passed since 1980. But all Zune players locked up
on Dec 31 2008. Why?
Download
ZuneBug.java
and modify it to fix the bug.
int days = getTotalDaysSince1980(); // pretend this method exists
int year = 1980;
while (days > 365) { // subtract out years
if (isLeapYear(year)) { // pretend this method exists
if (days > 366) {
days = days - 366;
year++;
}
} else {
days = days - 365;
year++;
}
}
The bug occurs when the current year is a leap year and there are exactly
366 days left (i.e., if today is Jan 1 on a year after a leap year). The
code gets stuck in an infinite loop with days == 366 because
the while test is true but the if (days
> 366) is false. Here is a fixed version:
int days = getTotalDaysSince1980(); // pretend this method exists
int year = 1980;
while (days > 365 || (isLeapYear(year) && days > 366)) {
if (isLeapYear(year)) {
days = days - 366;
} else {
days = days - 365;
}
year++;
}