50
Nelson Speaker Series Wed., Dec. 1, 7:00 pm in Galileo Today's software is riddled with errors that can lead to catastrophic failures and vulnerabilities that compromise system integrity. This talk argues that we can greatly improve software reliability by capturing the "design rules" that govern a program and automatically preventing violations of such rules in the code. We have demonstrated the usefulness of this paradigm by developing concrete programming tools that can detect memory leaks statically, find root causes of complex errors, and translate application-specific design rules automatically into static and dynamic checkers. Monica Lam, Stanford The Ariane problem was due to a type error: a cast from a long integer to a short integer, which should only have been applied to a number less than 32768, was erroneously applied to a larger number that represented the "horizontal bias" of the flight. There was no code to handle the error, so it followed the usual fate of such exceptions and crashed the entire software, the on-board computers, and the mission. ESA’s Ariane 5 rocket 6/4/96

Nelson Speaker Series

  • Upload
    galia

  • View
    22

  • Download
    0

Embed Size (px)

DESCRIPTION

Nelson Speaker Series. - PowerPoint PPT Presentation

Citation preview

Page 1: Nelson Speaker Series

Nelson Speaker Series

Wed., Dec. 1, 7:00 pm in Galileo

Today's software is riddled with errors that can lead to catastrophic failures and vulnerabilities that compromise system integrity. This talk argues that we can greatly improve software reliability by capturing the "design rules" that govern a program and automatically preventing violations of such rules in the code. We have demonstrated the usefulness of this paradigm by developing concrete programming tools that can detect memory leaks statically, find root causes of complex errors, and translate application-specific design rules automatically into static and dynamic checkers.

Monica Lam, Stanford

The Ariane problem was due to a type error: a cast from a long integer to a short integer, which should only have been applied to a number less than 32768, was erroneously applied to a larger number that represented the "horizontal bias" of the flight. There was no code to handle the error, so it followed the usual fate of such exceptions and crashed the entire software, the on-board computers, and the mission.

ESA’s Ariane 5 rocket 6/4/96

Page 2: Nelson Speaker Series

• HW 14 (1 problem) M/T sections

W/Th sections

due Sunday, 12/5 at midnight

due Monday, 12/6 at midnightRecitation -- Friday @ 8am

• Final project: a movie database (inspired by www.imdb.com )

CS 5 Today

Software Engineering:

Human vs. Computer views of the same

information…

Page 3: Nelson Speaker Series

Building from Hw 12: CS5App class

Choose an option from the following menu:

0 Display All Directors 1 Display All Films 2 Display Films by Title (or piece) 3 Display Films by Director 4 Display Films by Year 5 Display Films by Rating (G, PG, PG-13, R, NC-17, UC) 6 Display Films by Review (0 to 10) 7 Add a New Film

8 Save database to file 9 Read database from file

42 Quit

start with Hw14Pr1.zip

Page 4: Nelson Speaker Series

Methodsclass FilmDB

class DirectorDB

class Film

class Director

public FilmDB(int capacity) public boolean isFull() public void addFilm(Film f) public void displayAllFilms()public void saveAllFilms() public void displayFilmsByTitle(String titlepiece) public void displayFilmsByYear(int year) public void displayFilmsByRating(String rating) public void displayFilmsByReview(double minreview)public boolean checkForFilm(String fulltitle) public int getCount() public int getCapacity()

public Film(String title, int year, String rating, double review, Director dir)

public String getTitle() public int getYear();public String getRating() public double getReview() public void display() public void save()

others are OK, too

public Director(String fname, String lname, int capacity) public String getFullName() public String getLName()public FilmDB getFilmDB() public String getFName()

public DirectorDB(int capacity) public void displayAllDirectors() public void displayFilmsByDirector(String fname, String lname) public Director findDirectorByName(String fname, String lname) public void addDirector(Director dir) public int getCount() public boolean isFull()

private Film[] films;private int count;private int capacity;

private String title;private int year;private String rating;private double review;private Director dir;

private Director[] dirs;private int count;private int capacity;

private String fname;private String lname;private FilmDB filmDB;

class CS5App public static void main(String[] args) static void printMenu() static void saveDB(String filePart)static void readFilmEntry() static void readDB(String filePart)

