2016-08-09 51 views
4

In der GCC cdecl Aufrufkonvention, kann ich mich darauf verlassen, dass die Argumente, die ich auf den Stapel geschoben habe, dieselben sind, nachdem der Aufruf zurückgegeben wurde? Auch beim Mischen von ASM und C und mit Optimierung (-O2) aktiviert?Kann ich in der CDECL-Aufrufkonvention die Argumente, die ich auf den Stapel geschoben habe, wiederverwenden?

+0

Es ist völlig in Ordnung, wenn eine C-Funktion ihre nichtkonstanten Argumente ändert, also nein. – Michael

+0

@Michael: Der ABI sagt nichts über 'const' Args. Es ist eine Kompilierungszeit auf Quellenebene, die nicht Teil der ABI ist. Das ist etwas bedauerlich, da Compiler die Arg-Passing-Slots kaum als Scratch-Space ausnutzen, sondern immer davon ausgehen, dass die Daten verfälscht sind. –

Antwort

4

In einem Wort: Nein

diesen Code vor:

__cdecl int foo(int a, int b) 
{ 
    a = 5; 
    b = 6; 
    return a + b; 
} 

int main() 
{ 
    return foo(1, 2); 
} 

Dieser diese asm Ausgabe erzeugt (kompiliert mit -O0):

movl $5, 8(%ebp) 
movl $6, 12(%ebp) 
movl 8(%ebp), %edx 
movl 12(%ebp), %eax 
addl %edx, %eax 
popl %ebp 
ret 

So ist es durchaus möglich, eine __cdecl-Funktion, um auf die Stack-Werte zu stampfen.

Das ist nicht einmal die Möglichkeit der Inlining oder andere Optimierung Magie, wo Dinge nicht auf dem Stapel an erster Stelle landen gezählt.