Concetti Chiave
- Durante la chiamata a funzione, il caller posiziona gli argomenti sullo stack e salva l'indirizzo di ritorno, passando il controllo al callee.
- Il callee gestisce le variabili locali e i registri, eseguendo le istruzioni e restituendo il valore finale al caller.
- Gli argomenti vengono passati da destra a sinistra, con il primo argomento in cima allo stack, facilitando la gestione di funzioni variadiche.
- Il ripristino dello stack dopo la chiamata da parte del caller può aumentare la dimensione dell'eseguibile, influenzando le prestazioni.
- I problemi comuni nella gestione dello stack includono lo stack overflow e lo stack buffer overflow, che possono causare crash del programma e vulnerabilità di sicurezza.
Indice
Processo di chiamata a funzione
Quando avviene una chiamata a funzione accade:
- il caller posiziona gli argomenti da passare alla funzione chiamata calee sullo stack o in determinati registri della CPU
- il caller salva l’indirizzo di ritorno sullo stack
- il caller passa il controllo al callee
- il callee salva le variabili locali sullo stack
- il callee salva il contenuto di alcuni registri nello stack, da ripristinare al termine della chiamata
- il callee esegue le istruzioni
Al termine dell’esecuzione:
- il callee posiziona il valore di ritorno nei registri del processore o altri spazi di memoria
- il callee ripristina lo stato dei registri salvati sullo stack
- gli argomenti vengono rimossi dallo stack e viene aggiornato lo stack pointer
- il controllo passa al caller
Gestione degli argomenti e dello stack
Gli argomenti sono passati da destra a sinistra:
- perciò il primo argomento è in cima allo stack
- permette di gestire le funzioni variadiche
Il caller ripristina lo stack dopo la chiamata:
- la dimensione dell’eseguibile aumenta, dato che il ripristino dello stack avviene per ogni chiamata a funzione
- si possono gestire le chiamate a funzioni variadiche, per questo tipo di funzioni solo il caller e a conoscenza del numero di argomenti da passare mentre il callee potrebbe non esserlo
Problemi comuni nella gestione dello stack
Problemi nella gestione dello stack:
- stack overflow: la dimensione della memoria condivisa da heap e stack e fissata al momento dell’avvio del programma, se viene richiesta troppa memoria nello stack, c’e uno stack overflow, che solitamente causa il crash di u programma (es. funzioni ricorsive profonde, variabili ingombranti)
- Stack buffer overflow: il programma scrive dati sul record di attivazione al di fuori dello spazio riservato ad essi. Succede solitamente per distrazioni del programmatore e dall’uso delle funzioni di libreria che non eseguono i controlli di sicurezza sulle dimensioni dei dati, queste falle vengono sfruttare per attacchi informatici (vengono sovrascritti indirizzi di ritorno nel record di attivazione per
eseguire il codice malevolo).
Domande da interrogazione
- Qual è il processo di chiamata a funzione e quali sono i passaggi principali?
- Come vengono gestiti gli argomenti nello stack durante le chiamate a funzione?
- Quali sono i problemi comuni nella gestione dello stack?
Durante una chiamata a funzione, il caller posiziona gli argomenti sullo stack, salva l'indirizzo di ritorno, passa il controllo al callee, che a sua volta salva le variabili locali e i registri. Al termine, il callee restituisce il valore e ripristina lo stato dei registri, prima che il controllo torni al caller.
Gli argomenti sono passati da destra a sinistra, con il primo argomento in cima allo stack. Questo metodo consente di gestire funzioni variadiche, dove solo il caller conosce il numero di argomenti da passare, mentre il callee potrebbe non esserne a conoscenza.
I problemi principali includono lo stack overflow, che si verifica quando si richiede troppa memoria nello stack, e lo stack buffer overflow, dove il programma scrive dati al di fuori dello spazio riservato, potenzialmente sfruttato per attacchi informatici.