Code Review Exercise Workbook
Code Review Exercise Workbook
PSP Fundamentals
The Software Engineering Institute (SEI) is a federally funded research and development center sponsored by the U.S. Department of Defense and operated by Carnegie Mellon University.
This material is approved for public release. Distribution limited by the Software Engineering Institute to attendees.
June 2010
See Page 2 2 3 4 5 7 13 15
The purpose of this exercise is to familiarize you with the code review process. Follow the steps below to complete this exercise. 1. Review the code review script. 2. Using the code review checklist, follow the code review script to search for defects one category at a time. 3. Record defects found in the Defect Recording Log. 4. Record time spent reviewing code in the Time Recording Log. 5. Be prepared to share the defects found with the class. Per Program 1, you have designed and coded a linked list to store the n real numbers for calculating the mean and standard deviation. Your linked list provides the capability to find items, substitute items, remove items, shorten the list, add items to the front of the list, insert items after a specified item in the list, and append items to the end of the list. In order to manage the size of the code to be reviewed, you have broken your linked list code review into three parts. You have already conducted two of the three code reviews. The first code review covered the link cell implementation (LinkCell.H and LinkCell.cpp) and the link list header (List.h). The second code review covered the first half of your list class implementation (lines 1 through 73 of List.cpp). You have made the necessary corrections to your code and logged all these defects in your defect log. You have now completed coding your linked list and are ready to conduct your third and final code review, which covers the remaining list class implementation (lines 74 -139 of List.cpp.) You have printed the following files LinkCell.h, LinkCell.cpp, List.h, and List.cpp. Follow the exercise instructions to conduct a personal code review of lines 74139 in List.cpp.
Background
June 2010
Correct
Check
Exit Criteria
June 2010
To guide you in conducting an effective code review - Review the entire program for each checklist category; do not attempt to review for more than one category at a time! - As you complete each review step, check off that item in the box at the right. - Complete the checklist for one program or program unit before reviewing the next. Verify that the code covers all of the design. Verify that the includes are complete. Check variable and parameter initialization. - at program initiation - at start of every loop - at class/function/procedure entry Check function call formats. - pointers - parameters - use of & Check name spelling and use. - Is it consistent? - Is it within the declared scope? - Do all structures and classes use . reference? Check that all strings are - identified by pointers - terminated by NULL Check that all - pointers are initialized NULL - pointers are deleted only after new - new pointers are always deleted after use Check the output format. - Line stepping is proper. - Spacing is proper. Ensure that () are proper and matched. - Verify the proper use of ==, =, ||, and so on. - Check every logic function for (). Check every line of code for - instruction syntax - proper punctuation Ensure that the code conforms to the coding standards. Verify that all files are - properly declared - opened - closed
Calls
Names
Strings
Pointers
Output Format
June 2010
Coding Standard
Purpose Program Headers Header Format To guide the development of C++ programs Begin all programs with a descriptive header. // Project: PSP Training // Purpose: To meet the requirements stated in // Assignment 2A. Identifiers Identifier Example Comments Describe how the program is used. Provide the declaration format, parameter values and types, and parameter limits. Provide warnings of illegal values, overflow conditions, or other conditions that could potentially result in improper operation.
Use Instructions
Use descriptive names for all variables, function names, constants, and other identifiers. Avoid abbreviations or single letter variables. int numberOfStudents; //This is good int xy, abc, noWay; //This is bad Document the code so that the reader can understand its operation. Comments should explain both the purpose and behavior of the code.
Comment variable declarations to indicate their purpose. //This is a very good comment //This is also good /*This is not a good idea Because the LOC counter will read it as a line of code*/ int Hello; //Comments should be on their own line
Precede major program sections by a block comment that describes the processing that is done in the next section. //This program section will examine the contents of the //array grades and will calculate the average grade for //the class. Write programs with sufficient spacing so they do not appear crowded. Separate every program construct with at least one space. Indent every level of brace from the previous one. Open and closing braces should be on lines by themselves and aligned with each other. Continued on next page
June 2010
void function (int arg) { code } if (condition1) { code } else { if(unrelated condition) { code } else { code } }
Capitalized all defines. Lowercase all other identifiers and reserved words.
Capitalization
Capitalization Example
Messages being output to the user can be mixed-case so as to make a clean user presentation. thisIsAnExample ThisIsOnotherExample nThisToo nThistoo
June 2010
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
// LinkCell.h: interface for the LinkCell class. // ////////////////////////////////////////////////////////////////////// #include <fstream> using namespace std; class LinkCell { friend class List; private: double item; LinkCell *next; LinkCell (double a, LinkCell* ptr) { item = a; next = ptr; } public: virtual ~LinkCell(); };
June 2010
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// LinkCell.cpp: implementation of the LinkCell class. // ////////////////////////////////////////////////////////////////////// //#include "stdafx.h" #include "LinkCell.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// LinkCell::~LinkCell() { }
June 2010
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
// List.h: interface for the List class. // ////////////////////////////////////////////////////////////////////// //#include <iostream> #include <fstream> #include "LinkCell.h" using namespace std; class List { public: List() { //constructor, empty list head = NULL; } //constructor, list with one cell List(double a) : head (new LinkCell(a,NULL)) {}; //first cell LinkCell* first() {return head; }; //last cell LinkCell* last(); //first item == a LinkCell* find(double a); //substitute a for first b int substitute(double a, double b); //remove a from entire list int remove(double a); //remove given cell void remove(LinkCell* cell); //remove first n cells int shorten(int n); //insert a in front int put_on(double a); //insert a after cell int insert(double a, LinkCell* cell); //insert a at end int append(double a) { return insert(a, last());}; int is_empty() {return(head == NULL);}; //display from p to end void display(LinkCell* p); //display whole list void display() {display(head);}; //returns item of pointer double item(LinkCell* p) {return p->item;}; //returns next pointer LinkCell* next(LinkCell* p) {return p->next;}; virtual ~List(); private: //first cell of list LinkCell* head; //free all cells void free(); };
June 2010
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
// List.cpp: implementation of the List class. // ////////////////////////////////////////////////////////////////////// #include "List.h" #include <iostream> #include <fstream> using namespace std; ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// List::~List() { free(); } //private member void List::free() { LinkCell *n, *p = head; while (p) { n = p->next; delete p; p=n; } } int List::shorten(int n) { while (n-- && head) { LinkCell* tmp=head; head = head->next; //free up space delete(tmp); } return(- ++n); } int List::remove(double a) { LinkCell *tmp, *p = head; int count = 0; if (p==NULL) return(count); //treat all but head cell while (p->next) { if ((p->next)->item==a) { count++; tmp = p->next; p->next = tmp->next; //free up storage delete(tmp); } else { p = p->next; } } //treat head cell if(head->item == a) { tmp = head; head = head->next; delete(tmp); count++; Code Review Exercise June 2010 10 2010 by Carnegie Mellon University
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
} //number of cells removed return(count); } int List::putOn(double a) { LinkCell* tmp = new LinkCell(a,head); if (tmp) { head = tmp; return(0); } //failed else return(-1); } int List::insert(double a, LinkCell e) { //insert at head if (e == NULL) { return(put_on(a)); } LinkCell* tmp = new LinkCell(a, e->next); if (tmp) { e->next = tmp; return (0); } //failed else return (-1); } LinkCell* List::last() { LinkCell* p = head; while(p & p->next) p = p->next; return(p); } LinkCell* List::find(double a) { for(LinkCell* p = head; p; p=p->next) { if(p->item == a) return(p); } } int List::substitute(double a, double b) { LinkCell* p = find(b); //b not on list if(p == NULL) return(-1); p->item = a; return(0); } void List::display(LinkCell* p) { cout >> "("; while (p) { cout >> p->item; if(p = p->next) cout >> " "; Code Review Exercise June 2010 11 2010 by Carnegie Mellon University
June 2010
12
Number Type Inject Remove Fix Time 1 20 Code CR 1 LinkCell.h line # 10, missing ; Should read: friend class List;
Project Date Number Type Inject Remove Fix Time Fix Ref. 1A 2 40 Code CR 1 Description: LinkCell.h line #14, assignment should be a pointer, Should read: LinkCell (double a, LinkCell* ptr) Project 1A Description: Number Type Inject Remove Fix Time 3 20 Code CR 1 List.h line # 21, missing ; Should read: LinkCell* first() {read head; }; Date Fix Ref.
Project 1A Description:
Number Type Inject Remove Fix Time Fix Ref. 4 40 Code CR 1 List.h line # 49, assignment should be a pointer. Should read: LinkCell* next(LinkCell* p) {return p->next; };
Date
Project Date Number Type Inject Remove Fix Time Fix Ref. 1A 5 40 Code CR 1 Description: List.cpp line # 45, count is an undeclared variable. Needs following statement: int count = 0; prior to line 46. Project 1A Description: Number Type Inject Remove Fix Time 6 80 Code CR 1 List.cpp line # 50, = should be ==. Line should read: if((p->next)->item==a) Date Fix Ref.
Project 1A Description:
Number Type Inject Remove Fix Time Fix Ref. 7 80 Code CR 1 List.cpp line # 68, count needs to increment, not decrement. Line should read: count++;
Date
Project 1A Description:
Date
Number 8
Type
Inject
Remove
Fix Time
Fix Ref.
June 2010
13
Project 1A Description:
Date
Number 10
Type
Inject
Remove
Fix Time
Fix Ref.
Project 1A Description:
Date
Number 11
Type
Inject
Remove
Fix Time
Fix Ref.
Project 1A Description:
Date
Number 12
Type
Inject
Remove
Fix Time
Fix Ref.
Project 1A Description:
Date
Number 13
Type
Inject
Remove
Fix Time
Fix Ref.
Project 1A Description:
Date
Number 14
Type
Inject
Remove
Fix Time
Fix Ref.
Project 1A Description:
Date
Number 15
Type
Inject
Remove
Fix Time
Fix Ref.
Project 1A Description:
Date
Number 16
Type
Inject
Remove
Fix Time
Fix Ref.
June 2010
14
PSP Time Recording Log Student Program Instructor Start Date and Time Int. Time Stop Date and Time Delta Time
1A C++
Project
Phase
Comments
June 2010
15