Hace 15 años | Por CortoCircuito a qconlondon.com
Publicado hace 15 años por CortoCircuito a qconlondon.com

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.

Comentarios

alexwing

Tony Hoare multiplícate por NULL

MrAmeba

Año 2050
"Bill Gates, dará una charla con título "Windows vista: The Billion Dollar Mistake"

D

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

yonni

A mi no me parecen tan malos los punteros, es un gran poder, y en consecuencia una gran responsabilidad...

D

#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.

D

#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++?

DexterMorgan

No entiendo nada de lo que estoy leyendo en este hilo. Estupendo, eso significa que todavía hay esperanza para mi :-P.

D

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."

D

#7 con ese memcpy no estás intentando asignar NULL a ptr. Prueba con

(int*)ptr = NULL;

karma_klassic_kontest

Pues para mí NULL es como el 0 en las matemáticas, algo ineludible.

crowhunter

Los punteros NULL son hermafroditas, se convierten en lo que haga falta.

D

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!!!

Irrelevanterrimo

#5 Te respondo con:

String hola = null;
if(hola.equals("zasentoalaboca"))

MycroftHolmes

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?"

Bender

ooooooooh como extraño estas sentencias void * ((pft1)(int))[124];

D

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 lol

p

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...

j

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 lol

mzneverdies

y habeis conseguido que esto llegue a portada? con esos comentarios?? pero mira que sois frikiiiis

(dicho con todo el amor del mundo :))

elhumero

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.

Aladaris

El Pascal es tan aberrante que NULL es Nil !!

w

#41 El que inventó el 0, ese sí que la lió gorda!

pingON

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

D

#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.

D

#2 Windows Vista Epic Fail Mistake!

M

NULL ese pequeño agujero negro de la informatica..

D

#47 para asignar NULL al puntero con memcpy:

int *const ptr;
int *const tmp = NULL;

memcpy(&ptr,&tmp,sizeof(int*));

Enfurecido

Se me ha roto el frikómetro al leer los comentarios de este meneo.

light

#50 jaja, aun me acuerdo de las prácticas con colas de Pascal.

metecola, sacacola, metecola, vaciacola

light

#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.

CortoCircuito

#4 quizás con algo tan "sencillo" como: * reinterpret_cast(&ptr) = NULL;

elhumero

#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).

D

#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.

Xday

#4 #6 #7 #11 #16 No os podeis imaginar cuan ignorante me siento leyendo vuestros comentarios lol

kaoD

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

kaoD

#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?

kaoD

#16 pues yo diría que sí

D

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.

Neofito

#24 y para mi!! a mis brazos lol

e

#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.

bark

A ver cuando pide perdón el que invento los ENCODING.

MAU

Pues no le perdono lol cuantos quebraderos de cabeza nos producen

ciwi

#8 y no nos olvidemos de su hit "null pointer exception"!

RamonMercader

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

D

#31 Eso es como si los intérpretes pidieran perdón por preguntar "Do you speak english?" o "Parlez vous français?"

D

#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".

D

Como me gustaría saber de que habláis...

j

#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