Biorąc fragment kodu:W jaki sposób odniesienie do print-a (var-arg) współdziała z układem pamięci stosu?
int main()
{
printf("Val: %d", 5);
return 0;
}
jest jakaś gwarancja, że kompilator będzie przechowywać "Val: %d"
i '5'
ciągły? Na przykład:
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| ... | %d | ' ' | ':' | 'l' | 'a' | 'V' | '5' | ... |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
^ ^ ^
| Format String | int |
Dokładnie jak te parametry są przydzielane w pamięci?
Co więcej, czy funkcja printf uzyskuje dostęp do int w stosunku do łańcucha formatu lub do wartości bezwzględnej? Tak na przykład w danych
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| ... | %d | ' ' | ':' | 'l' | 'a' | 'V' | '5' | ... |
+-----+-----+-----+-----+-----+-----+-----+-----+-----+
^ ^ ^
| Format String | int |
gdy funkcja napotka %d
będzie tam już zapisany adres pamięci dla pierwszego parametru funkcji, które byłyby odwołania lub będzie wartość jest obliczana w stosunku do pierwszego elementu ciąg formatu?
Przepraszam, jeśli mam być mylące, moim głównym celem jest, aby zrozumieć ciąg wyczyny formatowania, gdzie użytkownik może dostarczyć ciąg formatu w sposób opisany w niniejszym dokumencie
http://www.cis.syr.edu/~wedu/Teaching/cis643/LectureNotes_New/Format_String.pdf
Moje obawy pojawiają się na atak opisany na stronie 3 i 4. Doszedłem do wniosku, że %x
mają pominąć 16 bitów, które przechwytuje ciąg znaków, co wskazywałoby, że funkcja przydzielona jest w sposób ciągły i odwołuje się względnie, ale inne źródła wskazują, że nie ma gwarancji, że kompilator musi przydzielać w sposób ciągły i byłem zaniepokojony, że artykuł był uproszczeniem.
Cóż, z jednej strony, łańcuch format nie jest stor ed na stosie. –
Dzięki. Naprawiono pytanie. – user2985955
Te notatki z wykładów są okropne. Cały świat nie jest i386. Jeśli chodzi o C, może nie być nawet stosu. – user464502