13 meneos
161 clics
Este envío tiene varios votos negativos. Asegúrate antes de menear
Efecto 2038: El nuevo "Efecto 2000"
Hay nueva fecha para el colapso de muchos dispositivos electrónicos y sistemas informáticos y será, según muchos expertos en la materia, cuando pasen 7 segundos de las 3:14 de la madrugada del martes 19 de enero del 2038. Resulta que el sistema tradicional de los sistemas operativos estableció el 1 de enero de 1970 como el momento en el que empezar la cuenta del calendario y desde ese momento del inicio de los tiempos (informáticos) hasta la fatídica fecha del 2038 habrán pasado justo 2.147.483.647 segundos.
|
comentarios cerrados
- Efecto 2038! Efecto 2038!...
Que recuerdos de adolescente, gritando la gente Efecto 2000.
Por otra parte Linus ya ha parcheado la versión de 32 bits de Linux para retrasar el problema tanto como en los sistemas de 64 bits, por lo que actualizando el kernel ya tienes arreglado el efecto 2038.
Nota: int "a secas" es de 32bit en la mayoría de plataformas de 32/64 bit
Afortunadamente, tal y como está hecho, en general es suficiente con recompilar el código, sin tener que tocar nada.
Castear `void*` a `int` es pecado.
Utiliza `uintN_t` Como debe ser.
void *loquesea = 40;
también lo es... Así que ya me dirás como lo hacemos si quiero hacer operaciones con punteros. Obviamente el puntero base será siempre un puntero concreto, pero el valor a sumar tiene que ir en un int o tipo similar.
Edito: acabo de probar, y como suponía, no se pueden sumar dos punteros. Luego NECESITAS usar un tipo entero para operaciones con punteros, y por eso es lógico que haya uno cuyo tamaño coincida con el de un puntero.
`(void*) + int` no se puede, tienes que darle tipo, por ejemplo `(uint8_t*) + int` es válido.
Y como `void*` acepta cualquier puntero, puedes hacer aritmética sin animaladas de puntero-a-int.
void* p = 0xDEADBEEF;
p = ((uint8_t*)p) + 1;
//^Cast de puntero-a-puntero es seguro
Y "de gratis" te permite incrementar con bytes, words, dwords o qwords cambiando el tipo del cast por 8,16,32,64..
Pero vamos a ver... es que eso NO es de lo que hablaba al principio. No se trata de sumar algo a un void, sino de qué usar para sumar algo a un puntero, o para recorrer un bloque. Si, por ejemplo, quiero recorrer un bloque de memoria byte a byte, teniendo un puntero a char, necesito utilizar una variable de tipo entero (sea del tamaño que sea) para llevar la cuenta, o para sumarle directamente (si, por ejemplo, quiero hacer acceso aleatorio en base a algún parámetro dentro del bloque de memoria). Esa variable debería tener, al menos, el mismo tamaño que un puntero (32 bits en un sistema de 32 bits, 64 bits en un sistema de 64 bits) para estar seguro de que siempre podré recorrer todo el bloque de memoria sea cual sea su tamaño. Ese es el problema. Por eso decía que tendría sentido que "int" (a secas) tuviese un tamaño dependiente de la arquitectura: porque así se podría usar ese tipo para esta clase de variables, y luego utilizar intXX_t o uintXX_t para cuando necesites un tamaño concreto.
¿Me he explicado por fin?
EDITO: en la práctica, para eso está el tipo size_t. Es a lo que me refería: un tipo para esta clase de operaciones. Pero en mi opinión debería poder hacerse con uno de los tipos estándar.
Por otro lado, piensa en un programa que tenga bastante tiempo, que se tenga que compilar contra librerías antiguas que no tengan versión de 64 bits, bien por que ya no se mantienen, o porque hubo un salto de versión sin compatibilidad hacia atrás.
Hay muchos casos en los que podría haber peoblemas, y si el programa es grande, hay que revisarlo y hacer todas las pruebas (de sistema, como mínimo), para poder confiar en el, aunque esté todo bien.
Además, no necesitas una variable de x tamaño para recorrer datos via puntero, tan solo necesitas saber el tamaño máximo a leer (otro requisito de software crítico) así que si vas a leer un máximo de +/- 32K, hasta un int16 te arregla hasta en una arquitectura de 64b