Según un informe publicado por Microsoft , el 70% de los bugs corregidos en su productos se deben a problemas con el uso de la memoria. Rust está diseñado para tener un acceso seguro a la memoria por lo que su adopción supondría una mejora importante en la calidad del software de Microsoft,. Otras empresas, además de Mozilla, que han adoptado Rust recientemente son Cloudflare, Dropbox, y Brave browser.
|
etiquetas: microsoft , mozilla , rust , seguridad , memory leak , memory safe
Y no, no soy fanboy de microsoft.
¿Revisar un poco el código no podría ayudar también?
Y no, no soy fanboy de microsoft.
El negocio del software no está en el desarrollo; sino en el mantenimiento. La pasta ha estado ahí de toda la vida.
Para mi es el lenguaje del futuro.
Puedes dar muchísimas clases de C o C++, pero por el hecho de subestimar la complejidad de los proyectos en esos lenguajes, parece que sólo has hecho programas sencillos.
En cualquier caso las últimas versiones de C++ han añadido muchas ayudas al control de memoria para poder evitar y, si es necesario, localizar más fácilmente las fugas de memoria y las violaciones de acceso a memoria.
Si trabajases en cualquier proyecto real de una mínima complejidad sabrías que es inevitable que se produzcan errores. La cantidad de cosas que hay que tener en cuenta es tan grande que es normal que alguna se te escape.
Tú dices que invirtiendo lo suficiente consigues eliminar todos los errores y no es así, nunca se podrán eliminar todos porque siempre habrá casos que ni en los diferentes test que tenga que revisar el equipo de calidad se hayan ni siquiera planteado y solo se descubren casualmente por el usuario número 10 millones que tiene una configuración especial que nadie podía imaginar que alguien pudiera tener.
O incluso porque unos años más tarde de su desarrollo, sale un nuevo hardware con requisitos especiales (pasar de un núcleo a varios, discos duros ssd, ...), o también los cambios en el software sobre el que se instalará el tuyo puede tener cambios imposibles de predecir (nuevo sistema de archivos, cambios en los Apis, marcos de trabajo, etc)
Por lo tanto, como en cualquier ingeniería, tienes que buscar el coste óptimo en el equipo de calidad, qué además necesitas tenerlo ocupado el máximo de tiempo posible. Y no, aunque te gastases el 99,9999999% del presupuesto del proyecto en calidad conseguirías un software libre de errores.
Mención especial para #26 y el resto. Gracias por participar.
Mejor nombraría los smart pointer en general, el shared es un tipo de ellos si, como su nombre indica, lo quieres compartir.
En un proyecto mínimamente grande donde mete mano mucha gente y con cierta antigüedad eso que dices no tiene sentido, simplemente son aplicaciones con una cantidad de código heredado que es imposible controlar las consecuencias de muchos cambios, si usas ahi la política de despidos que dices, no solo no mejorarás la calidad del software, si no que la gente bajo presión será mas propensa a cometer errores o incluso dejará el puesto en cuanto pueda, sumiéndote en una espiral de baja calidad por falta de experiencia (nadie experimentado querrá trabajar ahi asi que se irán y tendrás que contratar novatos)
Y windows justo es un proyecto enorme, con cientos de personas tocando y una antigüedad de décadas.
Me temo que no basta con "suspender" a la gente.
marc.info/?l=openbsd-cvs&m=121553004431393&w=2
#37 Pues, a juzgar por la calidad de algunos de sus productos, yo diría que a lo mejor sí.
Lo mismo nunca has estado en un proyecto de construcción de software, pero, como ya ha comentado más gente, las prioridades no suelen ser contratar gente con mucha experiencia codificando, ni aplicar metodología de medición de calidad, ni mucho menos revisar lo construido.
Ahora, gente que habla de cosas que no entiende, aquí y en los proyectos hay muchos.
Os recuerdo que no todos los proyectos software son vuestras prácticas de la universidad de 2000 líneas monohilo. Que tengáis alumnos imbéciles no significa que en Microsoft cometan ese tipo de errores.
Y no, los smart pointers no suplen al borrow checker.
Y aún así Rust es mucho más que sus características de seguridad. Es un lenguaje muy cómodo de usar y su semántica es más parecida a Python que a C, pero con las características de rendimiento de un lenguaje de sistemas.
Simplemente el tipo del que hablas no ha tirado un proyecto que no sea una práctica de la universidad en su vida.
Ya les gustaría a muchos listos de aquí pasar una entrevista para entrar en Microsoft ganando 150k de entrada.
Por un lado tenemos la validacion de parametros recibidos, que cada comprobación puede ser un return en caso de error tras el seteo del error.
Por otro lado una funcion invoca a otras funciones cuyo valor devuelto puede ser un error y se debe terminar a la recepción del mismo la ejecución.
Una función con un "return" solo se ve en la Universidad. En la vida real no existen.
Antes de salir hay que liberar la memoria, o asegurarte de pasar aguas arriba el puntero a la misma (para que lo liberen cuando sea necesario).
El problema de mandarlo aguas arriba es que el programador aguas arriba debe saber que ese puntero recibido debe ser liberado y a veces son dos programadores distintos y se termina leakeando memoria (reservandola pero no liberandola...)
Pero el problema fundamental está en los buffer overflows y buffer overruns. Antiguamente existían funciones para copiar memoria de un sitio a otro, pero era responsabilidad del programador asegurarse que lo que estabas copiando "entraba" en el sitio de destino. De ahí el mítico Malloc para reservar la memoria justa. Pero claro, muchos programadores las usaban y usan incorrectamente, la cadena de origen no cabe en el hueco destino y comienza a escribir machacando datos contiguos en la memoria.
Para solventar esto, se crearon otras funciones de copia de cadenas que te obliga a decir cuantos elementos deben ser copiados. Esto obligaba a los desarrolladores a pensar en el tamaño de la copia, y se reducía el problema del overflow. O peor, el desarrollador pasaba de querer contar y usaba las funciones de copia de cadenas antiguas que no le obligaba a pasar este parámetro.
Los fallos en overflow que he visto...se cuentan por miles...y una razón es que algunas de estas funciones de copia seguras utilizan como parámetro el número de caracteres a copiar, y otras el tamaño en bytes a copiar. Cuando se utilizan cadenas tipo Char, coinciden el numero de bytes con el numero de elementos de la cadena. Pero si utilizas Wchar, el numero de bytes es el doble del numero de elementos dr la cadena.
Si utilizas una funcion de copia para copiar una cadena Wchar con 6 elementos, y resulta que pasas el numero de bytes (12) en vez del numero de caracteres (6) que utiliza el numero de caracteres como parametro....pues estás haciendo un overflow de 6.
Lo mismo pasa con las funciones de lectura, pero aqui basicamente lo que haces es un overrun...es decir...leer 12 caracteres en vez de 6. Leyendo 6 elementos de la memoria contigua que no tiene nada que ver la cadena.
O peor, hacer un underrun, si en una funcion que espera el numero de bytes a leer(12), le pasas el numero de elementos (6). Como se ha pasado 6, entiende que realmente son 6 bytes, 3 elementos. Y te deja 3 sin copiar.
Los underrun son menos peligrosos....y faciles de detectar. Pero los overflow...trackearlos son jodidos....
Ahora ya existen herramientas como Coverity que ayudan bastante en este campo.
(CC #7)
Sin embargo, Rust tiene, a nivel de lenguaje, directivas para que el programador indique la inmutabilidad de una variable y la capacidad de mutar los parámetros recibidos. Eso le da al compilador una información preciosa para saber cómo debe gestionar esa memoria o detectar accesos prohibidos.
Y a poco que hayas trabajado en el mundo de desarrollo te habrás dado cuenta que revisar no es la opción más popular entre no pocos responsables de proyecto (como en todos los sitios, vamos). Lo que monda dinero y solo da calidad muchas veces se minusvalora.
Si has llegado a una conclusión distinta, creo que no has vivido una situación similar.
Pensaba que estaba solo en esta lucha por evitar la desaparición del castellano.
Ojo que no te estoy atacando, probablemente incluso lo de dar clases lo hagas después de salir de currar programando. Solo puntualizo que el hecho de dar clases no da más valor a tu comentario.
Que lo parcheas y solucionas esa situación pero es lo que dices, es imposible no cometer fallos
Por cierto, el nucleo de NT y en general lo de kernel, esta bastante pero bastante bien hecho, salvedades de pilas de drivers como WFP y demas, que ha ido cambiando y al principio siempre estan algo incompletos, pero en general NT es codigo de bastante calidad. Si que ultimamente, dicen, parece que les cuesta encontrar relevo para desarrollo de kernel, y si ha habido criticas de los dentro al resoecto, pero es mas critica al volumen y complejidad que a la calidad del codigo.
Ventajas de los lenguajes modernos.
> Al fin y al cabo Rust lo que implementa son las semánticas de mover y el chequeo estático que lo asegure.
Ah bueno, si "solo" implementa eso...
> Therefore, a good practice in C++ is to avoid using move in the case like this, even if this means unnecessary deep copy of the value, to avoid the accidental usage of the moved value.
Nada más que decir.
> Con metaprogramación
En Rust es algo nativo.
> Es cuestión de tiempo que el estándar integre la funcionalidad.
Hablemos entonces.
> Como siempre, opcional.
O mejor no.
> Crítica a Rust:
www.reddit.com/r/rust/comments/5295nf/why_im_dropping_rust/
> Que Rust utiliza semánticas de movimiento siempre, y no es bueno usarlas siempre.
No. Lo que te está diciendo es que C++ es semejante mierda que la práctica recomendada es tremendamente ineficiente.
In C++, it is possible to accidentally use moved value. Therefore, the move operations usually set the original container size to zero.
> Y eso un coñazo porque no lo puedes desactivar.
O dicho de otro modo "déjame introducir bugs en producción que yo sé lo que hago".
> Contigo no hay nada que hablar.
Lo dice el del argumentazo de "no entiendes C++".
> es que ni tan siquiera entiendes como funciona una arquitectura Von Neumann.
¿Puedes explicarte? No veo qué tiene que ver.
> Eso lo dice alguien que utiliza un lenguaje con anotaciones para una de sus características fundamentales (ciclos de vida).
Un error con tus lifetimes solo puede generar más restricciones, no menos. Por su naturaleza no puedes introducir bugs. Como mucho harás que tu código no compile por haber hecho una restricción demasiado fuerte.