Pregunta

Me estoy poniendo en práctica un lenguaje de secuencias de comandos entre la plataforma para nuestro producto. Hay un requisito para detectar y manejar apropiadamente condición de desbordamiento de pila en lenguaje de máquina virtual. Antes de saltar y decir asegurarse de que no hay un desbordamiento de pila en el primer lugar, vuelva a leer mi primera frase - esto es un lenguaje de script y los usuarios finales pueden escribir programas incorrectos en esta lengua, que pueden desbordar la pila a través de, por ejemplo, sin fin recursividad.

Ahora sé cómo detectar y recuperarse de desbordamiento de pila en Windows (ver http: // support. microsoft.com/kb/315937 ). Sin embargo no puedo encontrar ninguna solución para Mac OS X.

La máquina virtual está implementado en C ++:. MSVC ++ en Windows, GCC en Mac OS X

Lo ideal sería que el mecanismo debe basarse en las capacidades UNIX ya que también la intención de puerto para Linux.

Gracias.

¿Fue útil?

Solución

OCaml tiene las mismas restricciones que usted (lenguaje de "script" donde el programador puede causar un desbordamiento de pila). Su compilador nativo utiliza la pila del sistema de llamadas a funciones - como lo hace - y maneja los desbordamientos de pila (materializándolos como excepciones)

.

Si usted no recibe una respuesta más explícita, sugiero nos fijamos en cómo se hace en las fuentes OCaml .

~/ppc $ cat >> t.ml

let rec f x = (f x) + (f x) ;;

f 0 ;;

~/ppc $ ocamlopt t.ml
~/ppc $ ./a.out 
Fatal error: exception Stack_overflow

Lo anterior es en Mac OS X Leopard. Buscar #ifdef HAS_STACK_OVERFLOW_DETECTION en los archivos de origen.

Otros consejos

No puedes determinar un tamaño de pila máximo para su programa, el inicio de la pila y luego calcular el final de la dirección de pila? Antes de cada operación de la máquina virtual, a continuación, puede comprobar si la pila se desbordará (aumento con respecto al dirección max) y luego subir la excepción. Otra forma sería escribir un identificador después del final de la pila (como DEADBEEF o así) y comprobar para su valor después de cada operación de la pila.


Yo todavía no veo por qué no es posible para que usted pueda añadir cheques (así es como apilar-manipulación se detecta normalmente). Pero todavía se podría añadir un punto de interrupción de hardware (en escritura) al final de su stackarea. Cuando se rompe, usted sabe que tiene un stackoverflow. Yo no aconsejaría él sin embargo, ya que puede estropear su entorno de depuración.

Pero, básicamente, - si tiene una máquina virtual, que también tienen lugar en el que se lee el código (por ejemplo código de bytes) y compila / interpreta. Ese es el lugar donde se puede comprobar la marca (comparable a los controles para detectar desbordamientos de búfer de pila).

Tener un vistazo a libsigsegv . Es una biblioteca C con rutinas para ayudarle a implementar un controlador de desbordamiento de pila, entre otras cosas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top