Вот сделка. Microsoft испортила кодекс в программируемом оборудовании для его Zune 30 игроков карманного компьютера Великобритании. Как тикающая бомба замедленного действия, проблема начала взрываться для владельцев Zune, как только 2008 начал переходить в 2009. Пользователи во всем мире быстро нашли, что их Zunes были полностью заперты. Запертый как в "полностью неоперабeльный," это: Zunes начал перезагружать, не предупреждая или полностью выключая. Когда пользователь щелкал властью назад на, операционная система Zune начнет загружать и замораживаться на фактическом экране погрузки. И никакое количество просьбы, мольб, или проклятия не могло установить проблему для несчастного пользователя.
Microsoft была быстра на "решении", которое я перефразировал таким образом: Переждите это. Не лучший ответ, о котором я могу думать, даже при том, что он действительно заканчивал тем, что работал в конце. Но два больших вопроса остаются. Как это случалось во-первых, и что другой неприятный кодекс скрывается в пределах OS Zune? У меня к сожалению нет большой части ответа для собственного Bryant последнего, но AeroXperience's Zadegan вырытой глубоко в кодекс, чтобы найти Ахиллесову пяту, которая вынула Zunes из комиссии. Вы можете проверить полный исходный текст прямо здесь, если Вы хотите смотреть на большую картину более удобочитаемым способом, чем это сообщение в блоге может обеспечить. Мы отрезали вниз к проблемной области, показанной ниже:
----------------------------------
#define ORIGINYEAR 1980
BOOL ConvertDays (дни UINT32, SYSTEMTIME* lpTime)
{
int dayofweek, месяц, год;
UINT8 *month_tab;
//Вычислите текущий день недели
dayofweek = GetDayOfWeek (дни);
год = ORIGINYEAR;
в то время как (дни> 365)
{
если (IsLeapYear (год))
{
если (дни> 366)
{
дни - = 366;
год + = 1;
}
}
еще
{
дни - = 365;
год + = 1;
}
}
----------------------------------
Для всех некодеров там, вот то, что случилось. Согласно Zadegan, кодекс разработан, чтобы вычислить год, смотря на число дней, которое протекло начиная с предопределенного ORIGINYEAR от 1 января 1980. Операционная система продолжает вычитать 365 дней (или 366, в случае високосного года) от общего количества дней, добавляя один к ценности года, пока это больше не может сделать так - таким образом делает правильный год.
Если Вы остры, Вы заметите единственный испорченный элемент в кодексе. На високосном годе через год есть 366 дней. 31 декабря 366-ой день года. Количество 366 больше чем 365, но это не больше чем 366. Что случается тогда? Циклы петли назад к началу проверить 366-дневное количество это остается. Это больше чем 365 дней, проходя через ту линию кодекса. Это не больше чем 366 дней, таким образом ничто не случается. Петли количества назад через кодекс, и петли назад через кодекс, и...


"ZuneGate '08: Что Действительно Случилось!" Комментарии