static FilmDB F;static DirectorDB D;

Page 5: Nelson Speaker Series

A film database: “Human” view

1002Lord of the Rings: Return of the KingJacksonPeter2003PG-139.0GigliBrestMartin2003R2.2

this is in the file twofilms.txt

Page 6: Nelson Speaker Series

A film database: “Human” view

1002Lord of the Rings: Return of the KingJacksonPeter2003PG-139.0GigliBrestMartin2003R2.2

capacity of database

count of Films that follow

titleL

nameF nameyearrating

review

the same sequence of data for each Film object

this is in the file twofilms.txt

use H.nl() to input Strings!

Page 7: Nelson Speaker Series

class Director

class FilmString titleint year

String ratingdouble review

Director dirDirector

dir

String fname

String lname

FilmDB filmDB FilmDBfilmDB

class FilmDBint count

Film[] filmsFilm[]films

films[0] films[1]

class DirectorDBint count

Director[] dirs Director[]dirs

dirs[0] dirs[1]

objects:

D

d

f

F

A film database: “Computer” view

Page 8: Nelson Speaker Series

class Director

class FilmString titleint year

String ratingdouble review

Director dirDirector

dir

String fname

String lname

FilmDB filmDB FilmDBfilmDB

class FilmDBint count

Film[] filmsFilm[]films

films[0] films[1]

class DirectorDBint count

Director[] dirs Director[]dirs

dirs[0] dirs[1]

A film database: “Computer” view

relationships among data…

Page 9: Nelson Speaker Series

Never send a human to do a machine’s job- Agent Smith, The Matrix

Page 10: Nelson Speaker Series

public static void saveDB(String fileNamePart){ String fullFileName = "../" + fileNamePart + ".txt"; H.pl("Saving the database's contents to the file " + fullFileName); H.outputToFile(fullFileName); // redirect the output to a file H.pl(F.getCapacity()); // print the capacity (length of the array) H.pl(F.getCount()); // print the count (# of actual films) F.saveAllFilms(); // print all film data to the file H.outputToConsole(); // redirect subsequent output to the console} public static void readDB(String fileNamePart) { String fullFileName = "../" + fileNamePart + ".txt"; H.pl("Loading database contents from file " + fullFileName); H.inputFromFile(fullFileName); // redirect input to come from the file int capacity = H.ni(“Capacity:”); // reads in the capacity, an int F = new FilmDB(capacity); // trashes old F and creates a new one D = new DirectorDB(capacity); // trashes old D and creates a new one int count = H.ni(“Count:”); // reads in the count, an int for (int i = 0; i < count; i++) // for each film listed (up to count)... { readFilmEntry(); // read that film's entry into F } H.inputFromConsole(); // take subsequent input from the console}

public static void readFilmEntry() // method to read 1 film entry

Human Computer translation code in Hw14Pr1.zip

Page 11: Nelson Speaker Series

public static void saveDB(String fileNamePart){ String fullFileName = "../" + fileNamePart + ".txt"; H.pl("Saving to the file " + fullFileName); H.outputToFile(fullFileName); H.pl(F.getCapacity()); H.pl(F.getCount()); F.saveAllFilms(); H.outputToConsole(); }

Saving the database code in Hw14Pr1.zip

1002LOTR: ROTKJacksonPeter2003PG-139.0GigliBrestMartin2003R2.2file

Page 12: Nelson Speaker Series

public static void readDB(String fileNamePart) { String fullFileName = "../" + fileNamePart + ".txt"; H.pl("Loading DB from file " + fullFileName); H.inputFromFile(fullFileName); int capacity = H.ni(“Capacity:”);

F = new FilmDB(capacity); D = new DirectorDB(capacity); int count = H.ni(“Count:”); for (int i = 0; i < count; i++) { readFilmEntry(); }

H.inputFromConsole(); }

Reading the database code in Hw14Pr1.zip

1002LOTR: ROTKJacksonPeter2003PG-139.0GigliBrestMartin2003R2.2file

Page 13: Nelson Speaker Series

Constructors

• create an object F of type FilmDB

• same thing for the object D of type DirectorDB

private static FilmDB F; // outside of main

public static void main(String[] args) { F = new FilmDB(100); // capacity == 100

in CS5App

in FilmDB

public FilmDB(int capacity)

private Film[] films;private int count;

FilmDB data

Page 14: Nelson Speaker Series

Option 7: readFilmEntry

1) Prompt for the title * Make sure that title is not yet in F

2) Prompt for the director: LName, FName * Check to see if that director is already in D Create and add the director to D, if necessary

