Rust: Quando il compilatore gioca a nascondino con la realtà

Rust: Quando il compilatore gioca a nascondino con la realtà

E se vi dicessi che il vostro miglior alleato, quello che vi impedisce di fare disastri con la memoria, ha appena ammesso di poter essere raggirato con un trucco da prestigiatore?

Per chiunque scriva in Rust, il ‘Borrow Checker’ è una sorta di tutore severo ma indispensabile. È lui che vi impedisce di accedere a dati che non esistono più, garantendo quella promessa di sicurezza che ha reso questo linguaggio il preferito dai sistemisti di tutto il mondo. Tuttavia, una recente discussione accesa su GitHub ha messo in luce una crepa nel muro: un problema di ‘unbound soundness’ (un termine che fa tremare i polsi a chiunque mastichi pointer).

Il cuore della questione risiede in un fenomeno chiamato ‘varianza’. In parole povere, la varianza decide come i tipi possono essere scambiati tra loro quando ci sono in gioco dei parametri di durata (i famosi ‘lifetimes’). Il bug scoperto è un vero e proprio ‘glitch’ nella matrice: attraverso un uso astuto di strutture dati e operazioni di swap, era possibile ingannare il compilatore, convincendolo che un riferimento a un dato temporaneo fosse in realtà un riferimento ‘statico’, ovvero eterno.

Immaginate di avere una scatola che dichiarate essere sigillata per sempre. Il compilatore vi crede e vi permette di passarla a un thread separato che vivrà molto più a lungo della scatola stessa. Ma se dentro la scatola c’è un oggetto che decade dopo due secondi, il risultato è il caos: un crash, un dato corrotto, o peggio, un comportamento imprevedibile che vanifica tutto il senso di usare Rust.

Nonostante la gravità dell’issue, la community ha reagito con la solita efficienza. I manututori hanno identificato il problema e, sebbene la discussione sia stata temporaneamente ‘bloccata’ per evitare che il thread degenerasse in uno scontro di ego (succede, specialmente quando si parla di bug critici), la direzione è chiara. Una patch è già in fase di test per impedire che questi ‘trucchetti’ passino inosservati.

Per noi sviluppatori, che spesso ci affidiamo a queste astrazioni per dormire sonni tranquilli, questa notizia non è un motivo di panico, ma un promemoria: la perfezione non esiste, ma la capacità di correggere gli errori è ciò che rende Rust un linguaggio di classe superiore. Il ‘muro’ è stato scosso, ma sta già venendo rinforzato.

Source: 11 year old unsoundness bugs found in Rust borrow checker

Lascia un commento