Page 2
Question 1
- full credit for mentioning condition codes
- half credit for nop
- none for incorrect statements
Question 2
- full credit for nop
- none for incorrect statements
Page 3
Questions 3–7
- Full credit for getting the right answer.
- Partial for one of - having one extra modification
- missing the modification
- having the wrong value in the correct register
- having the wrong register with the correct value
 
- No credit if have tow or more of above problems
extraneous %, 0x, etc OK.
Correct answers:
- Q3 - RAX = 190
 
- Q4 - RSP = 1F8 or 192 or 198 (full for any of the three: hex conversion was not the point of this question)
 
- Q5 - RSP = 208
 
- Q6 - RDI = 120
 
- Q7 - RDX = 1C3F5678 (also accept 21C3F5678)
 
Page 4
> It became clear that we either failed to teach the error detection topics adequately or there was some unnoticed ambiguity in the questions about it; as a consequence, we added 0.75 to every score on each of the questions on this topic to help correct our failure, whichever one it was.
Question 8
- full credit for D
- half credit for C
- no credit for the others
Question 9
- full for none
- half for TorL
Question 10
- full for T
Question 11
- full for P
- Also accept “none” if accompanied by explanation about not being wrong in comments, strings, etc
Question 12
- full for L
- half for T
Question 13
- full for 7
Page 5
Question 14
- full for 20
- half for 8
Question 15
- full for 16
- half for 14
Question 16
The bug is the malloc is too small; it should have a sizeof(int) term. This creates a second bug: we could go off the end of the array (heap buffer overflow) both in the copying loop and potentially in every other access to s.data[index].
The leak is fixed by adding a free(s.data) after the for and before the s.data = tmp;.
Graded in four parts:
- Q16 found bug - full if identify either (a) the malloc or (b) every s.data[index](there are three of them)
- partial for identifying just one s.data[index]or the memory leak
 
- full if identify either (a) the malloc or (b) every 
- Q16 explained bug - full if description suggests they understand why what they identified is wrong
- partial if description unclear (e.g., “missing sizeof” without why)
 
- Q16 fixed leak - full if free(s.data)
- partial if free(tmp)– note there is no non-buggy way to do this, so they miss the next points too
 
- full if 
- Q16 leak fix not buggy - full if free in correct place
- partial if free before or in loop or after s.data = tmp
 
Page 6
Question 17
The set of correct solutions includes
do {
    y += 1;
    if (x&1) {
        x *= 3;
        x += 1;
    } else {
        x >>= 1;
    }
} while (x > 1);
There are other solutions; for example,
y += 1; x = (x%2==0) ? x/2 : x*3+1;
while (x>1) { y += 1; x = (x%2==0) ? x/2 : x*3+1; }
… as well as things like for(;;) with an internal break, etc.
Don’t be picky on ;, etc., unless expressly called out below.
Graded in three parts:
- Q17 goto-free C - full if - no gotoor labels
- no loop-breaking ;like(...);{ordo{ ... }; while
- no major (more than delimiter) mistakes
 
- no 
- partial if just one of the above mistakes
- none if two or more of the above
 
- full if 
- Q17 if case - full if - there is an if/else(or two complimentaryif, etc)
- the x-is-odd case has the *3+1and the even has the>>1(or equivalent)
 
- there is an 
- partial if missing/always does one case or has the two backwards
 
- full if 
- Q17 do-loop semantics - full if both - is a loop
- does the body once before first check
- terminates on the right conditions
 
- partial if a loop with one of the other two cases
- none if not a loop, or both check-first and wrong-condition
 
- full if both