341 meneos

"Lo siento por inventar el puntero NULL" [ENG]

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.

etiquetas: programación
negativos: 0   usuarios: 181   anónimos: 160  
compartir:  twitter  facebook  tuenti  
  1. #2   Año 2050
    "Bill Gates, dará una charla con título "Windows vista: The Billion Dollar Mistake"
    69  votos: 10   link
    el 04-03-2009 01:24 UTC por Danny Danny
  2. #4   Eso da error de compilación, lo que mola es hacer:

    int a = 5;
    int *const ptr = &a;
    *ptr = 4;
    int * mptr = const_cast<int*>(ptr);
    mptr = 0;

    :-P

    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 xD
    15  votos: 1   link
    el 04-03-2009 01:33 UTC por jmpep jmpep
  3. #5   #1 #4 ¿Que sería de C/C++ sin punteros totalmente bajo el control y responsabilidad del programador? ¿Java? :-P
    257  votos: 30   link
    el 04-03-2009 01:35 UTC por CortoCircuito CortoCircuito
  4. #6   #4 quizás con algo tan "sencillo" como: * reinterpret_cast<int**>(&ptr) = NULL; ;)
    9  votos: 0   link
    el 04-03-2009 01:42 UTC por CortoCircuito CortoCircuito
  5. #7   #1, #4, #5: Recurriendo a C, pero sabía que al final podría ignorar al compilador y asignar cero al puntero:

    #include <string.h>

    int main()
    {
    int a = 5;
    int *const ptr = &a;
    *ptr = 4;
    memcpy(ptr,0x0,sizeof(int*));
    }

    (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 :-P
    3  votos: 2   link
    el 04-03-2009 01:46 UTC por jmpep jmpep
  6. #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)
    179  votos: 21   link
    el 04-03-2009 02:19 UTC por Malversan Malversan
  7. #9   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
    14  votos: 1   link
    el 04-03-2009 02:28 UTC por pingON pingON
  8. #10   #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.
    11  votos: 0   link
    el 04-03-2009 02:48 UTC por Malversan Malversan
  9. #11   ooooooooh como extraño estas sentencias void * ((pft1)(int))[124];
    16  votos: 1   link
    el 04-03-2009 04:27 UTC por Bender Bender
  10. #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.
    80  votos: 9   link
    el 04-03-2009 05:03 UTC por damocles damocles
  11. #13   Tony Hoare multiplícate por NULL
    83  votos: 9   link
    el 04-03-2009 09:04 UTC por alexwing alexwing
  12. #14   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.
    15  votos: 1   link
    el 04-03-2009 09:43 UTC por elhumero elhumero
  13. #15   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 :-D :-D :-D :-D :-D , aunque tb puede superar como táctica al ya mitico "Hola,¿Conoces a Ted?"
    16  votos: 1   link
    el 04-03-2009 09:51 UTC por MycroftHolmes MycroftHolmes
  14. #16   #7 con ese memcpy no estás intentando asignar NULL a ptr. Prueba con

    (int*)ptr = NULL;
    24  votos: 2   link
    el 04-03-2009 10:07 UTC por --51021-- --51021--
  15. #17   NULL ese pequeño agujero negro de la informatica.. </zen>
    11  votos: 0   link
    el 04-03-2009 10:31 UTC por Markcial Markcial
  16. #18   #4 #6 #7 #11 #16 No os podeis imaginar cuan ignorante me siento leyendo vuestros comentarios xD
    7  votos: 0   link
    el 04-03-2009 10:42 UTC por Xday Xday
  17. #19   Tambien habia esta poesia inspirada por la entrevista al maestro bruce lee

    <quote>
    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...
    </quote>
    111  votos: 13   link
    el 04-03-2009 10:45 UTC por Markcial Markcial
  18. #20   Los punteros NULL son hermafroditas, se convierten en lo que haga falta.
    22  votos: 2   link
    el 04-03-2009 10:56 UTC por crowhunter crowhunter
  19. #21   y habeis conseguido que esto llegue a portada? con esos comentarios?? pero mira que sois frikiiiis

    (dicho con todo el amor del mundo :))
    15  votos: 1   link
    el 04-03-2009 11:05 UTC por mzneverdies mzneverdies
  20. #22   Pues no le perdono xD cuantos quebraderos de cabeza nos producen
    6  votos: 0   link
    el 04-03-2009 11:11 UTC por MAU MAU
  21. #23   #8 y no nos olvidemos de su hit "null pointer exception"!
    6  votos: 0   link
    el 04-03-2009 11:12 UTC por ciwi ciwi
  22. #24   No entiendo nada de lo que estoy leyendo en este hilo. Estupendo, eso significa que todavía hay esperanza para mi :-P.
    28  votos: 2   link
    el 04-03-2009 11:15 UTC por DexterMorgan DexterMorgan
  23. #25   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 ¬¬
    6  votos: 0   link
    el 04-03-2009 11:17 UTC por Hectronic0 Hectronic0
  24. #26   #24 Eres jefe de proyectos software de una gran multinacional ¿verdad?
    102  votos: 12   link
    el 04-03-2009 11:28 UTC por xamevou xamevou
  25. #27   #24 y para mi!! a mis brazos xD
    7  votos: 0   link
    el 04-03-2009 11:35 UTC por Neofito Neofito
  26. #28   No tengo nada en contra de los punteros a NULL.
    Pero odio los punteros que apuntan a basura y no son NULL :-P
    118  votos: 14   link
    el 04-03-2009 11:36 UTC por light light
  27. #29   Como me gustaría saber de que habláis... </HIletrado>
    6  votos: 0   link
    el 04-03-2009 11:49 UTC por casiVerde casiVerde
  28. #30   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
    46  votos: 5   link
    el 04-03-2009 11:51 UTC por --51021-- --51021--
  29. #31   A ver cuando pide perdón el que invento los ENCODING.
    6  votos: 0   link
    el 04-03-2009 11:53 UTC por bark bark
  30. #33   #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++? :-P
    28  votos: 3   link
    el 04-03-2009 12:09 UTC por karmaphobic karmaphobic
  31. #35   #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.
    9  votos: 0   link
    el 04-03-2009 12:16 UTC por light light
  32. #36   A mi no me parecen tan malos los punteros, es un gran poder, y en consecuencia una gran responsabilidad...
    42  votos: 4   link
    el 04-03-2009 12:18 UTC por yonni yonni
  33. #37   #31 Eso es como si los intérpretes pidieran perdón por preguntar "Do you speak english?" o "Parlez vous français?"
    6  votos: 0   link
    el 04-03-2009 12:21 UTC por karmaphobic karmaphobic
  34. #38   #28 Por eso Biarne Strustru se inventó el "Resource acquisition is initialization" y su amigo "Resource release is destruction".

    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.
    33  votos: 3   link
    el 04-03-2009 12:23 UTC por --29106-- --29106--
  35. #39   Ya lo dijo el sabio Bruce Lee:
    www.youtube.com/watch?v=OW-cnizLDEE

    "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."
    26  votos: 2   link
    el 04-03-2009 12:30 UTC por Malversan Malversan
  36. #41   Pues para mí NULL es como el 0 en las matemáticas, algo ineludible.
    23  votos: 2   link
    el 04-03-2009 12:45 UTC por karma_klassic_kontest karma_klassic_kontest
  37. #43   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...
    15  votos: 1   link
    el 04-03-2009 13:15 UTC por pacomix64 pacomix64
  38. #44   #30 Pues precisamente ése es un idioma bastante usado para implementar estructuras de datos:

    en.wikipedia.org/wiki/Sentinel_node

    así te evitas problemas con NULL, como desreferencias inválidas, "frees" incorrectos, etc.
    6  votos: 0   link
    el 04-03-2009 14:21 UTC por esteve.fernandez esteve.fernandez
  39. #45   El Pascal es tan aberrante que NULL es Nil !!
    14  votos: 1   link
    el 04-03-2009 14:42 UTC por Aladaris Aladaris
  40. #46   #41 El que inventó el 0, ese sí que la lió gorda!
    14  votos: 1   link
    el 04-03-2009 14:53 UTC por wardent wardent
  41. #47   #16 pues yo diría que sí :-S
    7  votos: 0   link
    el 04-03-2009 15:21 UTC por kaoD kaoD
  42. #48   Se me ha roto el frikómetro al leer los comentarios de este meneo.
    10  votos: 0   link
    el 04-03-2009 15:26 UTC por Enfurecido Enfurecido
  43. #49   #47 para asignar NULL al puntero con memcpy:

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

    memcpy(&ptr,&tmp,sizeof(int*));
    10  votos: 0   link
    el 04-03-2009 15:57 UTC por --51021-- --51021--
  44. #50   #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).
    8  votos: 0   link
    el 04-03-2009 17:49 UTC por elhumero elhumero
  45. #51   #50 jaja, aun me acuerdo de las prácticas con colas de Pascal.

    metecola, sacacola, metecola, vaciacola :-D :-D
    9  votos: 0   link
    el 05-03-2009 00:49 UTC por light light
  46. #52   #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?
    7  votos: 0   link
    el 05-03-2009 15:06 UTC por kaoD kaoD
  47. #53   #5 Te respondo con:

    String hola = null;
    if(hola.equals("zasentoalaboca")){
    ....
    ....
    }
    17  votos: 0   link
    el 05-03-2009 15:15 UTC por Irrelevanterrimo Irrelevanterrimo
  48. #54   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 :-)
    7  votos: 0   link
    el 05-03-2009 15:37 UTC por kaoD kaoD
comentarios cerrados

menéame