ECE551 Midterm Version 1

Similar documents
ECE551 Midterm. There are 7 questions, with the point values as shown below. You have 75 minutes with a total of 75 points. Pace yourself accordingly.

ECE551 Midterm Version 1

ECE551 Midterm Version 2

ECE 551D Spring 2018 Midterm Exam

ECE 551D Spring 2018 Midterm Exam

Signature: ECE 551 Midterm Exam

ECE 264 Exam 2. 6:30-7:30PM, March 9, You must sign here. Otherwise you will receive a 1-point penalty.

Procedural Programming

C mini reference. 5 Binary numbers 12

Pointers, Arrays, and Strings. CS449 Spring 2016

Lecture 05 Pointers ctd..

CSC209H Lecture 3. Dan Zingaro. January 21, 2015

This code has a bug that allows a hacker to take control of its execution and run evilfunc().

o Code, executable, and process o Main memory vs. virtual memory

Course organization. Course introduction ( Week 1)

211: Computer Architecture Summer 2016

Student Number: Instructor: Reid Section: L0101 (10:10-11:00am)

Characters and Strings

Student Number: Instructor: Reid Section: L5101 (6:10-7:00pm)

Contents. A Review of C language. Visual C Visual C++ 6.0

CSE 12 Spring 2016 Week One, Lecture Two

CSCE150A. Introduction. Basics. String Library. Substrings. Line Scanning. Sorting. Command Line Arguments. Misc CSCE150A. Introduction.

Computer Science & Engineering 150A Problem Solving Using Computers. Chapter 9. Strings. Notes. Notes. Notes. Lecture 07 - Strings

Computer Science & Engineering 150A Problem Solving Using Computers

File IO and command line input CSE 2451

Getting Started. Project 1

8. Characters, Strings and Files

Dynamic memory. EECS 211 Winter 2019

Reading Assignment. Strings. K.N. King Chapter 13. K.N. King Sections 23.4, Supplementary reading. Harbison & Steele Chapter 12, 13, 14

a) Write the signed (two s complement) binary number in decimal: b) Write the unsigned binary number in hexadecimal:

Memory Management. CSC215 Lecture

Procedural Programming & Fundamentals of Programming

CS 261 Fall Mike Lam, Professor. Structs and I/O

CSC209H Lecture 4. Dan Zingaro. January 28, 2015

Programming. Pointers, Multi-dimensional Arrays and Memory Management

Dynamic memory allocation

CSCI 6610: Intermediate Programming / C Chapter 12 Strings

Dynamic Memory. Dynamic Memory Allocation Strings. September 18, 2017 Hassan Khosravi / Geoffrey Tien 1

Chapter 8 C Characters and Strings

C Characters and Strings

C Structures & Dynamic Memory Management

Arrays and Strings. CS449 Fall 2017

Lecture 8 Dynamic Memory Allocation

Carnegie Mellon. C Boot Camp. June 15, Fernando Yinglan Zach Kevin

Student Number: Instructor: Reid Section: L0201 (12:10-1:00pm)

CS 0449 Sample Midterm

Programs in memory. The layout of memory is roughly:

C programming basics T3-1 -

Memory Allocation in C C Programming and Software Tools. N.C. State Department of Computer Science

Lab # 4. Files & Queues in C

SYSTEM AND LIBRARY CALLS. UNIX Programming 2015 Fall by Euiseong Seo

CSC 1600 Memory Layout for Unix Processes"

Using Character Arrays. What is a String? Using Character Arrays. Using Strings Life is simpler with strings. #include <stdio.

Arrays and Pointers in C. Alan L. Cox

CSE 12 Spring 2018 Week One, Lecture Two

Fundamentals of Programming & Procedural Programming

Lecture07: Strings, Variable Scope, Memory Model 4/8/2013

CSE 333 Midterm Exam July 24, Name UW ID#

MARKS: Q1 /20 /15 /15 /15 / 5 /30 TOTAL: /100

Question 1. [15 marks]

TI2725-C, C programming lab, course

