En la próxima conferencia QCon en Londres, el inventor del algoritmo quicksort, Tony Hoare, dará una charla con título "Null References: The Billion Dollar Mistake". Lo llama "su" error de mil millones de doláres, porque desde su introducción en 1965 estima que ha costado esa cantidad en errores y vulnerabilidades de todo tipo.
#5:
#1#4 ¿Que sería de C/C++ sin punteros totalmente bajo el control y responsabilidad del programador? ¿Java?
#8:
Fantástico grupo NULL, que nos ha dado éxitos del rock míticos como "Invalid pointer", "Segmentation fault" y "Core dumped".
(léase con voz de comentarista radiofónico)
#19:
Tambien habia esta poesia inspirada por la entrevista al maestro bruce lee
Empty your memory,
with a free()...
like a pointer!
If you cast a pointer to a
integer,
it becomes the integer,
if you cast a pointer to a
struct,
it becomes the struct...
The pointer can crash...,
and can overflow...
Be a pointer my friend...
#28:
No tengo nada en contra de los punteros a NULL.
Pero odio los punteros que apuntan a basura y no son NULL
#26:
#24 Eres jefe de proyectos software de una gran multinacional ¿verdad?
#12:
Para mi es interesante que grandes inventos de la informática (correo electrónico y su @, el hipervínculo, mosaic, quicksort, C, C++, etc...) todavía tienen a sus inventores/creadores vivos.
Fantástico grupo NULL, que nos ha dado éxitos del rock míticos como "Invalid pointer", "Segmentation fault" y "Core dumped".
(léase con voz de comentarista radiofónico)
Para mi es interesante que grandes inventos de la informática (correo electrónico y su @, el hipervínculo, mosaic, quicksort, C, C++, etc...) todavía tienen a sus inventores/creadores vivos.
Pues no le veo nada malo a los punteros NULL, si hay problemas es culpa del programador, no del concepto.
Si no estuviera permitido el puntero NULL, estariamos todo el día viendo código del estilo:
tipodatos OBJETO_TIPODATOS_NO_VALIDO;
tipodatos *funcion_tal( .... )
...
if ( (ptr=function_tal(...)) == &OBJETO_TIPODATOS_NO_VALIDO )...
o por lo que dice #28, cualquier bug de acceso a miembros no inicializados seria mucho más difícil de seguir porque vete tu a saber por donde acabaría fallando
En otras palabras, cuando declaras un puntero debes asignarle un valor y cuando haces free o delete debes resetearlo a NULL.
No es el santo grial, sino algo que todo programador descubre en algún momento. Cuando todo el mundo en el equipo es cuidadoso, ese tipo de problemas prácticamente desaparece.
#5 "Que sería de C/C++ sin punteros totalmente bajo el control y responsabilidad del programador? ¿Java?"
¿Y que sería de la programación sin el tipo de gente que se rie de la asignación manual de memoria e ignora que la máquina virtual de su lenguaje favorito está programada en C/C++?
"Vacía tu mente.
Libérate de las formas.
Como los punteros.
Pon una cadena en un puntero y será la cadena.
Pon un entero y será el entero.
El puntero puede ser referencia o puede ser asignado.
Sé un puntero, amigo."
int a = 5;
int *const ptr = &a; //Puntero constante a int
*ptr = 4; //Bien, se modifica la variable ptr = NULL; //Error, intento de modificar el puntero constante
Off topic, me he reido un cacho con los comentarios, pero os dais cuenta lo frikazos que somos???
Nota mental: Usar el Null Pointer en un pub como charla para romper el hielo con las chicas...oh wait, pensarian que soy un perturbado , aunque tb puede superar como táctica al ya mitico "Hola,¿Conoces a Ted?"
De por sí la informática no es sencilla y si le sumas la programación... ni te cuento. Lo que dice este hombre acerca del puntero NULL no tiene perdón. ¿Qué culpa tiene él de que el resto de personas no sepan hacer buen código? Lo que hay que escuchar...
Eso da error de compilación, lo que mola es hacer:
int a = 5;
int *const ptr = &a;
*ptr = 4;
int * mptr = const_cast(ptr);
mptr = 0;
EDITO: Dejo el comentario que alguien me ha votado positivo, pero este código aparte de hacer una aberración no es nada, que a fin de cuentas no estamos cambiando el valor de ptr como yo pensaba hacer
Es el inventor del QuickSort, encima eso. La de libros que tuve que mirarme para encontrar el QuickSort no recursivo que me pedían en la universidad en la era pre-Internet.
Creo que teniendo cuidado y haciendo las cosas bien.., en lugar de las chapuzas de .., "esto lo quiere el cliente para ayer...., " las prisas y los bajos sueldos.., que desmotivan a cualquier programador..,
#32, #34, #35 muchas gracias, pero fue en la época que descubrí y que me enseñaron en la universidad que si alguien ya lo había hecho para que lo iba a hacer yo. Para que me iba a pasar un rato largo pensando como hacer un QS no recursivo, para una mierda práctica que no me sirvió para nada (Aprendí a ordenar un array en PASCAL allá por el 92).
Lo mejor de todo es que ningún profesor nos explico el principio del QS, solo nos lo enumeraron con el de la burbuja, ordenación directa, y no me acuerdo de mas nombres (casi han pasado 20 años). De estos nos explicaron como funcionaban.
Luego descubres el algosort, el sort o el sortalgo que te hace un QS transparente.
#34 en pascal, si mal no recuerdo y para la primera práctica de 1º una cola LIFO era un poco excesivo, porque no sabíamos ni lo que era una cola. Ni siquiera sabíamos que era recursividad que se daba en el segundo trimestre (para el 2º parcial).
#28 y #30: Efectivamente, yo no se demasiado de programación en C, pero si que se que cuando vas a escribir un fichero, antes tienes que comprobar que puedes escribir mirando si el puntero apunta a NULL o no. Y es algo necesario, porque si intentas sobreescribir un fichero en modo de solo lectura te sale el puntero apuntando a NULL para que desistas de escribir.
Oks, vale, en #52 se me fue la pinza, estaba pensando en memset en lugar de en memcpy (Y creo que #7 igual, porque su código tiene sentido cambiando memcpy por memset.)
Ya decía yo que era raro que en C funciona diferente que en ASM, siendo C tan cercano
#49 pues no estoy seguro de por qué rellenarlo con ceros frente a copiar NULL sería diferente.
A lo mejor es porque tengo la mente contaminada por ASM y en C funciona de otra manera, pero... ¿El puntero NULL no es un puntero a 0x00000000? ¿Un puntero no es (En plataformas 32bits) un DWORD que contiene la dirección de memoria a la que apunta?
Si tenemos un puntero y lo rellenamos de ceros, ahora ese puntero apunta a 0x00000000, es decir, a NULL. ¿No?
El puntero null es un atentado a la razón. Siempre intento evitarlo pero en ocasiones el API de Java me obliga a devolverlo. Mis getters y setters los he transformado en:
getNullable
setNullable
sólo para estar al tanto de que hay un peligro.
Todo el chequeo estático en tiempo de compilación se va a tomar por culo en el momento en que hay un null de por medio.
Pero el verdadero problema es que a muchos programadores el "null" les cae simpático y lo defienden a muerte (vease comentarios en esta página) o simplemente son unos vagos y devuelven null porque se la trae floja.
A buenas horas... el mal ya esta hecho, que me devuelva todas la horas(de madrugada normalmente, y el dia antes de entregar) que me he pasado depurando mis practicas
#14 El QS lo pasas a iterativo en un segundo. Simplemente hay que tener el control en una pila de las llamadas y ejecutarlas en modo LIFO dentro de un bucle del estilo "while pila isNotEmpty".
Comentarios
#1 #4 ¿Que sería de C/C++ sin punteros totalmente bajo el control y responsabilidad del programador? ¿Java?
Fantástico grupo NULL, que nos ha dado éxitos del rock míticos como "Invalid pointer", "Segmentation fault" y "Core dumped".
(léase con voz de comentarista radiofónico)
No tengo nada en contra de los punteros a NULL.
Pero odio los punteros que apuntan a basura y no son NULL
Tambien habia esta poesia inspirada por la entrevista al maestro bruce lee
Empty your memory,
with a free()...
like a pointer!
If you cast a pointer to a
integer,
it becomes the integer,
if you cast a pointer to a
struct,
it becomes the struct...
The pointer can crash...,
and can overflow...
Be a pointer my friend...
#24 Eres jefe de proyectos software de una gran multinacional ¿verdad?
Tony Hoare multiplícate por NULL
Para mi es interesante que grandes inventos de la informática (correo electrónico y su @, el hipervínculo, mosaic, quicksort, C, C++, etc...) todavía tienen a sus inventores/creadores vivos.
Año 2050
"Bill Gates, dará una charla con título "Windows vista: The Billion Dollar Mistake"
Pues no le veo nada malo a los punteros NULL, si hay problemas es culpa del programador, no del concepto.
Si no estuviera permitido el puntero NULL, estariamos todo el día viendo código del estilo:
tipodatos OBJETO_TIPODATOS_NO_VALIDO;
tipodatos *funcion_tal( .... )
...
if ( (ptr=function_tal(...)) == &OBJETO_TIPODATOS_NO_VALIDO )...
o por lo que dice #28, cualquier bug de acceso a miembros no inicializados seria mucho más difícil de seguir porque vete tu a saber por donde acabaría fallando
A mi no me parecen tan malos los punteros, es un gran poder, y en consecuencia una gran responsabilidad...
#28 Por eso Biarne Strustru se inventó el "Resource acquisition is initialization" y su amigo "Resource release is destruction".
http://en.wikipedia.org/wiki/Resource_acquisition_is_initialization
En otras palabras, cuando declaras un puntero debes asignarle un valor y cuando haces free o delete debes resetearlo a NULL.
No es el santo grial, sino algo que todo programador descubre en algún momento. Cuando todo el mundo en el equipo es cuidadoso, ese tipo de problemas prácticamente desaparece.
#5 "Que sería de C/C++ sin punteros totalmente bajo el control y responsabilidad del programador? ¿Java?"
¿Y que sería de la programación sin el tipo de gente que se rie de la asignación manual de memoria e ignora que la máquina virtual de su lenguaje favorito está programada en C/C++?
No entiendo nada de lo que estoy leyendo en este hilo. Estupendo, eso significa que todavía hay esperanza para mi :-P.
Ya lo dijo el sabio Bruce Lee:
"Vacía tu mente.
Libérate de las formas.
Como los punteros.
Pon una cadena en un puntero y será la cadena.
Pon un entero y será el entero.
El puntero puede ser referencia o puede ser asignado.
Sé un puntero, amigo."
#7 con ese memcpy no estás intentando asignar NULL a ptr. Prueba con
(int*)ptr = NULL;
Pues para mí NULL es como el 0 en las matemáticas, algo ineludible.
Los punteros NULL son hermafroditas, se convierten en lo que haga falta.
int a = 5;
int *const ptr = &a; //Puntero constante a int
*ptr = 4; //Bien, se modifica la variable
ptr = NULL; //Error, intento de modificar el puntero constante
Caguen Tony Hoare!!!
#5 Te respondo con:
String hola = null;
if(hola.equals("zasentoalaboca"))
Off topic, me he reido un cacho con los comentarios, pero os dais cuenta lo frikazos que somos???
Nota mental: Usar el Null Pointer en un pub como charla para romper el hielo con las chicas...oh wait, pensarian que soy un perturbado , aunque tb puede superar como táctica al ya mitico "Hola,¿Conoces a Ted?"
ooooooooh como extraño estas sentencias void * ((pft1)(int))[124];
one of the world's most widely used sorting algorithms.
Él más usado. Él más usado de los algoritmos de ordenación.
#14 Pasar el QS de recursivo a iterativo es un juego de niños
De por sí la informática no es sencilla y si le sumas la programación... ni te cuento. Lo que dice este hombre acerca del puntero NULL no tiene perdón. ¿Qué culpa tiene él de que el resto de personas no sepan hacer buen código? Lo que hay que escuchar...
Eso da error de compilación, lo que mola es hacer:
int a = 5;
int *const ptr = &a;
*ptr = 4;
int * mptr = const_cast(ptr);
mptr = 0;
EDITO: Dejo el comentario que alguien me ha votado positivo, pero este código aparte de hacer una aberración no es nada, que a fin de cuentas no estamos cambiando el valor de ptr como yo pensaba hacer
y habeis conseguido que esto llegue a portada? con esos comentarios?? pero mira que sois frikiiiis
(dicho con todo el amor del mundo :))
Es el inventor del QuickSort, encima eso. La de libros que tuve que mirarme para encontrar el QuickSort no recursivo que me pedían en la universidad en la era pre-Internet.
El Pascal es tan aberrante que NULL es Nil !!
#41 El que inventó el 0, ese sí que la lió gorda!
Creo que teniendo cuidado y haciendo las cosas bien.., en lugar de las chapuzas de .., "esto lo quiere el cliente para ayer...., " las prisas y los bajos sueldos.., que desmotivan a cualquier programador..,
el NULL no es mala idea
#9 El valor NULL es un invento grandioso. Pero el error del que habla el artículo es de la asignación del valor NULL a un puntero.
#2 Windows Vista Epic Fail Mistake!
NULL ese pequeño agujero negro de la informatica..
#47 para asignar NULL al puntero con memcpy:
int *const ptr;
int *const tmp = NULL;
memcpy(&ptr,&tmp,sizeof(int*));
Se me ha roto el frikómetro al leer los comentarios de este meneo.
#50 jaja, aun me acuerdo de las prácticas con colas de Pascal.
metecola, sacacola, metecola, vaciacola
#14 Programar: Buscar en libros/internet el código que hace lo que me han pedido.
No te creas, que hay gente que se gana su buen sueldo programando así.
Yo mismo me he dado mis buenos paseos por codeguru cuando de MFCs se trataba.
#4 quizás con algo tan "sencillo" como: * reinterpret_cast(&ptr) = NULL;
#32, #34, #35 muchas gracias, pero fue en la época que descubrí y que me enseñaron en la universidad que si alguien ya lo había hecho para que lo iba a hacer yo. Para que me iba a pasar un rato largo pensando como hacer un QS no recursivo, para una mierda práctica que no me sirvió para nada (Aprendí a ordenar un array en PASCAL allá por el 92).
Lo mejor de todo es que ningún profesor nos explico el principio del QS, solo nos lo enumeraron con el de la burbuja, ordenación directa, y no me acuerdo de mas nombres (casi han pasado 20 años). De estos nos explicaron como funcionaban.
Luego descubres el algosort, el sort o el sortalgo que te hace un QS transparente.
#34 en pascal, si mal no recuerdo y para la primera práctica de 1º una cola LIFO era un poco excesivo, porque no sabíamos ni lo que era una cola. Ni siquiera sabíamos que era recursividad que se daba en el segundo trimestre (para el 2º parcial).
#28 y #30: Efectivamente, yo no se demasiado de programación en C, pero si que se que cuando vas a escribir un fichero, antes tienes que comprobar que puedes escribir mirando si el puntero apunta a NULL o no. Y es algo necesario, porque si intentas sobreescribir un fichero en modo de solo lectura te sale el puntero apuntando a NULL para que desistas de escribir.
#4 #6 #7 #11 #16 No os podeis imaginar cuan ignorante me siento leyendo vuestros comentarios
Oks, vale, en #52 se me fue la pinza, estaba pensando en memset en lugar de en memcpy (Y creo que #7 igual, porque su código tiene sentido cambiando memcpy por memset.)
Ya decía yo que era raro que en C funciona diferente que en ASM, siendo C tan cercano
#49 pues no estoy seguro de por qué rellenarlo con ceros frente a copiar NULL sería diferente.
A lo mejor es porque tengo la mente contaminada por ASM y en C funciona de otra manera, pero... ¿El puntero NULL no es un puntero a 0x00000000? ¿Un puntero no es (En plataformas 32bits) un DWORD que contiene la dirección de memoria a la que apunta?
Si tenemos un puntero y lo rellenamos de ceros, ahora ese puntero apunta a 0x00000000, es decir, a NULL. ¿No?
#16 pues yo diría que sí
El puntero null es un atentado a la razón. Siempre intento evitarlo pero en ocasiones el API de Java me obliga a devolverlo. Mis getters y setters los he transformado en:
getNullable
setNullable
sólo para estar al tanto de que hay un peligro.
Todo el chequeo estático en tiempo de compilación se va a tomar por culo en el momento en que hay un null de por medio.
Pero el verdadero problema es que a muchos programadores el "null" les cae simpático y lo defienden a muerte (vease comentarios en esta página) o simplemente son unos vagos y devuelven null porque se la trae floja.
#24 y para mi!! a mis brazos
#30 Pues precisamente ése es un idioma bastante usado para implementar estructuras de datos:
http://en.wikipedia.org/wiki/Sentinel_node
así te evitas problemas con NULL, como desreferencias inválidas, "frees" incorrectos, etc.
A ver cuando pide perdón el que invento los ENCODING.
Pues no le perdono cuantos quebraderos de cabeza nos producen
#8 y no nos olvidemos de su hit "null pointer exception"!
A buenas horas... el mal ya esta hecho, que me devuelva todas la horas(de madrugada normalmente, y el dia antes de entregar) que me he pasado depurando mis practicas
#31 Eso es como si los intérpretes pidieran perdón por preguntar "Do you speak english?" o "Parlez vous français?"
#14 El QS lo pasas a iterativo en un segundo. Simplemente hay que tener el control en una pila de las llamadas y ejecutarlas en modo LIFO dentro de un bucle del estilo "while pila isNotEmpty".
Como me gustaría saber de que habláis...
#1, #4, #5: Recurriendo a C, pero sabía que al final podría ignorar al compilador y asignar cero al puntero:
#include
int main()
(Compila con GCC, y da un pete de los que molan al ejecutar, claro).
PD: #6 GCC da error con eso Aunque con un const_cast sí se lo traga pero luego no peta. Eso no tiene gracia