Ver la versión completa : Cuidado con malloc en WIZ (buenas prácticas)
Una cosa a la que estaba acostumbrado... se que muchos direis que no es una buena práctica, pero funciona...
En linux, según recuerdo, malloc limpia la memoria antes de servirtela (o la limpia free antes de liberarla), al menos así lo hace mi Ubuntu 10.4, quizá por algún hardening que tenga de serie.
El caso es que el programa en linux me iba de maravilla, la cosa es sencilla:
int * dato; // dato apunta una direccion impredecible (basura de la pila o "vete a saber")
dato = malloc(sizeof(int));
// en GNU/linux x86 esto es = ptr 0x0000 (puntero a un int lleno de ceros)
// en WIZ arm esto es = ptr 0x???? (puntero a un int lleno de basura impredecible)
Así que tenedlo en cuenta, si necesitais limpiar la memoria, usad siempre memset después del malloc, si no os volvereis locos como yo un buen rato!
Saludos! (happy debugging)
Bueno, ésto es una buena práctica en general en programación de siempre :p nunca se sabe lo que puede haber en un puntero/variable sin inicializar :D
Bueno, ésto es una buena práctica en general en programación de siempre :p nunca se sabe lo que puede haber en un puntero/variable sin inicializar :D
Nunca mejor dicho!!!
Por eso me encanta C++!
Si, realmente el bug no ha sido por no hacer memset, ha sido por no inicializarlo correctamente, pero en linux x86 funcionaba porqué era 0 (chiripa!)
Cuando asignas memoria C no te garantiza que esté puesta a ceros, no es un bug. Esto no es Visual Basic!! Por eso hay que, asignar valor (en este caso un entero), o usar memset(ptr, 0, size). También puedes usar calloc() que asigna memoria y la inicializa a ceros.
No digo que sea un bug, digo que es una funcionalidad que gnu/linux (que no C) realiza, sobreentiendo para mayor seguridad.
Porsupuesto que C no es visualbasic! cada lenguaje tiene su forma de hacer las cosas y C no limpia la memoria, es el kernel de linux quien lo hace
También puedes usar calloc() que asigna memoria y la inicializa a ceros.
ves, ya he aprendido algo que no sabia.
Aiken
SpaVampyre
07/10/2010, 01:54
es el kernel de linux quien lo hace
pues no debería, para eso está el calloc, y si realmente quiero que esté inicializada a basura, o lo que es lo mismo, a random... tenía un programilla que si me la inicializan no funciona, o si funciona pero siempre igual y para un dado eso no es muy practico :D
Ni DIV/Fenix/Bennu inicializa los espacios reservados en tiempo de ejecución, y mira que las variables que se definen las inicializan :D:D:D
Algunos estais tan malacostumbrados como yo, luego pasa lo que pasa :lol:
Spavampyre: un método muy chulo para un dado es usar la función rand ¿que no te gusta? no te preocupes, usas rand continuamente hasta que el jugador pulse una tecla, más random imposible :D
Llevo un buen rato tratando de encontrar la funcionalidad que limpia la memoria en el free o en el malloc para linux y he de decir que no encuentro nada de nada...
Me suena de haber oido que proyectos de hardening tipo selinux o apparmor hacían cosas similares, pero no veo nada de nada de nada
Otra posibilidad de que el tiro me funcione bien en el linux que uso para desarrollar para la Wiz es que uso una máquina virtual (así tengo el entorno preparado y limpio haga lo que haga) quizá el culpable de este comportamiento sea el mismo software de virtualización, al fin y al cabo, virtualizar ram no es mas que hacer un malloc enorme, quizá el hace el memset o usa calloc y de ahí mi ram limpia...
En todo caso, está claro que las malas prácticas se pagan, aunque sean por descuido en mi caso, debería haber inicializado esa variable antes de usarla >X,D
SpaVampyre
07/10/2010, 15:46
Spavampyre: un método muy chulo para un dado es usar la función rand ¿que no te gusta? no te preocupes, usas rand continuamente hasta que el jugador pulse una tecla, más random imposible :D
Si, la conozco, eso lo hice por el mero hecho de hacer eso, una frikada vamos [wei], también puede ser utila si haces un malloc para saber o interpretar que es lo que hicieron en ese espacio de memoria anteriormente, más frikadas [wei2]
Porqué no usais /dev/random que para eso está? jeje
SpaVampyre
08/10/2010, 18:28
Porqué no usais /dev/random que para eso está? jeje
porque eso es dependiente del S.O. :-P
Yo hago rand(inicio,final), y sólo dependo de que el sistema disponga de intérprete de Bennu :D:D:D
Y con la nueva librería no oficial mod_rands que se está gestando, se generarán números randoms de todos los tipos, tamaños, colores, y probabilidades posibles :lol:
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.