2008-10-18 9 views
5

En el siguiente caso llamo a Func con el puntero que se le pasa, pero en la función llamada, el parámetro muestra el valor del puntero como algo totalmente falso. Algo como abajo.¿Por qué un puntero se cambia a sí mismo durante la transición de la función?

bool flag = Func(pfspara);--> pfspara = 0x0091d910 

bool Func(PFSPARA pfspara) --> pfspara = 0x00000005 
{ 
    return false; 
} 

¿Por qué pfspara cambio a algún puntero falsa? No puedo reproducir el problema en depuración, solo en producción.

Gracias.

+0

¿Podría publicar un ejemplo pequeño y completo de un programa que demuestre este problema? Es difícil decir qué podría estar pasando solo con fragmentos de código. –

+0

Estoy contigo; definir los tipos es un mínimo para este tipo de preguntas (hasta las firmas de función incluidas). Además, ¿esto es C, C++ o algo más? –

+0

Supuse C++ debido a bool. Si estoy equivocado, él puede cambiar la etiqueta. – Bernard

Respuesta

1

En general, esto nunca debería suceder. Los problemas que pueden causar este tipo de síntomas incluyen incompatibilidad en las opciones de compilación entre los módulos que llaman y los que llaman, mala conversión de punteros de función de miembro o simplemente errores de compilación. Es necesario proporcionar muchos más detalles acerca de su problema: Mostrar el código real, especifique su compilador, especifique lo son la depuración frente a las banderas de compilación de producción, etc.

8

Si usted está tratando de depurar código optimizado en, por ejemplo, Visual Studio, no siempre se puede confiar en que el depurador muestre correctamente los valores de las variables, especialmente si la variable no se utiliza, de modo que el compilador probablemente lo optimice.

vuelva a emitir este lugar:

bool Func(PFSPARA pfspara) 
{ 
    printf("%x\n", pfspara); 
    return false; 
} 
0

Además de los comentarios Rasmus', me parece que es por lo general vale la pena comprobar si el problema se produce en una versión de depuración, así como la versión de lanzamiento. Si ve problemas reales que ocurren en una compilación de lanzamiento, pero no en la compilación de depuración, a menudo se debe a un error que está expuesto por los procesos de optimización, como una variable no inicializada. Existe un peligro real en hacer la mayoría de las pruebas en una compilación de depuración, para evitar el problema que está viendo aquí, y luego enviar una versión de lanzamiento. OMI, si no tiene un buen conjunto de pruebas de regresión (preferiblemente automatizado) evitaría el envío de código opimized.

0

Suena como un problema de desbordamiento de búfer para mí, algo está sobreescribiendo esa variable. Pero como se menciona en otras respuestas, no hay forma de saberlo seguro sin algún código real con el que trabajar.

0

Me parece que está garabateando en la pila ... en algún lugar de su código se está desbordando un búfer en la pila, o está tomando la dirección de un objeto en la pila y escribiendo después del la función vuelve. Esto está causando que tu pila esté dañada.

Puede ocurrir solo en modo de lanzamiento porque las asignaciones de la pila son diferentes debido a la optimización y exclusión de los bloques de 'guardia' utilizados para ayudar a comprobar este tipo de condición.

Cuestiones relacionadas