what c/c++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf ·...

45
What C/C++ programmers need to understand about the call stack and heap Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/ ~ hxt March 24, 2017 Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/ ~ hxt 1

Upload: others

Post on 10-Aug-2021

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

What C/C++ programmers need to understandabout the call stack and heap

Hayo ThieleckeUniversity of Birmingham

http://www.cs.bham.ac.uk/~hxt

March 24, 2017

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 1

Page 2: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Some examples of stack problems

The call stack in C

Call by reference and pointers into stack frames

Good and bad examples of stack access

Function pointers on the stack

C++ lambda expressions and stack variables

A taste of compiling

Compiling structures and objects

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 2

Page 3: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

An example from student discussion: what is the problem?

#include <stdlib.h>

struct s { int x; int y; };

void f(struct s *p)

{

p = malloc(sizeof(struct s));

}

int main()

{

struct s *p;

f(p);

free(p);

}

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 3

Page 4: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

An example from student discussion: valgrind

void f(struct s *p)

{

p = malloc(sizeof(struct s));

}

int main()

{

struct s *p;

f(p);

free(p);

}

==23446== LEAK SUMMARY:

==23446== definitely lost: 8 bytes in 1 blocks

[...]

==23446== 1 errors in context 1 of 1:

==23446== Conditional jump or move depends on uninitialised value(s)

==23446== at 0x4A063E3: free (vg_replace_malloc.c:446)

==23446== by 0x400549: main (fbe2017.c:16)Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 4

Page 5: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Fixed with more pointers

void f(struct s **q)

{

*q = malloc(sizeof(struct s));

}

int main()

{

struct s *p;

f(&p);

free(p);

}

==23527== HEAP SUMMARY:

==23527== in use at exit: 0 bytes in 0 blocks

==23527== total heap usage: 1 allocs, 1 frees, 8 bytes allocated

==23527==

==23527== All heap blocks were freed -- no leaks are possible

==23527== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 5

Page 6: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Two bugs for the price of one

The same memory management bug may have two consequences:what should have been freed has not ⇒ memory leakinstead, something else gets freed ⇒ memory errorValgrind reports them separately

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 6

Page 7: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Solution

All problems in computer science can be solved byanother level of indirection.

David Wheeler

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 7

Page 8: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Fixed with C++ references

struct s { int x; int y; };

void f(struct s *&q)

{

q = new s;

}

int main()

{

struct s *p;

f(p);

delete p;

}

Here p is passed by reference.

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 8

Page 9: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Code often seen in exams

#include <stdlib.h>

int main()

{

struct s x;

// ...

free(&x);

}

==23655== Invalid free() / delete / delete[] / realloc()

==23655== at 0x4A06430: free (vg_replace_malloc.c:446)

==23655== by 0x4004C3: main (in /home/staff/hxt/code/c/c-plus-plus/free-local)

==23655== Address 0x7fefffa1c is on thread 1’s stack

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 9

Page 10: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Code often seen in exams

#include <stdlib.h>

int main()

{

struct s x;

// ...

free(&x);

}

==23655== Invalid free() / delete / delete[] / realloc()

==23655== at 0x4A06430: free (vg_replace_malloc.c:446)

==23655== by 0x4004C3: main (in /home/staff/hxt/code/c/c-plus-plus/free-local)

==23655== Address 0x7fefffa1c is on thread 1’s stack

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 10

Page 11: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

The call stack and C

I in C/C++, you need to understand how the language works

I we have seen the malloc/free on the heap, valgrind

I another part of memory is the (call) stack

I in C/C++ you can get memeory errors by misusing the stack

I (almost) all languages use a call stack

I understanding the stack is useful CS knowledge independentof C

I in compiling, stacks are central

I in OS, you have multiple call stacks

I buffer overflows target the call stack (and also heap)

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 11

Page 12: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Stack frame details

The details differ between architectures (e.g., x86, ARM, SPARC)Ingredients of stack frames, in various order, some may be missing:return addressparameterslocal varssaved frame pointercaller or callee saved registersstatic link (in Pascal and Algol, but not in C)this pointer for member functions (in C++)

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 12

Page 13: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Naive calling convention: push args on stack

Push parametersThen call function; this pushes the return addressThis works.It makes it very easy to have variable number of arguments, likeprintf in C.But: stack is slow; registers are fast.Compromise: use registers when possible, “spill” into stackotherwiseOptimzation (-O flags) often lead to better register usage

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 13

Page 14: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Call stack: used by C at run time for function calls

Convention: we draw the stack growing downwards on the page.Suppose function g calls function f.

...

parameters for g

return address for g

automatic variables in g

frame for g

parameters for f

return address for f

automatic variables in f

frame for f

There may be more in the frame, e.g. saved registers

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 14

Page 15: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Call stack: one frame per function call

Recursion example: fac(n) calls fac(n - 1)

...

2 argument

return addressframe for fac(2)

1 argument

return addressframe for fac(1)

0 argument

return addressframe for fac(0)

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 15

Page 16: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Call stack example code

int f(int x, int y) // parameters: x and y

{

int a = x; // local variables: a and b

int b = y;

return a + b;

}

int g()

{

char s[] = "abc"; // string allocated on call stack

int c = 10;

return f(c, c + 2);

}

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 16

Page 17: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Call stack example

...

return address for g

abc\0 s

10 c

frame for g

12 y

10 x

return address for f

10 a

12 b

frame for f

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 17

Page 18: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Call by value and pointers

Call by value implies that a function called with a pointer gets acopy of the pointer.What is pointed at is not copied.

p = malloc(N);

...

int f(char *q) { ... }

f(p)

Stack Heap

...

•p

...•q

...

N bytes

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 18

Page 19: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Call by value modifies only local copy

void f(int y)

{

y = y + 2; // draw stack after this statement

}

void g()

{

int x = 10;

f(x);

}

......

10x

. . .

. . .

12y

...

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 19

Page 20: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Call by reference in C = call by value + pointer

void f(int *p)

{

*p = *p + 2; // draw stack after this statement

}

void g()

{

int x = 10;

f(&x);

}

......

12x

. . .

. . .

•p

...

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 20

Page 21: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Call by reference in C++

void f(int &r) // only C++, NOT the same as & in C

{

r = r + 2; // draw stack after this statement

}

void g()

{

int x = 10;

f(x); // the compiler passes x by reference

}

......

12x

. . .

. . .

•r

...

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 21

Page 22: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Pointers vs references

For a pointer p of type int* , we have both

p = q; // change where p points

*p = 42; // change value at the memory that p points to

For a reference r of type int&, we can only write

r = 42; // change value at the memory that r points to

So references are less powerful and less unsafe than pointers.

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 22

Page 23: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Reference types in C++

It is a little confusing that the same symbol is used for the addressoperator in C and the reference type constructor in C++.

int *p = &a; // & applied to value a in C

void f(int &r); // & applied to type int in C++

C++ is more strictly typed than C: all parameters type must bedeclared.

int main() ... // OK in C, not C++

One reason is that the C++compiler must know which parametersare call-by-referenceIn C, all functions are call-by-value; the programmer may need toapply & when calling to pass by-reference

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 23

Page 24: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Returning pointer to automatic variable

int *f()

{

int a = 2;

return &a; // undefined behaviour

}

void g()

{

int *p;

p = f(); // draw stack at this point

printf("%d\n", *p); // may print 2, but it is undefined

}

......

•p

. . .

. . .

2a

...Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 24

Page 25: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

C strings are passed as pointers

void f(char *p) { ... };

char str[] = "abc";

f(str);

Stack...

•p

......

abc\0

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 25

Page 26: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

scanf and &

We pass the addresses of local variables to scanf:

void inputadd()

{

int x, y;

printf("Please enter two integers:\n");

scanf("%d", &x);

scanf("%d", &y);

printf("sum = %d\n", x + y);

}

This is fine as far as the stack goesBut: no bounds checking! Do not use scanf on untrusted input

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 26

Page 27: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Good idea, bad idea?

void f()

{

int x;

g(&x);

}

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 27

Page 28: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Good idea, bad idea?

int *f()

{

int x;

return &x;

}

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 28

Page 29: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Good idea, bad idea?

int *f()

{

int *p = malloc(sizeof(int));

return p;

}

What is the scope of p?What is the lifetime of p?What is the lifetime of what p points to?

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 29

Page 30: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Good idea, bad idea?

void f()

{

int x;

int **p = malloc(sizeof(int*));

*p = &x;

}

What is the scope of p?What is the lifetime of p?What is the lifetime of what p points to?

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 30

Page 31: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Good idea, bad idea?

int x;

free(&x);

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 31

Page 32: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Pointers to and from stack and heap, dos and don’ts

from newer to older stack frame: pointer passed to but notreturned from functionfine, that is how scanf works

from older to newer stack frame: pointer to auto var returnedfrom function:usually bad, stack frame may been reused

from heap to stack: usually bad, as stack frame may be reused atsome point

from stack to heap: usually fine, unless freed to soon

from heap to heap: usually fine, unless freed to soone.g. linked list in heap

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 32

Page 33: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Function pointer as function parameter

void g(void (*h)(int))

{

int x = 10;

h(x + 2);

}

void f(int y) { ... }

