Autopsia al código fuente del Zune revela orden de suicidio

(c) Pastie.org

(c) Pastie.org

Para los más fanáticos o para aquellos que requieren de una explicación lógica ante un problema complejo, ya está disponible el código de programación que hizo que miles de reproductores Zune dejaran de funcionar colectivamente. El error comienza en la línea 249.

En circunstancias normales, esto funciona muy bien. La función sigue restando ya sea 365 o 366 hasta que se reduce a menos de un año para luego convertirse en el mes y el día de mes.

Lo que pasa es que en el caso del último día de un año bisiesto, continúa hasta que llega a 366. Debido al if (days>366) la ejecución para de sustraer si el bucle (loop) pasa a ser un año bisiesto. Pero 366 es demasiado grande para salir del bucle principal, lo que se traduce en que el Zune continue en el loop infinito sin hacer nada.

Si el error no se arregla, lo mismo va a suceder el 31 de diciembre del 2012… Microsoft, tienes 3 años… ¿alcanzarás?

Link: PQOAL Real-time clock (RTC) routines for the MC13783 PMIC RTC (Pastie.org)

Compartir Compartir
Publicado por Alexander Schek el 2 de January 2009 en la categoría Destacados, Software con los tags , , , , . Tiene 101 comentarios.

101 Comentarios

Autopsia al código fuente del Zune revela orden de suicidio

Deja tu Comentario ↓
casty

DesaprobarAprobar-1casty dijo el 3-1-2009 a las 05:20:

61

if (days >= 366)

Gon con ese código, solo consigues que el día 31 de Diciembre de un año bisiesto se convierta en el 1 de Enero del siguiente, lo cual sigue siendo erróneo (Aunque no cuelga el Zune, claro).

El error tampoco está en el bucle while, ya que es necesario en el caso de que dejes apagado el Zune más de un año.

La forma chapucera de arreglarlo sería poner un else break en el if de 366. Pero no me gustan los breaks en los bucles, así que dejo abierta la solución que no me apetece pensar hoy.

Daniel

DesaprobarAprobar0Daniel dijo el 3-1-2009 a las 06:20:

62

Derrepente el planeta del programador del código del RTC del ZUNE es de otro planeta donde si tienen 367 días, ¿pensaron en eso? :)

Carlos Le+Mare

DesaprobarAprobar4Carlos Le+Mare dijo el 3-1-2009 a las 07:20:

63

Con el código fuente le quedó claro a mi abuelita por qué no le funciona el Zune… cuando lo leyó dijo:

“Mire mijhito, mi Zune no funciona por ese evidente bug”.

jaja

TheDaVis Blog — La línea de la muerte de los Zune (o de la vída…)

DesaprobarAprobar-1TheDaVis Blog — La línea de la muerte de los Zune (o de la vída…) dijo el 3-1-2009 a las 08:37:

64

[...] Fayerwayer En: Blog — Enero 3, 2009 | [...]

Lainon

DesaprobarAprobar1Lainon dijo el 3-1-2009 a las 09:09:

65

No es:

if (days = 367)
{
printf (”WTF?!”);
}

Hay un evidente error en la condición. Si haces eso, estarás asignando el número a la variable y siempre será True. La versión correcta sería:

if (days == 367)
{
printf (”WTF?!”);
}

No me resistía a decirlo… :)

el_dva,

DesaprobarAprobar3el_dva, dijo el 3-1-2009 a las 09:23:

66

Corrijo, el error no esta en la condicion if, el codigo esta correcto, pero solo le falta una linea, despues del if un “else break” para salir del ciclo, ya no tiene sentido restar dias cuando queda 365 y es año bisiesto.

@la mayoria: recuerden que la variable days tiene los dias transcurridos desde 1/01/1980 asi que puede ser mayor a 365 incluso puede llegar a 367 caso 01/01/2009.

@Gon: recuerda que esto va a una pieza de harware, meter librerias mas complejas, hace que ocupen espacio necesario, ve que despues esto se compila a asembler o hex para el microcontrolador.

Juano

DesaprobarAprobar0Juano dijo el 3-1-2009 a las 10:42:

67

A mi me dijeron que esa parte de codigo se embebe una vez que reproduciste mas de cuatro veces un tema de La Mona Jimenez en el termino de un anio. Para los interesaods: el codigo que hace esto empieza en la linea 415.

esmetaman

DesaprobarAprobar0esmetaman dijo el 3-1-2009 a las 11:06:

68

Esto es lo que pasa cuando no hay un buen testeo de software. Sera que esas rutinas de conversion de fechas no estan por la red y libro de bugs….

Los Zune de 30 GB deciden suicidarse todos al mismo tiempo la noche del 31 - Burbuja Económica

DesaprobarAprobar-1Los Zune de 30 GB deciden suicidarse todos al mismo tiempo la noche del 31 - Burbuja Económica dijo el 3-1-2009 a las 11:07:

69

[...] al código fuente del Zune revela orden de suicidio Autopsia al código fuente del Zune revela orden de suicidio Para los más fanáticos o para aquellos que requieren de una explicación lógica ante un problema [...]

Noname

DesaprobarAprobar2Noname dijo el 3-1-2009 a las 11:15:

70

Punteros en C# ¿? quien ha sido el fumado que ha dicho que es c#¿? …

Por cierto… la gente de micro no hace pruebas unitarias ¿? FLIPO

Guillermo

DesaprobarAprobar2Guillermo dijo el 3-1-2009 a las 11:46:

71

@el_dva, Exacto, con un else break se arregla el error, es bastante poco elegante pero sirve. A eso iba, me cuesta explicar para que entienda alguien aparte de mi, pero en el fondo era que la solucion que se estaba planteando antes que con un simple signo = se arreglaba no servía y la mayoría no veía el problema.

Crash Override

DesaprobarAprobar0Crash Override dijo el 3-1-2009 a las 12:38:

72

@Gon buena tu explicación. Es exactamente lo que pasa con este codigo. Lo penca es darse cuenta que este error basico no lo pudieron corregir antes que saliera a su venta…si es Microsoft!!!

Andres

DesaprobarAprobar0Andres dijo el 3-1-2009 a las 12:52:

73

@el_dva: Pero si agregas un break no contabilizas el último año y te quedas con el año en 2008.

hashing

DesaprobarAprobar0hashing dijo el 3-1-2009 a las 13:01:

74

@Andres,
El conflicto es el día 366 de un año bisiesto, no el primero del año siguiente.
Con un break corriges el error.

Temo

DesaprobarAprobar-3Temo dijo el 3-1-2009 a las 15:05:

75

Todos los zuneS de 30 gb valieron reata!!! Entonces…. aqui esta el codigo q los orillo al suicidio..

while zune_trend = “Microsoft”
if zune < ipod_classic and zune < ipod_nano then
if zune < every_mp3_player then
if zune_cap = 30 Gb then
zune_scr = clrscr()
zune_scr = backcolor.blue
zune_health = 0
zune_restart.enable = “False”
end if
end if
end if
end while

Una vez que ese codigo sea remplazado el zune brillara de nuevo… jajaja

Guillermo

DesaprobarAprobar0Guillermo dijo el 3-1-2009 a las 15:10:

76

Eso no iva ahi, pueden enterrar el comentario, lo siento xD

seba

DesaprobarAprobar0seba dijo el 3-1-2009 a las 16:11:

77

que tiene de diferente C o C#

Nicolas Goles

DesaprobarAprobar0Nicolas Goles dijo el 3-1-2009 a las 17:02:

78

ufff. . harto… google it

CuchoLeo

DesaprobarAprobar0CuchoLeo dijo el 3-1-2009 a las 17:58:

79

me costo pero lo entendi hahaha , saludos a M$

Francisco

DesaprobarAprobar1Francisco dijo el 3-1-2009 a las 20:57:

80

@LOL es C++, no C#. En C# no puedes llamar a un método sin haber instanciado un objeto, lo cual C++ si puede, pues hereda esa funcionalidad del C.

CuchoLeo

DesaprobarAprobar0CuchoLeo dijo el 3-1-2009 a las 21:28:

81