3) Get the year, rating (G, PG), and review (0.0 - 10.0)

4) Create and add the film to F

5) Add the film to the director’s personal FilmDB

Be sure to find/create/add all of the objects needed…

checkForFilm

findDirectorByName

Page 15: Nelson Speaker Series

Constructors

• when adding a film… create a Director (if necessary)

• create a Film

// prompt for the director’s last and first namesDirector d = D.findDirectorByName(LN, FN);if (d == null) d = new Director(FN,LN,F.getCapacity());

in Director

public Director(String FN, String LN, int capacity)

Film f = new Film(…)

private FilmDB filmDB;private String fname;private String lname;

Director data

in readFilmEntry

in CS5App

Page 16: Nelson Speaker Series

null: the nonexistent object

Any object (or array) can be set to null. All objects (and arrays) are initially set to null.

The new operator creates a real (non-null) object.

Filmf

a reference pointing to nothing!

Film f;Film f = null;

Don’t try to call a method on a null reference!

equivalent statements

Filmf

Film f = new Film(…);

String title

String ratingint year

methods & data

Page 17: Nelson Speaker Series

The database(s)

Film[]films

films[0] films[1] films[2] films[3] films[4]

What is the count vs. the capacity of a FilmDB ?

FilmDBF

int countFilm[] films

FilmDB class

Page 18: Nelson Speaker Series

Count vs. capacity

int countFilm[] films

Film[]films

films[0] films[1] films[2] films[3] films[4]FilmDBF

if (F.isFull()) H.pl(“Sorry! Buy me more memory!”);

in main(option 7)

in FilmDB

