Presentation is loading. Please wait.

Presentation is loading. Please wait.

University of Washington Today Lab 3 out  Buffer overflow! Finish-up data structures 1.

Similar presentations


Presentation on theme: "University of Washington Today Lab 3 out  Buffer overflow! Finish-up data structures 1."— Presentation transcript:

1 University of Washington Today Lab 3 out  Buffer overflow! Finish-up data structures 1

2 University of Washington Multi-Level Array Example 2 zip_dig cmu = { 1, 5, 2, 1, 3 }; zip_dig uw = { 9, 8, 1, 9, 5 }; zip_dig ucb = { 9, 4, 7, 2, 0 }; int *univ[3] = {uw, cmu, ucb}; Same thing as a 2D array? int univ2D[3] = { { 9, 8, 1, 9, 5 }, { 1, 5, 2, 1, 3 }, { 9, 4, 7, 2, 0 } };

3 University of Washington Multi-Level Array Example 3 Variable univ denotes array of 3 elements Each element is a pointer  4 bytes Each pointer points to array of int s zip_dig cmu = { 1, 5, 2, 1, 3 }; zip_dig uw = { 9, 8, 1, 9, 5 }; zip_dig ucb = { 9, 4, 7, 2, 0 }; #define UCOUNT 3 int *univ[UCOUNT] = {uw, cmu, ucb}; 36 160 16 56 164 168 univ cmu uw ucb 15213 16 2024283236 98195 4044485256 94720 6064687276 How do access an element?

4 University of Washington Element Access in Multi-Level Array 4 Computation (IA32)  Element access Mem[Mem[univ+4*index]+4*dig]  Must do two memory reads  First get pointer to row array  Then access element within array # %ecx = index # %eax = dig leal 0(,%ecx,4),%edx# 4*index movl univ(%edx),%edx# Mem[univ+4*index] movl (%edx,%eax,4),%eax# Mem[...+4*dig] int get_univ_digit (int index, int dig) { return univ[index][dig]; }

5 University of Washington Array Element Accesses 5 int get_sea_digit (int index, int dig) { return sea[index][dig]; } int get_univ_digit (int index, int dig) { return univ[index][dig]; } Nested array Multi-level array Access looks similar, but it isn’t: Mem[sea+20*index+4*dig] Mem[Mem[univ+4*index]+4*dig]

6 University of Washington Strange Referencing Examples ReferenceAddressValueGuaranteed? univ[2][3] univ[1][5] univ[2][-1] univ[3][-1] univ[1][12] 6 36 160 16 56 164 168 univ cmu uw ucb 15213 16 2024283236 98195 4044485256 94720 6064687276

7 University of Washington Strange Referencing Examples ReferenceAddressValueGuaranteed? univ[2][3] univ[1][5] univ[2][-1] univ[3][-1] univ[1][12]  Code does not do any bounds checking  Location of each lower-level array in memory is not guaranteed 7 36 160 16 56 164 168 univ cmu uw ucb 15213 16 2024283236 98195 4044485256 94720 6064687276 56+4*3 = 682 Yes 16+4*5 = 369 No 56+4*-1 = 525 No ???? No 16+4*12 = 647 No

8 University of Washington Using Nested Arrays 8 #define N 16 typedef int fix_matrix[N][N]; /* Compute element i,k of fixed matrix product */ int fix_prod_ele (fix_matrix a, fix_matrix b, int i, int k) { int j; int result = 0; for (j = 0; j < N; j++) result += a[i][j]*b[j][k]; return result; }

9 University of Washington Using Nested Arrays Strengths  Generates very efficient assembly code  Avoids multiply in index computation Limitation  Only works for fixed array size 9 #define N 16 typedef int fix_matrix[N][N]; /* Compute element i,k of fixed matrix product */ int fix_prod_ele (fix_matrix a, fix_matrix b, int i, int k) { int j; int result = 0; for (j = 0; j < N; j++) result += a[i][j]*b[j][k]; return result; } ab i-th row k-th column x

10 University of Washington Dynamic Nested Arrays Strength  Can create matrix of any size Programming  Must do index computation explicitly Performance  Accessing single element costly  Must do multiplication 10 int * new_var_matrix(int n) { return (int *) calloc(sizeof(int), n*n); } int var_ele (int *a, int i, int j, int n) { return a[i*n+j]; } movl 12(%ebp),%eax# i movl 8(%ebp),%edx# a imull 20(%ebp),%eax# n*i addl 16(%ebp),%eax# n*i+j movl (%edx,%eax,4),%eax# Mem[a+4*(i*n+j)]

11 University of Washington Arrays in C Contiguous allocations of memory No bounds checking Can usually be treated like a pointer to first element 11

12 University of Washington Data Structures in Assembly Arrays  One-dimensional  Multi-dimensional (nested)  Multi-level Structs  Alignment Unions 12

13 University of Washington struct rec { int i; int a[3]; int *p; }; Structures 13

14 University of Washington struct rec { int i; int a[3]; int *p; }; Structures Characteristics  Contiguously-allocated region of memory  Refer to members within structure by names  Members may be of different types 14 Memory Layout iap 0416 20

15 University of Washington struct rec { int i; int a[3]; int *p; }; Structures 15 Accessing Structure Member  Given an instance of the struct, we can use the. operator, just like Java:  struct rec r1; r1.i = val;  What if we have a pointer to a struct: struct rec *r = &r1;