... g(f) ...

...

• h

10 xg

12 yf

code for f

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 33

Page 34: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Non-executable stack and buffer overflow

I Function pointers can be on the call stack

I Code (compiled binaries) is not on the C call stack

I ⇒ buffer overflow defence:non-executable stack, sometimes called W^X

I attacker could write binary into an array on the call stack

I attacker overwrites return address to point to injected code

I But: jumping to the injected code crashes due tonon-executable permission

I classic attack from “Smashing the Stack for Fun and Profit”no longer works

I “return-oriented programming” attacks use only pointers onthe stack

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 34

Page 35: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Lambdas and stack variables, capture by value

function<int()> seta()

{

int a = 11111 ;

return [=] () { return a; };

}

int geta(function<int()> f)

{

int b = 22222;

return f();

};

What does this print:

cout << geta(seta()) << endl;

It prints 11111.

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 35

Page 36: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Lambdas and stack variables, capture by value

function<int()> seta()

{

int a = 11111 ;

return [=] () { return a; };

}

int geta(function<int()> f)

{

int b = 22222;

return f();

};

What does this print:

cout << geta(seta()) << endl;

It prints 11111.Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 36

Page 37: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Lambdas and stack variables, capture by reference

function<int()> seta()

{

int a = 11111 ;

return [&] () { return a; };

}

int geta(function<int()> f)

{

int b = 22222;

return f();

};

What does this print:

cout << geta(seta()) << endl;

It prints 22222 when I tried it. Undefined behaviour.

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 37

Page 38: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Lambdas and stack variables, capture by reference

function<int()> seta()

{

int a = 11111 ;

return [&] () { return a; };

}

int geta(function<int()> f)

{

int b = 22222;

return f();

};

What does this print:

cout << geta(seta()) << endl;

It prints 22222 when I tried it. Undefined behaviour.Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 38

Page 39: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Clang stack frame example

long f(long x, long y) // put y at -8 and x at -16

{

long a; // put a at -24

long b; // put b at -32

...

}

return addr

old bp base pointer

x bp - 8

y bp - 16

a bp - 24

b bp - 32

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 39

Page 40: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Compiled with clang -Slong f(long x, long y)

{

long a, b;

a = x + 42;

b = y + 23;

return a * b;

}

x 7→ rdi

y 7→ rsi

x 7→ rbp− 8

y 7→ rbp− 16

a 7→ rbp− 24

b 7→ rbp− 32

f:

pushq %rbp

movq %rsp, %rbp

movq %rdi, -8(%rbp)

movq %rsi, -16(%rbp)

movq -8(%rbp), %rsi

addq $42, %rsi

movq %rsi, -24(%rbp)

movq -16(%rbp), %rsi

addq $23, %rsi

movq %rsi, -32(%rbp)

movq -24(%rbp), %rsi

imulq -32(%rbp), %rsi

movq %rsi, %rax

popq %rbp

ret

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 40

Page 41: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Optimization: compiled with clang -S -O3

long f(long x, long y)

{

long a, b;

a = x + 42;

b = y + 23;

return a * b;

}

f:

addq $42, %rdi

leaq 23(%rsi), %rax

imulq %rdi, %rax

ret

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 41

Page 42: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Compiling structures and objects

Same idea as in stack frames:access in memory via pointer + indexStructure definition tells the compiler the size and indices of themembers.No code is produced for a struct definition on its own.But the compiler’s symbol table is extended: it knows about themember names and their types.Structure access then uses indexed addressing using those indices.

struct S {

T1 x;

T2 y;

};

x is a index 0y is at sizeof(T2) + padding for alignment

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 42

Page 43: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Compiling structures and objects

Same idea as in stack frames:access in memory via pointer + indexStructure definition tells the compiler the size and indices of themembers.No code is produced for a struct definition on its own.But the compiler’s symbol table is extended: it knows about themember names and their types.Structure access then uses indexed addressing using those indices.

struct S {

T1 x;

T2 y;

};

x is a index 0y is at sizeof(T2) + padding for alignment

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 43

Page 44: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Structure access

struct S {

long x;

long y;

};

void s(struct S *p)

{

p->x = 23;

p->y = 45;

}

s:

pushq %rbp

movq %rsp, %rbp

movq $23, (%rdi)

movq $45, 8(%rdi)

popq %rbp

retq

x 7→ 0

y 7→ 8

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 44

Page 45: What C/C++ programmers need to understand about the call stack …hxt/2016/c-plus-plus/stack.pdf · 2017. 3. 24. · The call stack and C I in C/C++, you need to understand how the

Easter break yay

Hayo Thielecke University of Birmingham http://www.cs.bham.ac.uk/~hxt 45