000093hu2Z_1E9lA.es.srt
Este video es la parte 1 del análisis estático de la función type_pointer del ejercicio 5, donde se analiza en detalle el comportamiento de los dos objetos creados en el heap: derived_example_1 y derived_example_2.
Constructor y retorno:
Se seteo el valor de retorno del constructor como derived_example_1* (siempre retorna this). Esto causó que Ghidra re-inferiera automáticamente los tipos de las variables que recibían ese retorno y las llamadas a través de la vtable se resolvieron correctamente.
function_counter (método de derived_example_1):
Recibe random como argumento. Tiene un loop do-while que itera hasta que un índice iguale a random. Los dos valores que setea en la estructura son:
random: el índice al final del loop vale random porque empieza en 0 y se incrementa hasta igualar.random * (random - 1): la multiplicación ocurre cuando el índice vale random - 1 (antes del último incremento).imprimir_case:
Toma random, lo divide por 3, y según el resto (0, 1, 2 o 3) imprime el case correspondiente.
get_random y get_valor_calculado:
get_random devuelve el campo random de la estructura (tipo u16).get_valor_calculado devuelve el campo random * (random-1) (tipo u32).Ambos valores se imprimen después de obtenerlos.
Objeto Nest (incrustado dentro de derived):
0x1337 que se setea en el constructor de Nest.imprimir_hello y only_test son métodos de Nest que se llaman pasándole el puntero nest_object como this.hello_from_derived se imprime carácter por carácter con un loop que avanza un char* hasta encontrar el nulo.buffer_20 contiene una string rara generada en el constructor de Nest que se imprime al final.Objeto derived_example_2 (segundo objeto en el heap):
Es casi idéntico a derived_example_1 pero con diferencias clave en la estructura:
| Campo | derived_example_1 |
derived_example_2 |
|---|---|---|
| Valor principal | random |
0x42 |
| Valor calculado | random * (random-1) |
0xBF (campo fijo) |
| Función única | No tiene | incrementar_0x42: suma 1 al campo 0x42 |
Por eso get_random en derived_2 devuelve 43 (0x42 + 1, porque incrementar_0x42 se ejecuta antes), y get_valor_calculado devuelve el campo 0xBF directamente.
Se creó la clase derived_2, su estructura, su vtable con 5 funciones (3 compartidas con derived_1: random, valor_calculado, imprimir_case; y 2 propias: incrementar_0x42 y destructor), y se renotó todo correspondientemente.
Destructores:
Ambos objetos se destruyen al final de type_pointer. El destructor recibe un flag como segundo argumento: si es distinto de 0, hace free del objeto. Internamente, cada destructor primero destruye el objeto Nest incrustado (mismo patrón: flag → free), y después hace free del derived correspondiente.