11 'e' 'x' 'e' 'm' 'p' 'l' 'i' 'f' 'i' 'e' 'd' bool equal(const unsigned char pstr[], const char *cstr) {

Chapter 5. Section 5.4 The Common String Library Functions. CS 50 Hathairat Rattanasook

Winter 2017 March 2, 2017 CS107 2 nd Midterm Examination

Strings. Arrays of characters. Pallab Dasgupta Professor, Dept. of Computer Sc & Engg INDIAN INSTITUTE OF TECHNOLOGY

by Pearson Education, Inc. All Rights Reserved.

C strings. (Reek, Ch. 9) 1 CS 3090: Safety Critical Programming in C

Dynamic Memory Allocation (and Multi-Dimensional Arrays)

CSCI 2212: Intermediate Programming / C Storage Class and Dynamic Allocation

CSE 333 Midterm Exam 5/10/13

CSCI-243 Exam 1 Review February 22, 2015 Presented by the RIT Computer Science Community

cc -o build/test_translate build/test_translate.o b... $

Programming for Engineers Arrays

Understanding Pointers

Winter 2017 CS107 Midterm #2 Examination (Practice #2) Problem Points Score Grader TOTAL 30

ECE264 Spring 2014 Exam 2, March 11, 2014

Content. Input Output Devices File access Function of File I/O Redirection Command-line arguments

Midterm Review. What makes a file executable? Dr. Jack Lange 2/10/16. In UNIX: Everything is a file

Design and development of embedded systems for the Internet of Things (IoT) Fabio Angeletti Fabrizio Gattuso

In Java we have the keyword null, which is the value of an uninitialized reference type

DAY 3. CS3600, Northeastern University. Alan Mislove

Content. In this chapter, you will learn:

File Access. FILE * fopen(const char *name, const char * mode);

C: Pointers, Arrays, and strings. Department of Computer Science College of Engineering Boise State University. August 25, /36

Computer Programming: Skills & Concepts (CP) Strings

14. Memory API. Operating System: Three Easy Pieces

CSci 4061 Introduction to Operating Systems. Input/Output: High-level

Dynamic Memory Allocation

Chapter 8: Character & String. In this chapter, you ll learn about;

Midterm Exam Nov 8th, COMS W3157 Advanced Programming Columbia University Fall Instructor: Jae Woo Lee.

Computer Security. Robust and secure programming in C. Marius Minea. 12 October 2017

ECE264 Spring 2013 Exam 1, February 14, 2013

Q1: /8 Q2: /30 Q3: /30 Q4: /32. Total: /100

ECE264 Fall 2013 Exam 3, November 20, 2013

EXAMINATION REGULATIONS and REFERENCE MATERIAL for ENCM 339 Fall 2017 Section 01 Final Examination

CSE 333 Midterm Exam 7/27/15 Sample Solution

Arrays, Strings, and Pointers

BIL 104E Introduction to Scientific and Engineering Computing. Lecture 12

Q1: /20 Q2: /30 Q3: /24 Q4: /26. Total: /100

Arrays, Strings, and Pointers

Transcription:

Name: ECE551 Midterm Version 1 NetID: There are 7 questions, with the point values as shown below. You have 75 minutes with a total of 75 points. Pace yourself accordingly. This exam must be individual work. You may not collaborate with your fellow students. However, you may use your notebook, which must contain only handwritten notes, written by you. I certify that the work shown on this exam is my own work, and that I have neither given nor received improper assistance of any form in the completion of this work. Signature: # Question Points Earned Points Possible 1 Multiple Choice Concepts 12 2 Reading Code 9 3 Debugging 8 4 Coding 1: Strings 7 5 Coding 2: Arrays 8 6 Coding 3: Dynamic Allocation 13 7 Coding 4: File IO 18 Total 75 Percent 100 The next two pages contains some reference (an abbreviated version of the man pages) for common, useful library functions. 1

char * strchr(const char *s, int c); The strchr function locates the first occurrence of c (converted to a char) in the string pointed to by s. It returns a pointer to the located character, or NULL if the character does not appear in the string. char * strdup(const char *s1); The strdup function allocates sufficient memory for a copy of the string s1, does the copy, and returns a pointer to it. The pointer may subsequently be used as an argument to the function free. If insufficient memory is available, NULL is returned. size_t strlen(const char *s); The strlen function computes the length of the string s and returns the number of characters that precede the terminating \0 character. int strcmp(const char *s1, const char *s2); int strncmp(const char *s1, const char *s2, size_t n); The strcmp and strncmp functions lexicographically compare the null-terminated strings s1 and s2. The strncmp function compares not more than n characters. Because strncmp is designed for comparing strings rather than binary data, characters that appear after a \0 character are not compared. These functions return an integer greater than, equal to, or less than 0, according as the string s1 is greater than, equal to, or less than the string s2. The comparison is done using unsigned characters. char *strstr(const char *s1, const char *s2); The strstr function locates the first occurrence of the null-terminated string s2 in the null-terminated string s1. If s2 is an empty string, s1 is returned; if s2 occurs nowhere in s1, NULL is returned; otherwise a pointer to the first character of the first occurrence of s2 is returned. void * malloc(size_t size); The malloc function allocates size bytes of memory and returns a pointer to the allocated memory. void * realloc(void *ptr, size_t size); The realloc function creates a new allocation of size bytes, copies as much of the old data pointed to by ptr as will fit to the new allocation, frees the old allocation, and returns a pointer to the allocated memory. If ptr is NULL, realloc is identical to a call to malloc for size bytes. void free(void *ptr); The free function deallocates the memory allocation pointed to by ptr. If ptr is a NULL pointer, no operation is performed. int fgetc(file *stream); The fgetc function obtains the next input character (if present) from the stream pointed at by stream, or EOF if stream is at end-of-file. 2

char * fgets(char * str, int size, FILE * stream); The fgets function reads at most one less than the number of characters specified by size from the given stream and stores them in the string str. Reading stops when a newline character is found, at end-of-file or error. The newline, if any, is retained. If any characters are read and there is no error, a \0 character is appended to end the string. Upon successful completion, it returns a pointer to the string. If end-of-file occurs before any characters are read, it returns NULL. ssize_t getline(char ** linep, size_t * linecapp, FILE * stream); The getdelim() function, delimited by the character delimiter. The getline function reads a line from stream, which is ended by a newline character or end-of-file. If a newline character is read, it is included in the string. The caller may provide a pointer to a malloced buffer for the line in *linep, and the capacity of that buffer in *linecapp. These functions expand the buffer as needed, as if via realloc. If linep points to a NULL pointer, a new buffer will be allocated. In either case, *linep and *linecapp will be updated accordingly. This function returns the number of characters written to the string, excluding the terminating \0 character. The value -1 is returned if an error occurs, or if end-of-file is reached. void * memcpy(void * dst, const void *src, size_t n); The memcpy function copies n bytes from memory area src to memory area dst. 3

Question 1 Multiple Choice Concepts [12 pts] Q1.1 Consider the code on the left of the following figure, and the frame layout on the right (we assume that sizeof(int)=4, and sizeof(int*)=4 on this system): Code int a = 7; int * p = &a; int ** q= &p; int data[2][2]; data[0][0] = 42; data[0][1] = 99; data[1][0] = 30; data[1][1] = 100; Name a p q data Frame Layout Address 224-227 220-223 216-219 212-215 208-211 204-207 200-203 Value 1. In the diagram above, fill in each box in the frame with the numerical (not conceptually: write numbers, do not draw arrows for pointers) value that it contains when the code shown here finishes executing. 2. What is the type of data[1]? 3. What is the numerical value of data[1]? 4. What is the type of data[1][0]? 5. What is the type of &data[1][1]? 6. What is the numerical value of &data[1][1]? 4

Q1.2 Consider the following two declarations: const char * s1 = "Hello"; char s2[] = "Hello"; For each of the following statements, select whether or not it is true of s1, s2, neither or both (place a check mark in the correct box) Statement True of s1 True of s2 Both Neither s1 and/or s2 is an lvalue &s1[3] and/or &s2[3] is valid s1[0] and/or s2[0] is in read only memory s1 and/or s2 occupies 6 bytes in the frame s1 and/or s2 point at a null terminated string s1 and/or s2 should be freed Q1.3 For each question, fill in the blank with the word or words which most correctly complete the sentence. 1. A program makes a if it needs to interact with the outside world. 2. The difference between perror and just using fprint to stderr is that perror also prints a description of. 3. malloc allocates memory in the. 4. A occurs when code allows user input to exceed the bounds of an array, corrupting other data, and possibly the return address, posing a serious security hazard. 5. When declaring a variable which will be used to describe the size or index of an array, the most correct type to use is. 6. If you have int x; and int * p = &x;, then we would say that x and *p are because they both name the same box. 7. If you are debugging in gdb, and are currently at a line with a function call, you would use the command to go inside the function call and execute the code there. 5

Question 2 Reading Code [9 pts] Execute the following code by hand, and fill in the output at the bottom of this page (the start of each line is written for you, write the correct number at the end of each line). #include <stdio.h> #include <stdlib.h> void f(int x, int * p, int ** q) { x = x + 3; *p = **q + x; *q = p; } int main(void) { int a = 3; int b = 4; int c = 5; int * data[] = {&a, &b, &c}; int ** q = &data[1]; **q = 99; q[0] = q[1]; printf("a=%d, b=%d, c=%d\n",a,b,c); for (int i = 0; i < 3; i++) { *data[i] = *data[i] + 11; } printf("a=%d, b=%d, c=%d\n",a,b,c); f(a, &b, &data[2]); *q[1] = *q[1]-3; printf("a=%d, b=%d, c=%d\n",a,b,c); return EXIT_SUCCESS; } Fill in output below: a=, b=, c= a=, b=, c= a=, b=, c= 6

Question 3 Debugging [8 pts] A C programmer wrote the following buggy code to read in many lines of numbers, sort them, and print them out: 1: #include <stdio.h> 2: #include <stdlib.h> 3: int cmplong(const void * vp1, const void * vp2) { 4: const long * p1 = vp1; 5: const long * p2 = vp2; 6: return *p1 - *p2; 7: } 8: int main(void) { 9: char * line= NULL; 10: size_t sz =0; 11: long * array; 12: size_t n = 0; 13: while(getline(&line, &sz, stdin) > 0){ 14: array=realloc(array, n * sizeof(*array)); 15: array[n] = strtol(line, NULL, 0); 16: n++; 17: } 18: free(line); 19: qsort(array, n, sizeof(*array), cmplong); 20: for (size_t i = 0; i <= n; i++) { 21: printf("%ld\n", array[i]); 22: } 23: return EXIT_SUCCESS; 24: } 7

Error 1 The first problem is: Conditional jump or move depends on uninitialised value(s) at 0x4C2CE3B: realloc (in...) by 0x40074C: main (broken.c:14) This problem can be correctly fixed by: A. Using malloc instead of realloc on line 14 B. Changing sizeof(*array) to sizeof(*array[0]) on line 14. C. Changing line 13 to read size_t n = 1; D. Changing line 15 to use atoi instead of strtol. E. None of the above specify what to do instead: Error 2 After correctly fixing the first problem, the next error is: Invalid write of size 8 at 0x400783: main (broken.c:15) Address 0x51fc100 is 0 bytes after a block of size 0 alloc d at 0x4C2AB80: malloc (in...) by 0x4C2CF1F: realloc (in...) by 0x400754: main (broken.c:14) This problem can be correctly fixed by: A. Changing sizeof(*array) to sizeof(*array[0]) on line 14. B. Changing sizeof(*array) to sizeof(array) on line 14. C. Changing n to (n+1) on line 14. D. Changing line 13 to read size_t n = 1; E. None of the above specify what to do instead: 8

Error 3 After correctly fixing the first two problems, the next error is: Invalid read of size 8 at 0x4007E5: main (broken.c:21) Address 0x51fd4e0 is 0 bytes after a block of size 224 alloc d at 0x4C2CE8E: realloc (in...) by 0x400758: main (broken.c:14) This problem can be correctly fixed by: A. Changing the loop condition on line 20 to use < instead of <=. B. Changing array[n] to array[n-1] on line 15. C. Changing array[n] to array[n+1] on line 15. D. Changing line 12 to read size_t n = 1; E. None of the above specify what to do instead: Error 4 After correctly fixing the first three errors, the code runs, but leaks memory: 224 bytes in 1 blocks are definitely lost in loss record 1 of 1 at 0x4C2CE8E: realloc (in...) by 0x400758: main (broken.c:14) This error can be corrected by: A. Placing free(array[i]); between lines 21 and 22 (inside the for loop) B. Placing free(line); between lines 16 and 17 (inside the while loop) C. Placing free(array) between lines 22 and 23 (after the for loop) D. Changing sizeof(*array) to \verbsizeof(array)+ on line 19 E. None of the above specify what to do instead: 9

Question 4 Coding 1: Strings [7 pts] For this problem you will write your own, slightly simplified implementation of the atoi function from the C library, without using any library functions. Specifically, your function should take a const char * as input, and return the integer which that string represents. If passed, "123", your function should return 123. You may make the following simplifying assumptions: The string will only contain digits from 0 to 9 (and will, of course, be terminated by a \0 ). The number will be positive (which follows from the first point). The string will not be empty (it will include at least one digit). The resulting number will not overflow an int. int atoi(const char * str){ } 10

Question 5 Coding 2: Arrays [8 pts] Write the method findlargestdifference which takes two arrays of integers, a1 and a2, and n which is the size of both arrays. This method returns the largest difference (not the largest absolute value of the difference, the largest numerical difference) between elements in the same positions in a1 and a2. For example, if a1 = {1, 4, 6, 7, 9} a2 = {7, 5, 1, 3, 8} Then this method would return 5, since the differences between elements in the same positions are -6, -1, 5, 4, and 1, respectively, and 5 is the largest of those differences. If n is zero, your method should return 0. int findlargestdifference(int * a1, int * a2, size_t n) { } 11

Question 6 Coding 3: Dynamic Allocation [13 pts] Write the function strjoin, which takes two strings, s1 and s2, and returns a new string which contains the contents of s1 followed by the contents of s2. This function must allocate space on the heap for the resulting string, and return it (which the caller should be able to free() later). For example, the following code should valgrind cleanly and print abcdef: const char * s1 = "abcd"; const char * s2 = "ef"; char * s3 = strjoin(s1, s2); printf("%s\n", s3); free(s3); You may use any of the following library functions (but only the following library functions): malloc, realloc, strdup, strncpy, strncat,strlen. char * strjoin(const char * s1, const char * s2) { } 12

Question 7 Coding 4: File IO [18 pts] Write a program which takes 2 command line arguments. The first argument is the name of an input file, and the second is an arbitrary string, which you will treat as a set of characters. Your program should read the file named by its first argument, and count how many times each character in its second argument appears in that file. After reading the entire file, it should print each character from its second argument, followed by a :, and the count of how many of that character it found in the input. For example, if the input file is Hello World I like to program! and the second argument is i!o, your program should print: i:1!:1 o:4 (because i appears once,! appears once, and o appears 4 times). For this problem, we will relax the no assumptions restriction by allowing you to assume that (1) two command line arguments are provided (2) the input file requested exists and is readable (fopen succeeds) (3) the characters in the second argument are distinct (none are repeated) (4) malloc and realloc always succeed and (5) fclose succeeds. You may use any library functions you wish. You may NOT assume anything about the length of the second argument, nor the contents of the input file. (Answer on next page) 13

#include <stdio.h> #include <stdlib.h> 14