C/Visual C - Release que no funciona.

 
Vista:
sin imagen de perfil

Release que no funciona.

Publicado por Carlos (3 intervenciones) el 14/12/2006 20:23:15
Tengo un programa en C, hecho con Visual C y mi problema es que en modo Debug, funciona correctamente, sin embargo una vez realizo el Release ya no me funciona como debería funcionar, no me da errores ni nada, sin embargo no funciona, alguien sabe a que se debe?
Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Release que no funciona.

Publicado por fernando.gomez (1603 intervenciones) el 14/12/2006 22:30:51
Nuestro viejo amigo, el "comportamiento indefinido", ha alzado su fea cabeza una vez más.

No hay una razón en particular. Puede ser desde un puntero que apunte a basura en memoria hasta desbordamiento de cadenas de texto. Revisa tu código y asegúrate de que sigue el estándar (o si no lo sigue, asegúrate de que VC te permite hacer lo que sea que hiciste).

En particular, en una ocasión me sucedió algo similar. Tras horas de análisis, mucho café y dos cajetillas de cigarrillos me dí cuenta de que el problema recaía en una línea d código como la siguiente (la muestro muy simplificada, no soy tan wey como para pillar en algo así :P):

char sz[5];

strcpy(sz, _T("HOLA!"));

El problema es obvio, ¿no? La cadena la declaro para 4 caracteres más el nulo, y sin embargo le meto 5 caracteres (más el nulo, claro). En debug me funcionaba y en release lanzaba una excepción. Evidentemente esto es un comportamiento indefinido, por lo cuál no me puedo enojar con el compilador por su comportamiento ambiguo. Pero me entró la curiosidad, y me puse a investigar. Finalmente en uno de los artículos del Knowledge Base de MSDN me econtré con que el compilador hace lo siguiente: cada vez que se declara una variable, digamos de n bytes, estando en modo de debug EVC le agrega m bytes a la variable, donde m es el tamaño *que VC necesita para agregar información de depuración de la variable*. Entonces en debug, cuando me salía del búfer modificaba los bytes de la información de depuración. Cuando estaba en release, no había búfer de información de depuración y por ende, escribía en memoria inválida, provocando que EVC lanzara una excepción.

Así -como ves- eso del comportamiento indefinido suele ser un dolor de cabeza. Para tu búsqueda, te sugiero revises tus cadenas de texto, y más si trabajas con Unicode.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

RE:Release que no funciona.

Publicado por Carlos (3 intervenciones) el 14/12/2006 22:41:55
Ok merci, ya lo estudiaré poco a poco jeje.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

un consejo

Publicado por Fran (122 intervenciones) el 15/12/2006 01:36:37
algo q me ha funcionado la ultima etapa es usar programacion defensiva! que vendria a ser como cubrirte previamente de errores q pueden pasar... un ejemplito medio chango es:

char * c;

c = malloc(5);
if(!c)
exit(EXIT_FAILURE);

que lo que hace es si no hay memoria salir, eso es medio raro y drastico pero la idea es esa... espero sierva!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar