Introduzione
Java è stato utilizzato nei sistemi embedded come risposta al bisogno di un linguaggio di programmazione indipendente dalla piattaforma.
I sorgenti di Java (.java) vengono compilati in file binari (.class), chiamati file class, che contengono istruzioni codificate in un formato binario indipendente, il bytecode.
Il bytecode viene interpretato dalla Java Virtual Machine (JVM) che garantisce l’indipendenza del codice dalla particolare piattaforma hardware/software. La JVM rappresenta l’elemento centrale della tecnologia Java perché rende il bytecode portabile e perché consente di controllare la correttezza e la sicurezza del codice prima della reale esecuzione.
Le Java Cards sono sistemi embedded con un numero limitato di risorse su cui gira una versione “ridotta” della JVM, è quindi facile intuire che realizzare una verifica
“standard” on-card non sia una cosa fattibile con la tecnologia corrente, dato che il processo di verifica richiede un numero di risorse proporzionali alla complessità del metodo da verificare. Quindi, data l’impossibilità di una implementazione on-card, la verifica del bytecode viene effettuata off-card durante il processo di trasformazione delle applets in file CAP (Converted Applet).
La verifica del bytecode viene inoltre complicata dalla presenza delle subroutines.
Una subroutine è una parte di codice condiviso e rappresenta la traduzione dei blocchi finally di Java; attraverso l’uso di due istruzioni particolari, jsr (jump to subroutine) e ret (return from subroutine), il codice della subroutine diventa
“condivisibile” perché la chiamata a quel codice è parametrizzata.
In questo lavoro sono state affrontate le problematiche relative alle subroutines ed è stato implementato in Java un componente in grado di compiere una verifica delle subroutine ottimizzando la quantità di memoria richiesta durante la verifica.
INTRODUZIONE
La verifica si basa sul “concetto dell’ipd” , ovvero sul partizionamento in blocchi del bytecode e sulla dinamicità delle strutture dati.
La tesi è così strutturata:
• capitolo 1: analisi delle caratteristiche della piattaforma Java;
• capitolo 2: le Java Cards: ambiente operativo, problematiche relative alla realizzazione di un verificatore on-card e soluzioni proposte in letteratura;
• capitolo 3: analisi dell’algoritmo di verifica basato sull’ipd, caratteristiche del verificatore ipd e del BCEL;
• capitolo 4: analisi delle subroutinse e delle problematiche ad esse associate, descrizione delle regole e della soluzione adottata in questo lavoro;
• capitolo 5: implementazione di un verificatore che compie una verifica polivariante delle subroutines;
• capitolo 6: risultati ottenuti;
• capitolo 7: conclusioni e sviluppi futuri;
• appendice: descrizione formale delle regole del verificatore ipd;
• bibliografia.
viii