Se produce un error de pila en tiempo de ejecución de depuración una vez que se alcanza el final de la función principal

He convertido un código Fortran heredado a C usando el convertidor f2c (f2c) y he creado una solución de Visual Studio 10 en Windows 7 (64 bits). También tuve que vincular mi programa C++ (test.cpp, que contiene mi función principal) con la biblioteca f2c (construida en mi sistema usando nmake).

El programa se ejecuta, pero una vez que se llega al final de la función principal, recibo el siguiente error de depuración:

Stack around the variable 'qq' was corrupted
Stack around the variable 'pf' was corrupted
Stack around the variable 'ampls' was corrupted

Me pregunto si esto podría deberse a una "corrección" realizada por el convertidor f2c en el archivo C convertido (de Fortran):

/* Parameter adjustments */
--x1;
--xabs;
--ximag;
--xreal;
--work4;
--work3;
--work2;
--work1;
--ampls;
--pf;
--qq;
--tri;

Esto parece un poco extraño, ya que todas estas variables son matrices C, y creo que el programa f2c simplemente está haciendo algo de aritmética de punteros para que el índice 0 en la matriz se convierta en el índice 1, de manera similar a Fortran.

No sé si esto también podría deberse a que algo salió mal con el código convertido que accede a un elemento de la matriz que no se ha asignado.

¿Cuál es la mejor manera de depurar este error y solucionarlo?

preguntado el 22 de mayo de 12 a las 15:05

Bueno, la aritmética de punteros es lo que [] el operador también lo hace... Necesitaría publicar su función principal, pero es probable que esté escribiendo más allá de los límites de la memoria asignada para sus arreglos. -

valgrind (solo Linux) suele ser bastante útil en situaciones como esta. -

Tal vez pueda traducir un programa Fortran simple que produzca un resultado similar cuando se ejecuta el programa traducido. Si es lo suficientemente simple, debería poder publicar el Fortran y la fuente traducida. Supongo que un programa que solo llama a una función que agrega uno a cada elemento en una matriz podría ser el truco. -

¡Gracias a todos los que respondieron! Veré si puedo hacer que Valgrind analice el código. También sospecho que algo anda mal al acceder a la memoria. -

3 Respuestas

Posibles razones:

  • Este error generalmente está relacionado con escribir fuera de los límites de una matriz (matriz dinámica o estática). Este error puede ocurrir al escribir\obtener un valor en un índice -ve o índice >= size_of_array.
  • Este error también ocurre si su puntero no está configurado en su ubicación correcta. (p.ej ptr = 0, ptr = 55, apunta a memoria eliminada (liberada o ha estado libre) o cualquier dirección no válida)

En mi opinión, la mejor manera de depurar su error es depurar su programa paso a paso y observar esos valores de puntero. Debe haber algo malo con ellos.

contestado el 22 de mayo de 12 a las 17:05

Gracias por tu sugerencia, Desolador. Ahora estoy revisando el programa y tratando de encontrar algún tipo de solución (paso a paso). - Nicolás Kinar

Lo que dices podría ser cierto. Sugeriría crear un programa muy pequeño que use una matriz y disminuya el puntero exactamente como lo hace f2c. Algo como

int aa[10];
int *pa = aa;
--pa;
pa[1] = ...

Es decir, probar el código sospechoso a pequeña escala. Puede aislar la causa del problema de esta manera. (Encontrar una solución alternativa es una historia diferente)

contestado el 22 de mayo de 12 a las 18:05

Gracias por la sugerencia. He estado probando un código similar tanto en la función principal como en la función dentro del archivo convertido, y parece que algo anda mal con la indexación de la matriz. Su publicación me ayudó a reducir las posibilidades de lo que realmente está sucediendo aquí. - Nicolás Kinar

¿Estás compilando con las versiones de depuración del crt? Eso podría darte algo más de información.

Además, ¿es posible que su biblioteca esté construida como C y su aplicación esté escrita como C++?

Esos errores que mencionas a veces se deben a diferentes convenciones de llamadas. Usted afirma que es una aplicación de 64 bits, por lo que no debería ser un problema (todas las aplicaciones de 64 bits usan la misma convención de llamadas), pero vale la pena investigarlo.

¿Es posible agregar todo el código convertido de Fortran a Visual Studio y no hacer una creación separada?

contestado el 24 de mayo de 12 a las 16:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.