public boolean isFull(){

Film Film Film Film Film

FilmDB class

Page 19: Nelson Speaker Series

Getters / Setters

int year

String title

DirectordirFilm

f

if (f.getYear() == 2006) H.pl(“That movie hasn’t come out yet!”);

else where

in Film

public int getYear(){

String rating

double review

Director dir

Film class

Page 20: Nelson Speaker Series

Retrieving information All films of a certain year...

public void displayFilmsByYear(int year){

in FilmDB

int countFilm[] films

Film[]films films[0] films[1] films[2] films[3]

Film Film Film

FilmDBF

FilmDB class

Page 21: Nelson Speaker Series

Displaying/Saving a film…

int year

String title

DirectordirFilm

f

f.display(); // prints contents of f to the screen f.save(); // prints contents of f to a file

else where

in Film

public void save() // the formatting is crucial!{

String rating

double review

Director dir

Film class

Page 22: Nelson Speaker Series

A film database: “Human” view

1002Lord of the Rings: Return of the KingJacksonPeter2003PG-139.0GigliBrestMartin2003R2.2

this is in the file twofilms.txt

Page 23: Nelson Speaker Series

Quiz Recursive Movies

public void displayFilmsByYear(int year, int x){

}

For extra credit this week, use recursion for display, finding, & adding films and directors.

in the FilmDB class

Use recursion to display all of the films that match the input year. Assume that x starts at

0.

(Hw14 ExCr)

Page 24: Nelson Speaker Series

Quiz, p.2

public boolean checkForFilm(String title, int x){

}

Write the checkForFilm method that returns true if a film with the input title is

already in the database, and false otherwise.

in the FilmDB class

Use recursion,if you like; assume that x starts at 0.

Page 25: Nelson Speaker Series

Methodsclass FilmDB

class DirectorDB

class Film

class Director

public FilmDB(int capacity) public boolean isFull() public void addFilm(Film f) public void displayAllFilms()public void saveAllFilms() public void displayFilmsByTitle(String titlepiece) public void displayFilmsByYear(int year) public void displayFilmsByRating(String rating) public void displayFilmsByReview(double minreview)public boolean checkForFilm(String fulltitle) public int getCount() public int getCapacity()

public Film(String title, int year, String rating, double review, Director dir)

public String getTitle() public int getYear();public String getRating() public double getReview() public void display() public void save()

others are OK, too

public Director(String fname, String lname, int capacity) public String getFullName() public String getLName()public FilmDB getFilmDB() public String getFName()

public DirectorDB(int capacity) public void displayAllDirectors() public void displayFilmsByDirector(String fname, String lname) public Director findDirectorByName(String fname, String lname) public void addDirector(Director dir) public int getCount() public boolean isFull()

private Film[] films;private int count;private int capacity;

private String title;private int year;private String rating;private double review;private Director dir;

private Director[] dirs;private int count;private int capacity;

private String fname;private String lname;private FilmDB filmDB;

class CS5App public static void main(String[] args) static void printMenu() static void saveDB(String filePart)static void readFilmEntry() static void readDB(String filePart)

static FilmDB F;static DirectorDB D;

Page 26: Nelson Speaker Series

Methodsclass FilmDB

class DirectorDB

class Film

class Director

public FilmDB(int capacity) public boolean isFull() public void addFilm(Film f) public void displayAllFilms()public void saveAllFilms() public void displayFilmsByTitle(String titlepiece) public void displayFilmsByYear(int year) public void displayFilmsByRating(String rating) public void displayFilmsByReview(double minreview)public boolean checkForFilm(String fulltitle) public int getCount() public int getCapacity()

public Film(String title, int year, String rating, double review, Director dir)

public String getTitle() public int getYear();public String getRating() public double getReview() public void display() public void save()

others are OK, too

public Director(String fname, String lname, int capacity) public String getFullName() public String getLName()public FilmDB getFilmDB() public String getFName()

public DirectorDB(int capacity) public void displayAllDirectors() public void displayFilmsByDirector(String fname, String lname) public Director findDirectorByName(String fname, String lname) public void addDirector(Director dir) public int getCount() public boolean isFull()

private Film[] films;private int count;private int capacity;

private String title;private int year;private String rating;private double review;private Director dir;

private Director[] dirs;private int count;private int capacity;

private String fname;private String lname;private FilmDB filmDB;

class CS5App public static void main(String[] args) static void printMenu() static void saveDB(String filePart)static void readFilmEntry() static void readDB(String filePart)

static FilmDB F;static DirectorDB D;

Page 27: Nelson Speaker Series

Adding to the Database(s)

Goal: output films in alphabetical order

int countFilm[] films

Film[]films films[0] films[1]

Film f

films[2] films[3] films[4]

String title (“LOTR: ROTK”)

int year (2003)methods & other data…

Film Film Film

a Film to be added to our database…

H. P. S. W. ?

Page 28: Nelson Speaker Series

Imposing order

films[0] films[1] films[2] films[3] films[4]

(Method 1) Add the new film at the end and call sort

From Justin to Kelly

films[5]

Da Hip Hop Witch

The World of Batwoman

Gigli

Page 29: Nelson Speaker Series

Keeping order

(Method 2) Travel down the list, moving films over to find the right place for the new film

films[0] films[1] films[2] films[3] films[4] films[5]

Shawshank Redemption

Seven Samurai

Lord of the Rings: ROTK

Page 30: Nelson Speaker Series

Keeping order

(2) Travel down the list, moving films over to find the right place for the new film

films[0] films[1] films[2] films[3] films[4] films[5]

Godfather

Shawshank Redemption

Seven Samurai

Lord of the Rings: ROTK

start

Page 31: Nelson Speaker Series

Keeping order

(2) Travel down the list, moving films over to find the right place for the new film

films[0] films[1] films[2] films[3] films[4] films[5]

Godfather

Shawshank Redemption

compare

Seven Samurai

Lord of the Rings: ROTK

start

Page 32: Nelson Speaker Series

Keeping order

(2) Travel down the list, moving films over to find the right place for the new film

films[0] films[1] films[2] films[3] films[4] films[5]

Godfather

Shawshank Redemption

move overSeven Samurai

Lord of the Rings: ROTK

next up

Page 33: Nelson Speaker Series

Keeping order

(2) Travel down the list, moving films over to find the right place for the new film

films[0] films[1] films[2] films[3] films[4] films[5]

Godfather

Shawshank Redemption

compareSeven Samurai

Lord of the Rings: ROTK

next up

Page 34: Nelson Speaker Series

Keeping order

(2) Travel down the list, moving films over to find the right place for the new film

films[0] films[1] films[2] films[3] films[4] films[5]

Godfather

Shawshank Redemption

move over

Seven Samurai

Lord of the Rings: ROTK

next up

Page 35: Nelson Speaker Series

Keeping order

(2) Travel down the list, moving films over to find the right place for the new film

films[0] films[1] films[2] films[3] films[4] films[5]

Godfather

Shawshank Redemption

compare

Seven Samurai

Lord of the Rings: ROTK

next up

Page 36: Nelson Speaker Series

Keeping order

(2) Travel down the list, moving films over to find the right place for the new film

films[0] films[1] films[2] films[3] films[4] films[5]

Godfather

Shawshank Redemption

placeSeven Samurai

Lord of the Rings: ROTK

DONE!

Page 37: Nelson Speaker Series

Keeping order

(2) Travel down the list, moving films over to find the right place for the new film

films[0] films[1] films[2] films[3] films[4] films[5]

Godfather

Shawshank Redemption

Seven Samurai

or, equivalently...

Lord of the Rings: ROTK

Page 38: Nelson Speaker Series

compareTo method

String s = “startrek”;

s.compareTo(“starwars”) is < 0

s.compareTo(“starman”) is > 0

s.compareTo(“startrek”) is == 0

s.compareToIgnoreCase(…)

0 1 2 3 4 5 6 7

works the same way, but without considering upper/lower case

distinctions

Page 39: Nelson Speaker Series

Keeping order

public void addFilm(Film f) (in FilmDB) {

Page 40: Nelson Speaker Series

Other notes: indexOf

• When printing out all films that match a certain title, allow matches to any part of the title… use indexOf():

String s = “startrek”;

s.indexOf(“trek”) is 4 s.indexOf(“art”) is 2 s.indexOf(“wart”) is -1

-1 if the input is NOT a substring at all. Use this to decide which films to

display…

Returns the index of the location of the substring.

Page 41: Nelson Speaker Series

Parting Wisdom

There is a difference between knowing the path and walking the path.

Lab this week (optional):

You may (will) want to start early on this one…

- Morpheus, The Matrix

Page 42: Nelson Speaker Series

Other notes

• When printing out all films that match a certain title, allow matches to any part of the title… use indexOf():

String s = “startrek”;

s.indexOf(“trek”) is 4 s.indexOf(“art”) is 2 s.indexOf(“wart”) is -1

Negative if the input is NOT contained as a substring. Use this to determine which ones

to display…

• When finding a director, look through the list for matches and return null if not yet in the database...

public Director findDirByName(String LN, String FN){ // loop through all of the directors // if both names match, return that director object // if nothing matches, return null}

Page 43: Nelson Speaker Series

A film database:

class Director

class FilmString titleint year

String ratingdouble review

Director dirDirector

dir

String fname

String lname

FilmDB filmDB FilmDBfilmDB

class FilmDBint count

Film[] filmsFilm[]films

films[0] films[1]

class DirectorDBint count

Director[] dirs Director[]dirs

dirs[0] dirs[1]

Page 44: Nelson Speaker Series

Adding to the Database(s)

Goal: output films in alphabetical order

int countFilm[] films

Film[]films films[0] films[1]

Film f

films[2] films[3] films[4]

String title (“LordOfTheRings”)

int year (2001)methods & other data…

Film Film Film

a brand new Film

TitanicStar WarsJ. Park

Page 45: Nelson Speaker Series

Other hints

• When finding a film name, allow the user to inputa part of the name to look up -- use indexOf():

String s = “startrek”;

s.indexOf(“trek”) is 4 s.indexOf(“art”) is 2

s.indexOf(“wart”) is -1

useful for checking if a string contains a

particular substring!

Page 46: Nelson Speaker Series

CS 5 Today

• HW 14 (1 problem) M/T sections

W/Th sections

due Sunday, 12/7 at midnight

due Monday, 12/8 at midnightRecitation -- Friday @ 8am

• The complexity of programs

We can sort a list of 5 elements, how about one of 500,000 ?

• HW problem problems? Let me know!

or, the need for speed...

vs. problems we don’t know how to do at all! (Next week)

80 10 42 7 73L H

Page 47: Nelson Speaker Series

public Director(String fname, String lname, int capacity) public String getFullName() public String getLName()public FilmDB getFilmDB() public String getFName()

Methodsclass FilmDB

class DirectorDB

class Film

class Director

public FilmDB(int capacity) public boolean isFull() public int getCount() public void addFilm(Film f) public Film findFilmByTitle(String title) public void displayAllFilms() public void displayFilmsByTitle(String titlepiece) public void displayFilmsByYear(int year) public void displayFilmsByRating(String rating) public void displayFilmsByReview(double minreview)

public Film(String title, int year, String rating, double review, Director dir)

public String getTitle() public int getYear() public String getRating() public double getReview() public void display()

public DirectorDB(int capacity) public void displayAllDirectors() public void displayFilmsByDirector(String fname, String lname) public Director findDirectorByName(String fname, String lname) public void addDirector(Director dir) public int getCount() public boolean isFull()

Page 48: Nelson Speaker Series

Methodsclass FilmDB

class DirectorDB

class Film

class Director

public FilmDB(int capacity) public boolean isFull() public int getCount() public void addFilm(Film f) public boolean checkForFilm(String fulltitle) public void displayAllFilms() public void displayFilmsByTitle(String titlepiece) public void displayFilmsByYear(int year) public void displayFilmsByRating(String rating) public void displayFilmsByReview(double minreview)

public Film(String title, int year, String rating, double review, Director dir)

public String getTitle() public int getYear() public String getRating() public double getReview() public void display()

others are OK, too

public Director(String fname, String lname, int capacity) public String getFullName() public String getLName()public FilmDB getFilmDB() public String getFName()

public DirectorDB(int capacity) public void displayAllDirectors() public void displayFilmsByDirector(String fname, String lname) public Director findDirectorByName(String fname, String lname) public void addDirector(Director dir) public int getCount() public boolean isFull()

private Film[] films;private int count;private int capacity;

private String title;private int year;private String rating;private double review;private Director dir;

private Director[] dirs;private int count;private int capacity;

private String fname;private String lname;private FilmDB filmDB;

Page 49: Nelson Speaker Series

Methodsclass FilmDB

class DirectorDB

class Film

class Director

public FilmDB(int capacity) public boolean isFull() public int getCount() public void addFilm(Film f) public void displayAllFilms()public void saveAllFilms() public void displayFilmsByTitle(String titlepiece) public void displayFilmsByYear(int year) public void displayFilmsByRating(String rating) public void displayFilmsByReview(double minreview)public boolean checkForFilm(String fulltitle)

public Film(String title, int year, String rating, double review, Director dir)

public String getTitle() public int getYear() public String getRating() public double getReview() public void display()public void save()

others are OK, too

public Director(String fname, String lname, int capacity) public String getFullName() public String getLName()public FilmDB getFilmDB() public String getFName()

public DirectorDB(int capacity) public void displayAllDirectors() public void displayFilmsByDirector(String fname, String lname) public Director findDirectorByName(String fname, String lname) public void addDirector(Director dir) public int getCount() public boolean isFull()

private Film[] films;private int count;private int capacity;

private String title;private int year;private String rating;private double review;private Director dir;

private Director[] dirs;private int count;private int capacity;

private String fname;private String lname;private FilmDB filmDB;

class CS5App public static void main(String[] args) static void printMenu() static void saveDB(String filePart)static void readFilmEntry() static void readDB(String filePart)

static FilmDB F;static DirectorDB D;

Page 50: Nelson Speaker Series

Sorting recursively

void moveMinToLeft(double[] A, int L, int U){ if (L == U) return; if (A[L] > A[U]) // should we swap the last? { double x = A[L], y = A[U]; A[L] = y; A[U] = x; } moveMinToLeft(A,L,U-1); // need to swap the rest…}

void sort(double[] A, int L, int U){ if (L >= U) return; moveMinToLeft(A,L,U); // sort the first element sort(A,L+1,U); // sort the rest of them }

80 10 42 7 73

L U

A