16 University of Washington struct rec { int i; int a[3]; int *p; }; IA32 Assembly # %eax = val # %edx = r movl %eax,(%edx)# Mem[r] = val void set_i(struct rec *r, int val) { r->i = val; } Structures 16 Accessing Structure Member  Given an instance of the struct, we can use the. operator, just like Java:  struct rec r1; r1.i = val;  What if we have a pointer to a struct: struct rec *r = &r1;  Using * and. operators:  Or, use -> operator for short:  Pointer indicates first byte of structure; access members with offsets (*r).i = val; r->i = val;

17 University of Washington # %ecx = idx # %edx = r leal 0(,%ecx,4),%eax# 4*idx leal 4(%eax,%edx),%eax# r+4*idx+4 int *find_a (struct rec *r, int idx) { return &r->a[idx]; } Generating Pointer to Structure Member Generating Pointer to Array Element  Offset of each structure member determined at compile time 17 struct rec { int i; int a[3]; int *p; }; iap 0416 20 r+4+4*idxr

18 University of Washington Structures & Alignment Unaligned Data How would it look like if data items were aligned (address multiple of type size) ? ci[0]i[1]v pp+1p+5p+9p+17 struct S1 { char c; int i[2]; double v; } *p; struct S1 { char c; int i[2]; double v; } *p; 18

19 University of Washington Structures & Alignment Unaligned Data Aligned Data  Primitive data type requires K bytes  Address must be multiple of K ci[0]i[1]v 3 bytes4 bytes p+0p+4p+8p+16p+24 Multiple of 4Multiple of 8 ci[0]i[1]v pp+1p+5p+9p+17 struct S1 { char c; int i[2]; double v; } *p; struct S1 { char c; int i[2]; double v; } *p; 19

20 University of Washington Alignment Principles Aligned Data  Primitive data type requires K bytes  Address must be multiple of K Aligned data is required on some machines; it is advised on IA32  Treated differently by IA32 Linux, x86-64 Linux, and Windows! What is the motivation for alignment? 20

21 University of Washington Alignment Principles Aligned Data  Primitive data type requires K bytes  Address must be multiple of K Aligned data is required on some machines; it is advised on IA32  Treated differently by IA32 Linux, x86-64 Linux, and Windows! Motivation for Aligning Data  Physical memory is accessed by aligned chunks of 4 or 8 bytes (system- dependent)  Inefficient to load or store datum that spans quad word boundaries  Also, virtual memory is very tricky when datum spans two pages (later…) Compiler  Inserts padding in structure to ensure correct alignment of fields  sizeof() should be used to get true size of structs 21

22 University of Washington Specific Cases of Alignment (IA32) 1 byte: char, …  no restrictions on address 2 bytes: short, …  lowest 1 bit of address must be 0 2 4 bytes: int, float, char *, …  lowest 2 bits of address must be 00 2 8 bytes: double, …  Windows (and most other OSs & instruction sets): lowest 3 bits 000 2  Linux: lowest 2 bits of address must be 00 2  i.e., treated the same as a 4-byte primitive data type 12 bytes: long double  Windows, Linux: lowest 2 bits of address must be 00 2 22

23 University of Washington Saving Space 23 ci[0]i[1]v 3 bytes4 bytes p1+0p1+4p1+8p1+16p1+24 struct S1 { char c; int i[2]; double v; } *p1;

24 University of Washington Saving Space Put large data types first: Effect (example x86-64, both have K=8) 24 ci[0]i[1]v 3 bytes4 bytes p1+0p1+4p1+8p1+16p1+24 struct S1 { char c; int i[2]; double v; } *p1; struct S2 { double v; int i[2]; char c; } *p2; ci[0]i[1]v p2+0p2+8p2+16 Unfortunately, doesn’t satisfy requirement that struct’s total size is a multiple of K

25 University of Washington Arrays of Structures Satisfy alignment requirement for every element How would accessing an element work? 25 struct S2 { double v; int i[2]; char c; } a[10]; ci[0]i[1]v a+24a+32a+40 a[0] a+0 a[1]a[2] a+24a+48a+72 7 bytes a+48

26 University of Washington Unions Allocated according to largest element Can only use one member at a time union U1 { char c; int i[2]; double v; } *up; union U1 { char c; int i[2]; double v; } *up; struct S1 { char c; int i[2]; double v; } *sp; struct S1 { char c; int i[2]; double v; } *sp; c 3 bytes i[0]i[1] 4 bytes v sp+0sp+4sp+8sp+16sp+24 c i[0]i[1] v up+0up+4up+8 26

27 University of Washington What Are Unions Good For? Unions allow the same region of memory to be referenced as different types  Different “views” of the same memory location  Can be used to circumvent C’s type system (bad idea) Better idea: use a struct inside a union to access some memory location either as a whole or by its parts 27

28 University of Washington Unions For Embedded Programming 28 typedef union { unsigned char byte; struct { unsigned char b0:1; unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char reserved:4; } bits; } hw_register; hw_register reg; reg.byte = 0x3F; // 00111111 2 reg.bits.b2 = 0; // 00111011 2 reg.bits.b3 = 0; // 00110011 2 unsigned short a = reg.byte; printf("0x%X\n", a); // output: 0x33 (Note: the placement of these fields and other parts of this example are implementation- dependent)

29 University of Washington Summary Arrays in C  Contiguous allocations of memory  No bounds checking  Can usually be treated like a pointer to first element Structures  Allocate bytes in order declared  Pad in middle and at end to satisfy alignment Unions  Provide different views of the same memory location 29


Download ppt "University of Washington Today Lab 3 out  Buffer overflow! Finish-up data structures 1."

Similar presentations


Ads by Google