""" Llama a load_model() de la libc_wrapper.dll recien compilada sobre el fichero .surml malicioso (malicious_nul_name.surml, generado por craft_malicious_surml.py) para confirmar si el proceso aborta (Candidato 1 de focus-02-c-wrapper-ffi.md) en vez de devolver un FileInfo con is_error=1. Se ejecuta como proceso HIJO separado (ver run_trigger.py) precisamente porque si el bug es real, este proceso Python entero morira sin excepcion capturable. """ import ctypes from ctypes import Structure, c_char_p, c_int import os DLL_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "repo", "target", "release", "c_wrapper.dll")) class FileInfo(Structure): _fields_ = [ ("file_id", c_char_p), ("name", c_char_p), ("description", c_char_p), ("version", c_char_p), ("error_message", c_char_p), ("is_error", c_int), ] lib = ctypes.CDLL(DLL_PATH) lib.load_model.argtypes = [c_char_p] lib.load_model.restype = FileInfo print("Antes de load_model() -- si el proceso muere aqui sin imprimir la linea de abajo, " "confirma el abort no capturable.") outcome = lib.load_model(os.path.abspath("malicious_nul_name.surml").encode("utf-8")) print("DESPUES de load_model() -- NO abortó.") print(f"is_error={outcome.is_error}") if outcome.is_error: print(f"error_message={outcome.error_message.decode('utf-8', errors='replace')}") else: print(f"file_id={outcome.file_id}, name={outcome.name}")