Historia de la pregunta: El lenguaje C siempre ha sido flexible en cuanto a la conversión de tipos, para facilitar el trabajo con memoria de bajo nivel y diferentes plataformas. Sin embargo, su concisión y potencia pueden conducir fácilmente a vulnerabilidades y defectos relacionados con la conversión de tipos incorrecta, especialmente al trabajar con punteros y aritmética bit a bit.
Problema:
Solución:
Ejemplo de código:
#include <stdio.h> void print_double_as_int(double d) { int i = (int)d; printf("Valor: %d\n", i); } void *ptr = malloc(16); int *ip = (int*)ptr; // Acceso a memoria raw: permitido si ptr realmente apunta a un int
Características clave:
1. ¿Cuándo es segura la conversión de void a un puntero a una estructura, y siempre es segura?*
Esta conversión es segura si la dirección realmente apunta a una instancia de esa estructura, de lo contrario el comportamiento es indefinido.
2. ¿Qué pasará si se convierte un puntero a una estructura de cierta longitud a un puntero a una estructura con menos o más campos?
Acceder a los campos de la "nueva" estructura resultará en lectura/escritura fuera de los límites de la estructura original, posiblemente corrompiendo datos.
Ejemplo de código:
typedef struct {int a;} S1; typedef struct {int a; int b;} S2; S1 s; S2 *ps2 = (S2*)&s; // ps2->b — acceso a "basura"
3. ¿Es seguro convertir un puntero a int a un puntero a char para acceder a los bytes de ese número?
Es una de las técnicas típicas de trabajo con memoria; el acceso por bytes es permitido, pero requiere precaución, ya que pueden surgir problemas de alineación y el orden de los bytes depende de la arquitectura (big-endian/little-endian).
Un programador junior, para optimizar el tiempo de acceso, manejó un paquete de red convirtiendo un puntero de un array raw a un puntero a una estructura de datos con campos de diferentes tipos.
Ventajas:
Desventajas:
Después de la revisión, cada byte del paquete se extrajo manualmente a través de memcpy.
Ventajas:
Desventajas: