Question? Leave a message!




Memory Management in C

Memory Management in C
CIS 190: C/C++ Programming Lecture 3 Memory Management in C 1 Any Questions 2 Outline • (from last class) Testing • Memory allocation • Memory errors • Errors • Debugging • Homeworks 3 Testing • unit testing – literal tests to make sure code works as intended – e.g., TwoPlusTwoEqualFour(...) for an Addition() function • edge case testing (or corner case, etc.) – ensure that code performs correctly with all (or at least many) possible input values – e.g., prevent program from accepting invalid input 4 Simple Testing Example / get month from user in integer form / printf(“Please enter month: “); scanf(“d”, month); 5 Simple Testing Example / get month from user in integer form / printf(“Please enter month: “); scanf(“d”, month); while (month JANINT month DECINT) scanf(“d”, month); 6 Simple Testing Example / get month from user in integer form / printf(“Please enter month: “); scanf(“d”, month); while (month JANINT month DECINT) printf(“\nd is an invalid month”, month); printf(“please enter between d and d:”, JANINT, DECINT); scanf(“d”, month); 7 / print string up to number given by length (or full string, whichever is reached first) / void PrintToLength(char str, int length) int i; for (i = 0; i length; i++) printf(“c”, stri); 8 Common Edge Cases • Cstyle string – empty string – pointer to NULL – without the \0 terminator • Integer – zero – negative/positive – below/above the min/max 9 Outline • (from last class) Testing • Memory allocation • Memory errors • Errors • Debugging • Homeworks 10 Memory • each process gets its own memory chunk, or address space 0x000000 Stack Function calls, locals Dynamically 4 GB Heap allocated address memory space “data segment” Global/static vars “code segment” Code 0xFFFFFFF 11 Memory • each process gets its own memory chunk, or address space 0x000000 Stack 4 GB Heap address space Global/static vars Code 0xFFFFFFF 12 Stack Allocation • memory allocated by the program as it runs – local variables – function calls Stack • fixed at compile time 13 Heap Allocation • dynamic memory allocation – memory allocated at runtime Heap • two options for allocating memory: –malloc() –calloc() • both require include stdlib.h to work 14 malloc() void malloc ( size to be allocated ) char letters; letters = (char) malloc(userVariable sizeof(char)); • malloc returns a pointer to a contiguous block memory of the size requested 15 calloc() void calloc ( number of elements, size of type ) float grades; grades = (float) calloc(userVariable, sizeof(float)); • calloc works very similarly to malloc, but it initializes all the allocated bits to zero − takes longer than malloc, so only use if needed 16 Casting Allocated Memory • both calloc() and malloc() return a pointer of type void, so you must cast the memory to match the given type letters = (char) malloc(userVariable sizeof(char)); grades = (float) calloc(userVariable, sizeof(float)); 17 Casting Allocated Memory • both calloc() and malloc() return a pointer of type void, so you must cast the memory to match the given type letters = (char) malloc(userVariable sizeof(char)); grades = (float) calloc(userVariable, sizeof(float)); 18 Handling Allocated Memory • IMPORTANT: before using allocated memory make sure it’s actually been allocated • if memory wasn’t correctly allocated, the address that is returned will be null − this means there isn’t a contiguous block of memory large enough to handle request 19 Exiting in Case of NULL • if the address returned is null, your program should exit − exit() takes an integer value − nonzero values are used as error codes if (grades == NULL) printf(“Memory not allocated, exiting.\n”); exit(1); 20 Managing Your Memory • stack allocated memory is automatically freed when Stack functions return − including main() • memory on the heap was Heap allocated by you – so it must also be freed by you 21 Freeing Memory • done using the free() function – free takes a pointer as an argument: free(grades); free(letters); • free() does not work recursively – for each individual allocation, there must be an individual call to free that allocated memory – called in a sensible order 22 Freeing in Order In what order would you free the nodes of this linked list A B C D E 23 Freeing in Order In what order would you free the nodes of this binary tree A B C D E F G H 24 Outline • (from last class) Testing • Memory allocation • Memory errors • Errors • Debugging • Homeworks 25 Memory Errors • when we dynamically allocate memory, we are handling it directly • have to be aware of possible errors like: – accessing offlimits memory – “losing” memory – running out of memory • not common nowadays, except in some embedded systems 26 Memory Leaks • memory leaks occur when data is continually dynamically allocated but not freed • access to the memory is then “lost” – for example, a loop that reallocates memory to the same variable without freeing • eventually we will run out of memory, and the program will crash or forcefully exit 27 Memory Leak Example for (i = 0; i var; i++) arr = (int) malloc(NUM sizeof(int)); / check if arr == NULL / Heap arr 28 Memory Leak Example for (i = 0; i var; i++) arr = (int) malloc(NUM sizeof(int)); / check if arr == NULL / i = 0 Heap arr = (int) malloc(…) arr 29 Memory Leak Example for (i = 0; i var; i++) arr = (int) malloc(NUM sizeof(int)); / check if arr == NULL / i = 1 Heap arr = (int) malloc(…) arr = (int) malloc(…) arr 30 Memory Leak Example for (i = 0; i var; i++) arr = (int) malloc(NUM sizeof(int)); / check if arr == NULL / i = 2 Heap arr = (int) malloc(…) arr = (int) malloc(…) arr = (int) malloc(…) arr 31 Memory Leak Example for (i = 0; i var; i++) arr = (int) malloc(NUM sizeof(int)); / check if arr == NULL / i = 3 arr = (int) malloc(…) Heap arr = (int) malloc(…) arr = (int) malloc(…) arr = (int) malloc(…) arr 32 Memory Leak Example for (i = 0; i var; i++) arr = (int) malloc(NUM sizeof(int)); / check if arr == NULL / i = 4 arr = (int) malloc(…) arr = (int) malloc(…) Heap arr = (int) malloc(…) arr = (int) malloc(…) arr = (int) malloc(…) arr 33 Memory Leak Example for (i = 0; i var; i++) arr = (int) malloc(NUM sizeof(int)); / check if arr == NULL / arr = (int) malloc(…) i = 5 arr = (int) malloc(…) arr = (int) malloc(…) Heap arr = (int) malloc(…) arr = (int) malloc(…) arr = (int) malloc(…) arr 34 Memory Leak Example for (i = 0; i var; i++) arr = (int) malloc(NUM sizeof(int)); / check if arr == NULL / arr = (int) malloc(…) i = 5 arr = (int) malloc(…) arr = (int) malloc(…) Heap arr = (int) malloc(…) arr = (int) malloc(…) arr = (int) malloc(…) arr 35 Memory Leak Example for (i = 0; i var; i++) arr = (int) malloc(NUM sizeof(int)); / check if arr == NULL / arr = (int) malloc(…) i = 5 arr = (int) malloc(…) arr = (int) malloc(…) Heap arr = (int) malloc(…) arr = (int) malloc(…) arr = (int) malloc(…) arr 36 Mistakes When Using free() • double free – freeing one pointer twice – without reallocating memory inbetween frees – can cause a segfault • dangling pointer – a pointer that points to freed memory – trying to access can cause a segfault 37 Segmentation Faults • segmentation faults occur when you try to access memory that is offlimits • segfaults occur during a program’s runtime – this can make them difficult to debug 38 Common Causes of Segfaults • accessing outofbounds on an array • accessing the memory address of uninitialized pointers • accessing a pointer whose address points to memory that has been freed 39 C Trying to Be “Nice” • when it can, C will do its best to shield you from errors like – freeing memory twice – accessing freed memory – manipulating freed memory • but not – using uninitialized memory 40 C Being Nice • double free memory – C will let it silently fail (most of the time) • accessing freed memory – C will let you do this (most of the time) – BUT…. 41 Killing with Kindness • the data that was stored there has degraded or been corrupted when it was freed • if code is changed so that freed memory is overwritten by a new “legitimate” allocation – you will suddenly have errors – that aren’t caused by the new code – makes it very difficult to debug 42 Outline • (from last class) Testing • Memory allocation • Memory errors • Errors • Debugging • Homeworks 43 Understanding Errors hw2.c:87:7: error: ‘foo’ undeclared 44 Understanding Errors hw2.c:87:7: error: ‘foo’ undeclared file in which error occurs 45 Understanding Errors hw2.c:87:7: error: ‘foo’ undeclared file in which error occurs line number 46 Understanding Errors hw2.c:87:7: error: ‘foo’ undeclared file in which error occurs character number line number 47 Understanding Errors hw2.c:87:7: error: ‘foo’ undeclared file in which error occurs character number degree of severity ‘error’ or ‘warning’ line number 48 Understanding Errors hw2.c:87:7: error: ‘foo’ undeclared file in which error message error occurs character number degree of severity ‘error’ or ‘warning’ line number 49 1 Rule of Debugging • start with the very first error or warning • recompile every time an error is fixed – errors will cascade – and decascade when fixed 50 Cascading Errors int numStudnts; for (i = 0; i numStudents; i++) total += gradesi; avg = total/numStudents; 51 Cascading Errors int numStudnts; for (i = 0; i numStudents; i++) total += gradesi; avg = total/numStudents; gcc –Wall average.c 52 Cascading Errors int numStudnts; for (i = 0; i numStudents; i++) total += gradesi; avg = total/numStudents; gcc –Wall average.c • the Wall flag shows all of warnings 53 Cascading Errors int numStudnts; for (i = 0; i numStudents; i++) total += gradesi; avg = total/numStudents; gcc –Wall average.c average.c:5:5: warning: unused variable ‘numStudnts’ average.c:22:17: error: ‘numStudents’ undeclared average.c:25:13: error: ‘numStudents’ undeclared 54 Cascading Errors int numStudnts; for (i = 0; i numStudents; i++) total += gradesi; avg = total/numStudents; gcc –Wall average.c average.c:5:5: warning: unused variable ‘numStudnts’ average.c:22:17: error: ‘numStudents’ undeclared average.c:25:13: error: ‘numStudents’ undeclared 55 Cascading Errors int numStudnts; for (i = 0; i numStudents; i++) total += gradesi; avg = total/numStudents; gcc –Wall average.c average.c:5:5: warning: unused variable ‘numStudnts’ average.c:22:17: error: ‘numStudents’ undeclared average.c:25:13: error: ‘numStudents’ undeclared 56 Cascading Errors int numStudents; for (i = 0; i numStudents; i++) total += gradesi; avg = total/numStudents; 57 Cascading Errors int numStudents; for (i = 0; i numStudents; i++) total += gradesi; avg = total/numStudents; gcc –Wall average.c 58 Cascading Errors int numStudents; for (i = 0; i numStudents; i++) total += gradesi; avg = total/numStudents; gcc –Wall average.c • got rid of all 3 errors 59 When Errors Occur • compile time – pretty easy (normally typos or simple mistakes) • linking – slightly harder (could be easy, could require rethinking how your code is laid out) • run time – UGH (often difficult to pinpoint, and sometimes hard to spot at all) – best bet is to use a debugger 60 Common Compiler Errors hw2.c:87:7: error: ‘foo’ undeclared • if foo is a variable: − forgot to declare − misspelled (on declaration or on use) • if foo is a function: − forgot to include file containing the prototype − misspelled (on declaration or on use) 61 Common Compiler Errors hw2.c:37:6: warning: unused variable ‘bar’ • variable was declared but not used – normally because variable declaration has a typo – if you’re in the midst of writing code, this warning may be temporarily acceptable – haven’t had a chance to use the variable yet 62 Common Compiler Errors hw2.c:54: warning: suggest parentheses around assignment used as truth value • often a mistake inside a control statement – you meant to use == not = – (you want equivalency, not assignment) 63 Common Compiler Errors hw2.c: 51: error: expected ‘;’ before ‘for’ • missing semicolon on previous line of code • ‘for’ is simply the word directly following the missing semicolon – could be ‘int’ or ‘if’ or a variable name, etc 64 Common Linker Errors hw4.o: In function ‘main’: hw4.c:91: undefined reference to ‘Fxn’ • linker can’t find code for ‘Fxn’ in any .o file – forgot to link .o file – misspelled named of Fxn – parameter list is different – differences between prototype/definition/call 65 Common Linker Errors /usr/lib64/gcc/.../crt1.o: In function ‘start’: /home/.../start.S:119: undefined reference to main – you compiled a file that does not contain a main() – without using the c flag to indicate separate compilation 66 ABSOLUTELY TERRIFYING ERROR • (story time) 67 ABSOLUTELY TERRIFYING ERROR 68 ABSOLUTELY TERRIFYING ERROR 69 Debugging Basics • if the error’s not clear from just looking at the code, you can try: • inserting probe statements with printf – (but adding a printf might change your error) • rubber duck debugging • Googling the error message • using a debugger 70 Outline • (from last class) Testing • Memory allocation • Memory errors • Errors • Debugging • Homeworks 71 Debuggers • see what is going on “inside” the program – more powerful and accurate than printf() probes • examine individual variables (value address) – can change variable’s value on the fly • step through code line by line – can skip blocks of code you don’t want to see 72 Using DDD (or GDB) • must use the ‘g’ flag when compiling • open program for testing using command line: ddd a.out gdb hw2 • GDB – Gnu Project Debugger (text based) • DDD – Data Display Debugger (GUI based) LIVECODING LIVECODING 73 DDD Basics • debugger allows you to: • add breakpoints to stop the program at specific points • use ‘print’ or ‘display’ to show values (or addresses) of variables • step through code line by line LIVECODING LIVECODING 74 DDD Tips • File Open Source – choose a different file to look at (and to set breakpoints in) • Source Reload Source – refresh the source you’re using after recompiling without losing any breakpoints or data displays • FINISH – executes the current “frame” – will pause when it hits a return (outside of main) LIVECODING LIVECODING 75 DDD Livecoding • DDD livecoding example was taken wholesale from the sample session on this page: http://www.gnu.org/software/ddd/manual/ htmlmono/ddd.html • site also has more information about DDD LIVECODING LIVECODING 76 Outline • (from last class) Testing • Memory allocation • Memory errors • Errors • Debugging • Homeworks 77 Homework 2 • due tomorrow night midnight • if you haven’t started yet – do it NOW 78 Homework 3 • Memory Diagrams • write legibly • double check your work • due at BEGINNING of class, on paper – no late days for this homework 79
sharer
Presentations
Free
Document Information
Category:
Presentations
User Name:
Dr.MasonHanks
User Type:
Teacher
Country:
Germany
Uploaded Date:
23-07-2017