CS222
description
Transcript of CS222
![Page 1: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/1.jpg)
CS222Week 8 - Monday
![Page 2: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/2.jpg)
Last time
What did we talk about last time? Memory layout in the system Lab 7
![Page 3: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/3.jpg)
Questions?
![Page 4: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/4.jpg)
Project 4
![Page 5: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/5.jpg)
Random number review
Include the following headers: stdlib.h time.h
Use rand() % n to get values between 0 and n – 1
Always call srand(time(NULL)) before your first call to rand()
Only call srand() once per program Seeding multiple times makes no sense and
usually makes your output much less random
![Page 6: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/6.jpg)
Example
Dynamically allocate an 8 x 8 array of char values
Loop through each element in the array With 1/8 probability, put a 'Q' in the
element, representing a queen Otherwise, put a ' ' (space) in the element
Print out the resulting chessboard Use | and – to mark rows and columns
Print out whether or not there are queens that can attack each other
![Page 7: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/7.jpg)
Process memory segments
Layout for 32-bit architecture Could only
address 4GB Modern layouts
often have random offsets for stack, heap, and memory mapping for security reasons Text
DataBSS
Heap
Memory Mapping
Stack
Kernel Space 1GB
3GB
0xc0000000
0x40000000
0x080480000x00000000
Only for Linux kernel
Memory for function calls
Addresses for memory mapped
files
Dynamically allocated data
Uninitialized globals
Initialized globalsProgram code
![Page 8: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/8.jpg)
Why aren't I showing the 64-bit version? The Linux machines in this lab use 64-bit processors
with 64-bit versions of Ubuntu Our version of gcc supports 64-bit operations
Our pointers are actually 8 bytes in size But 64-bit stuff is confusing
They're still working out where the eventual standard will be
64-bit addressing allows 16,777,216 terabytes of memory to be addressed (which is far beyond what anyone needs)
Current implementations only use 48 bits User space (text up through stack) gets low 128 terabytes Kernel space gets the high 128 terabytes
![Page 9: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/9.jpg)
Let's see those addresses#include <stdio.h>#include <stdlib.h>
int global = 10;
int main(){int stack = 5;int* heap = (int*)malloc(sizeof(int)*100);printf("Stack: %p\n", &stack);printf("Heap: %p\n", heap);printf("Global: %p\n", &global);printf("Text: %p\n", main); return 0;}
![Page 10: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/10.jpg)
Quotes
...One had always assumed there would be no particular difficulty in getting programs right. I can remember the exact instant in time at which it dawned on me that a great part of my future life would be spent finding mistakes in my own programs.
Maurice WilkesFather of EDSACThe first fully operational computer with its own memory
![Page 11: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/11.jpg)
Software EngineeringStarting with some motivation…
![Page 12: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/12.jpg)
Therac-25 Radiation treatment machine for cancer patients
Used June 1985 - Jan 1987 Caused:
At least six serious overdoses Several deaths Many permanently maimed
Radiation treatment is normally around 200 rads 500 rads can be lethal
Therac-25 delivered dosages of over 20,000 rads because of a software error
11 units in US and Canada had treated hundreds of patients over the course of several years
Earlier Therac-20 and Therac-6 models had been in service, without incident, for many years
![Page 13: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/13.jpg)
Problems not caught for two years The doctors involved had never seen radiation
overdoses of this magnitude Manufacturer was both tragically ill-prepared and
probably willfully dishonest Government regulatory agencies slow and out of
the loop The fundamental problem stemmed from the
machine having two different modes Low power which projected a beam directly into the
patient High power which projected a beam onto a beam
spreader plate which changed the kind of radiation and shaped it
![Page 14: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/14.jpg)
Race condition One of the problems behind the Therac-25 disaster was a
race condition What is a race condition?
You should have seen one in CS122 A race condition is when the output of a program is
dependent on the scheduling of certain threads Consider the following, where variable counter starts at 0
and is shared between both threads What is the value of counter after both threads have
executed?//thread 1int i = 0;
for(i = 0; i < 500; i++)counter++;
//thread 2int j = 0;
for(j = 0; j < 500; j++)counter++;
![Page 15: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/15.jpg)
Race conditions in Therac-25 The problem emerged with the Therac-25
only after operators became skilled at typing commands
It took time for the keyboard loop to read keystrokes and time for the magnets to adjust the radiation beam
Operators changed settings faster than the 8-second magnet alignment loop
The device could activate in high power mode with no beam spreader plate
![Page 16: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/16.jpg)
Overflow error Even with the race condition, a safety
check should have prevented the accident There was a loop which checked a counter
The value 0 meant okay The counter was only 1 byte Every 256 cycles, it would roll around to 0 When that happened, the operator could
proceed without a safety check
![Page 17: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/17.jpg)
Subsequent investigation The Therac-25 software was
programmed by a single programmer, who had long since left the company
No one at the company could say anything about his education or qualifications
FDA investigators said Program was poorly documented No specification document No formal test plan
![Page 18: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/18.jpg)
In the programmer's defense Therac-6 and 20 had no computer control, only
add-on computer monitoring Legacy software from the earlier devices had
been adapted Hardware safety devices had been removed,
probably to save cost Programmer had probably been under time
pressure, and had been learning as he went along
Programmer probably had no idea his code would go into a device in which software bugs could kill people
![Page 19: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/19.jpg)
Who is to blame? Techniques for synchronization and data sharing
already existed which would have prevented several of these deaths
What if the programmer had a formal education that involved these techniques or had bothered to study the literature?
What if management had understood software engineering and quality assurance principles?
What if hospitals or regulatory agencies had strong safety requirements for safety-critical software?
![Page 20: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/20.jpg)
Quotes
A significant amount of software for life-critical systems comes from small firms, especially in the medical device industry; firms that fit the profile of those resistant to or uninformed of the principles of either system safety or software engineering.
Frank HoustonFDA investigator into the Therac-25
![Page 21: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/21.jpg)
Will you write important software in your lifetime? Odds are, some of you will write software for
medical devices, cars, planes, spacecraft, major financial institutions, and so on
You have the opportunity here and now to choose the course of your software writing life
Will you comment your code only when you think it's necessary?
Will you write test cases only after you're done, and only if you have time?
Will you have the discipline and courage to write the safe, correct, robust, and reusable software of the future?
![Page 22: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/22.jpg)
Testing
![Page 23: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/23.jpg)
Unit testing
Unit tests are tests for a single piece of code in isolation for the rest of your program
A unit test could test A single method or function A whole class
Give some good unit tests for: Project 1 Project 2 Project 3
![Page 24: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/24.jpg)
Test case selection
Positive test cases Cases that should work, and we can
easily check the answer Boundary condition test cases
Special cases, like deleting the first or last item in a list
Sometimes called "corner cases" Negative test cases
Cases that we know should fail
![Page 25: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/25.jpg)
Test suites
You should made a series of tests for every significant program you write
Include positive, boundary, and negative tests
Create the necessary files for input and output
Use your favorite scripting language to automate the process of testing so that you can easily run all the tests every time you change something
![Page 26: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/26.jpg)
Regression testing
When you find a bug, keep the test case that demonstrated the bug
Include it as part of your test suite Always run all your tests when you
make a change to your code Sometimes a "fix" can break
something that was working Especially if you didn't fix the bug
correctly the first time
![Page 27: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/27.jpg)
Black box testing One philosophy of testing is making black box
tests A black box test takes some input A and knows
that the output is supposed to be B It assumes nothing about the internals of the
program To write black box tests, you come up with a set
of input you think covers lots of cases and you run it and see if it works
In the real world, black box testing can easily be done by a team that did not work on the original development
![Page 28: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/28.jpg)
White box testing White box testing is the opposite of black box
testing Sometimes white box testing is called "clear box
testing" In white box testing, you can use your
knowledge of how the code works to generate tests
Are there lots of if statements? Write tests that go through all possible branches
There are white box testing tools that can help you generate tests to exercise all branches
Which is better, white box or black box testing?
![Page 29: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/29.jpg)
Traces There are some great debugging tools out there,
even for C We'll talk about GDB in a bit Microsoft Visual Studio has very nice debugging tools
for C/C++ in Windows But you (almost) always have printf() (or
some other output function) Don't be shy about using printf() to see
what's going on in your program It is convenient to use #define to make a
special print command that can be turned off when you are no longer debugging
![Page 30: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/30.jpg)
Finally…
Understand each error before you fix it
If you don't understand a bug, you might be able to "fix" it so that one test case succeeds Nevertheless, the real problem might be
unsolved Nothing is harder than truly fixing
problems This is the skill we want to teach you
more than any other
![Page 31: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/31.jpg)
Quotes
Testing can only show the presence of bugs, not their absence.
Edsger DijkstraTuring Award WinnerDesigner of shortest path and MST algorithmsWorked on Dining Philosophers ProblemHates the goto construct
![Page 32: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/32.jpg)
Debugging
![Page 33: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/33.jpg)
printf() debugging
A time-honored technique for debugging is inserting print statements into the code
int i = 0;int count = 0;for( i = 1 ; i <= 100; ++i ); // mistake{
printf("%d\n", i); // see what's upcount += i;
}printf("%d\n", count);
![Page 34: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/34.jpg)
Problems with printf() Using print statements is a good, general
technique However
Be sure not to actually change the state of the program with an i++ or other assignment inside the printf()
It may not be available in some GUI programs or in deep systems programming
It might mess up the output of your program Remember to remove your debug statements
before turning in your code
![Page 35: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/35.jpg)
Another approach It turns out that there are two kinds of
output to the terminal stdout (where everything has gone so far) stderr (which also goes to the screen, but
can be redirected to a different place) The easiest way to use stderr is with fprintf(), which can specify where to print stuff
fprintf(stderr, "Going to stderr\n!");printf("Going to stdout\n!");
![Page 36: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/36.jpg)
Redirecting streams When you redirect stdout, stderr still goes to
the screen
This will be incredibly useful for debugging Project 4
If you want to redirect stderr to a file, you can do that as well with 2>
./program > out.fileThis stderr output still shows up.
./program > out.file 2> error.log
![Page 37: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/37.jpg)
Newline Whether using stderr or stdout, it's critical
that you use a newline (\n) to flush your output Otherwise, the program crash might happen before
your output is seen printf() uses a buffer, but the newline
guarantees that the output will be put on screen
int* pointer = NULL;printf("Made it here!"); // Not printed*pointer = 42; // Crash!
![Page 38: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/38.jpg)
GDB
![Page 39: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/39.jpg)
GDB
GDB (the GNU Debugger) is a debugger available on Linux and Unix systems
It is a command line utility, but it still has almost all the power that the Eclipse debugger does: Setting breakpoints Stepping through lines of code Examining the values of variables at run time
It supports C, C++, Objective-C, Java, and other languages
![Page 40: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/40.jpg)
Prerequisites C doesn't run in a virtual machine To use GDB, you have to compile your
program in a way that adds special debugging information to the executable
To do so, add the -ggdb flag to your compilation
Note: You will not need to do this on Friday's lab
gcc –ggdb program.c –o program
![Page 41: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/41.jpg)
Source code
GDB can step through lines of source code, but it cannot magically reconstruct the source from the file
If you want to step through lines of code, you need to have the source code file in the same directory as the executable where you're running GDB
![Page 42: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/42.jpg)
Starting GDB The easiest way to run GDB is to have it start up
a program Assuming your executable is called program, you
might do it like this:
It is also possible to attach GDB to a program that is running already, but you have to know its PID
You can also run GDB on a program that has died, using the core file (which is why they exist)
gdb program
![Page 43: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/43.jpg)
Basic GDB commandsCommand Shortc
ut Description
run r Start the program runninglist 135 l List the code near line 135
list function l List the code near the start of function()
print variable p Print the value of an expressionbacktrace bt List a stack tracebreak 29 b Set a breakpoint on line 29
break function b Set a breakpoint at the start of function()
continue c Start running again after stopping at a breakpoint
next n Execute next line of code, skipping over a function
step s Execute next line of code, stepping into a function
quit q Quit using GDB
![Page 44: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/44.jpg)
GDB tips
Set breakpoints before running the code The print command is absurdly powerful
You can type print x = 10, and it will set the value of x to 10
This kind of manipulation will be key to solving the next lab
For more information, use the help command in GDB
You can also list your breakpoints by typing info breakpoints
![Page 45: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/45.jpg)
Upcoming
![Page 46: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/46.jpg)
Next time…
Strings to integer conversion Users and groups
![Page 47: CS222](https://reader036.fdocuments.in/reader036/viewer/2022062816/5681623f550346895dd2778b/html5/thumbnails/47.jpg)
Reminders
Start work on Project 4 Read LPI Chapter 8