haber pero se podria haber puesto if (days ==366) , poq n en ningun caso va a haber un numero mayor a 366 …, alguien que me responda :)

Guillermo

DesaprobarAprobar1Guillermo dijo el 4-1-2009 a las 00:34:

82

@CuchoLeo Si llega a 367, o en este caso DEBERIA llegar (ya que a esto se debe el error) x ejemplo el 1 de enero del 2009, recuerda que es un contador de dias, no quiere decir que algun año tenga 367 dias, sino que como un año bisiesto tiene 366 dias, cuando llegue a 367 el contador, debe restarle 366 al contador de dias (asi lo deja en 1) y sumarle 1 al indice de años, asi x ejemplo lo que debería hacer el codigo es cndo pasaron las 12 de la noche del 31 de dic. el contador de dias debia subir a 367 y asi meterse al if (days > 366) y restarle 366 y asi dejar el contador d dias en 1 del año 2009, x esto el break corrige el error y no así agregarle el signo = al if, ojala se haya entendido, salu2 =)

Guillermo

DesaprobarAprobar1Guillermo dijo el 4-1-2009 a las 00:43:

83

A nadie se le ocurrió una solución dsitinta a la del break? Yo cuando lo vi, pense en eso, pero no me gustan los break dentro de un bucle, es poco elegante y puede traer problemas, es como “feo” =P, pero no se me ocurre algo + correcto, en realidad no he pensado mucho pero me da paja xD.

TurboMAC

DesaprobarAprobar-2TurboMAC dijo el 4-1-2009 a las 01:20:

84

@Fayerwayer: Por que borraron mi primer post??? Acaso no les gusta usar su derecho de libre expresion?? Pues a mi tambien.

hashing

DesaprobarAprobar-1hashing dijo el 4-1-2009 a las 02:21:

85

@Guillermo,
sin dudas hay otras soluciones. Por mi parte, no tengo ningún problema contra los breaks. Bien pensados, no tienen por qué traer problemas, y tampoco son feos. Este código en particular con un break al final queda poco elegante para mi gusto, pero no es una generalidad. No por ahorrarte un break el código va a ser “más correcto”, en eso no concuerdo para nada.

freeze

DesaprobarAprobar-2freeze dijo el 4-1-2009 a las 02:29:

86

muchos de los que comentan aquí son unos verdaderos imbéciles para programar (conste que no dije todos), aquí la culpa es del programador, para eso existen pruebas unitarias, de integración, etc.

Y también los grandes culpables son los “testers”, que seguramente no consideraron este caso importante en sus casos de prueba.

NadieEnParticular

DesaprobarAprobar0NadieEnParticular dijo el 4-1-2009 a las 08:28:

87

//Otra pedazo de código que no aporta nada nuevo
BOOL ConvertDays(UINT32 days, SYSTEMTIME *lptime)
{
int dayofweek, month, year;
UINT *month_tab;

//Calculate current day of the week
dayofweek = GetDayOfWeek(days);

for (year = ORIGINYEAR; days > 365; year++)
{
//Si estoy acá, día vale al menos 366
//¿Por qué comprobar dos veces lo mismo?

if (IsLeapYear(year))
{
days-=366;
}
else
{
days-=365;
}
}

//buscar el mes, etc,etc
//Cargar lptime
return TRUE;
}

//Saludos.

Links 4/01/09

DesaprobarAprobar0Links 4/01/09 dijo el 4-1-2009 a las 12:31:

88

[...] y la Autopsia al código fuente del Zune revela orden de suicidio… ¿Si querian morir, por que no lo permitieron? [...]

Saint

DesaprobarAprobar5Saint dijo el 4-1-2009 a las 12:44:

89

No me quiero ni imaginar entonces el código fuente de Windows Vista o Windows ME!!!

Con razón MS nunca ha querido liberar el código fuente… no es por una razón comercial, es porque les da vergüenza!!

CuchoLeo

DesaprobarAprobar0CuchoLeo dijo el 4-1-2009 a las 14:24:

90

gracias guillermo por la aclaracion :)

Deja tu Comentario

XHTML: Puedes usar: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

Previsualizar comentario?