2015-05-16 7 views
8

Così ho questo codice C:argomento printf Mysterious durante lo smontaggio programma c

#include <stdio.h> 

int main(void) 
{ 
    int a; 
    int b; 
    int c; 

    a=b=c=5; 

    printf("Hi%d%d%dHi",a,b,c); 
} 

ho compilato su Ubuntu con:

gcc program.c -o program -ggdb -m32 -O2 

E poi smontato con:

objdump -M intel program -d 

E in main printf() viene chiamato in questo modo:

mov DWORD PTR [esp+0x10],0x5 
mov DWORD PTR [esp+0xc],0x5 
mov DWORD PTR [esp+0x8],0x5 
mov DWORD PTR [esp+0x4],0x8048500 
mov DWORD PTR [esp],0x1 
call 8048330 <[email protected]> 

Quello che mi chiedo in questo momento è ciò che questo significa:

mov DWORD PTR [esp],0x1 

so che cosa le prime 4 istruzioni MOV sono per, ma non riesco proprio a capire perché un '1' viene spinto su lo stack. Anche questo movimento si verifica solo quando l'ottimizzazione è attiva. Qualche idea?

risposta

6

La libreria GNU C (glibc) utilizzerà __printf_chk anziché printf se (o il compilatore) definisce _FORTIFY_SOURCE e l'ottimizzazione è abilitata. La versione della funzione _chk si comporta esattamente come la funzione che sostituisce eccetto che è supposta per check for stack overflow e forse può validare gli argomenti. Il primo argomento in più indica quanto controllo e convalida dovrebbero verificarsi.

Guardando il actual glibc implmenation sembra che non faccia alcun controllo aggiuntivo su ciò che il compilatore fornisce automaticamente (e quindi non dovrebbe essere necessario) e la validazione degli argomenti è minima. Verificherà che %n viene visualizzato solo nelle stringhe di formato di sola lettura e controlla che, se vengono utilizzati gli specificatori di argomento speciale , vengano utilizzati per tutti gli argomenti senza spazi.