Bus error : 10. (muy raro)..

Iniciado por digimikeh, 19 Enero 2019, 16:46 PM

0 Miembros y 1 Visitante están viendo este tema.

digimikeh

Buenas.

Estoy practicando C++ en 3 equipos, dos de ellos son OSX y otro es Xubuntu Linux, comparto mi aprendizaje entre los computadores usando git, así que actualizo el código cada vez que me cambio de equipo.

El problema en concreto es que en osx, al llegar a cierta parte del programa, se cierra mostrándome el mensaje "Bus Error : 10", cosa que no sucede cuando lo compilo y lo ejecuto en linux, me da la espina que puede ser algo del compilador, en ambos ejecuto la misma sentencia para compilar:

$c++ -o programa programa.cpp

Tengo identificada la linea que me manda ese error, está relacionada con la función
strcpy();

Tengo entendido que el error se refiere a que estoy invocando o asignando un valor a un indice que no existe o que tiene un formato incorrecto.  Pero de ser así, linux también debería botarme el programa..

El programa esta aqui:

https://paste.ofcode.org/BYUkcz7MFesBRRFyXjNCGg
Linea 352 específicamente.


*** EDIT ***
----------------

indiceAlumnoSeleccionado equivale a -1 al momento de usar strcpy, y eso marca el error de Bus Error 10, es lógico!, pero, por qué en linux me lo permite?..

*** EDIT 2 **
----------------

Linux permite la ejecución pero funciona mal, bueno, ya tengo identificado el problema, pero sería bueno si alguien sabe, me pueda explicar por qué los compiladores se comportan así, mi programa tenía un error y el compilador del Linux lo omitió...
Dungeons & dragons;
dragons.Attack();

MAFUS

Descárgate el estándar o el draft (este último es gratuito) y busca los arrays y a ver que pasa con sus índices. Si ante esto te dice que es undefined behavior quiere decir que los programadores del compilador pueden hacer lo que quieran ante esto, incluso iniciar la secuencia de ignición de un Saturno V a la luna.

CalgaryCorpus

Le estas dando al compilador una mision dificil.

El compilador, ademas de revisar que la sintaxis este bien, genera el codigo que se ejecutara posteriormente. Para el caso particular de la indexacion del arreglo, es un desplazamiento desde el comienzo del mismo unido al valor del indice. En sencillo, el compilador generara una suma:  direccion de comienzo + desplazamiento. La suma se calcula en tiempo de ejecucion.

En tiempo de ejecucion, mucho despues de que el compilador actuo', la direccion de memoria resultante de la suma de antes dicha podria ser mas alla o mas aca de los limites del arreglo mismo.

Este es el primer problema que te puedes enfrentar, el siguiente es que las distintas arquitecturas tienen distintas exigencias, por ejemplo, que los enteros tienen que estar en direcciones de memoria multiplos de 4 y aunque validamente podrias tener una direccion de memoria, esta no sea posible de desreferenciar por la restriccion antes dicha. Este es el bus error.

El problema es doble: Salirte de los limites del arreglo, y luego tener direccion de memoria con mal alineamiento.

En general los compiladores no tienen ninguna logica para "ejecutar" el programa para poder detectar si este problema se va a producir en tiempo de ejecucion.

Sin embargo, para el problema de salirse de los limites del arreglo existen productos comerciales que realizan chequeos estaticos y podrian advertirte el problema. En general, los compiladores no hacen tales chequeos.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

digimikeh

Ya esta, gracias por la explicación...
Dungeons & dragons;
dragons.Attack();