When Brunel s ship the SS Great Britain was launched into the River Thames, it made such a splash that several spectators on the opposite bank were

Similar documents
n Specifying what each method does q Specify it in a comment before method's header n Precondition q Caller obligation n Postcondition

Outline. software testing: search bugs black-box and white-box testing static and dynamic testing

1. true / false By a compiler we mean a program that translates to code that will run natively on some machine.

CSC313 High Integrity Systems/CSCM13 Critical Systems. CSC313/CSCM13 Chapter 2 1/ 221

Examining the Code. [Reading assignment: Chapter 6, pp ]

Memory Safety (cont d) Software Security

Assertions, pre/postconditions

CS 161 Computer Security

Testing. Prof. Clarkson Fall Today s music: Wrecking Ball by Miley Cyrus

CSE331 Spring 2015, Final Examination June 8, 2015

Software Testing Lecture 1. Justin Pearson

Full file at

Lecture 10: Introduction to Correctness

Handout 10: Imperative programs and the Lambda Calculus

Software Testing. Software Testing

EXAMINING THE CODE. 1. Examining the Design and Code 2. Formal Review: 3. Coding Standards and Guidelines: 4. Generic Code Review Checklist:

CITS5501 Software Testing and Quality Assurance Formal methods

Checking Program Properties with ESC/Java

CPS122 Lecture: From Python to Java last revised January 4, Objectives:

Coding and Unit Testing! The Coding Phase! Coding vs. Code! Coding! Overall Coding Language Trends!

How invariants help writing loops Author: Sander Kooijmans Document version: 1.0

CPSC 310: Sample Final Exam Study Questions 2014S1 (These are in addition to the Study Questions listed at the end of some lectures)

Types, Expressions, and States

LESSON 1. A C program is constructed as a sequence of characters. Among the characters that can be used in a program are:

COBOL's dominance in underlined by the reports from the Gartner group.

Static Analysis Techniques

CS 242. Fundamentals. Reading: See last slide

Axiomatic Specification. Al-Said, Apcar, Jerejian

"Secure" Coding Practices Nicholas Weaver

Summer May 11, 2010

Testing. ECE/CS 5780/6780: Embedded System Design. Why is testing so hard? Why do testing?

CS 315 Software Design Homework 3 Preconditions, Postconditions, Invariants Due: Sept. 29, 11:30 PM

printf( Please enter another number: ); scanf( %d, &num2);

CSE 374 Programming Concepts & Tools. Hal Perkins Fall 2015 Lecture 15 Testing

WELCOME! (download slides and.py files and follow along!) LECTURE 1

G Programming Languages - Fall 2012

Testing and Debugging Lecture 11

Lecture 7: Data Abstractions

Computer Science 217

Practice Problems. Review, with SOME solutions

III. Check if the divisors add up to the number. Now we may consider each of these tasks separately, assuming the others will be taken care of

Program development plan

Jtest Tutorial. Tutorial

18-642: Code Style for Compilers

Second assignment came out Monday evening. Find defects in Hnefetafl rules written by your classmates. Topic: Code Inspection and Testing

Warm-Up Problem. Let be a set of well-formed Predicate logic formulas. Let be well-formed Predicate logic formulas. Prove or disprove the following.

Types and Static Type Checking (Introducing Micro-Haskell)

LECTURE 17. Expressions and Assignment

Curriculum Map Grade(s): Subject: AP Computer Science

CS Lecture 19: Loop invariants

Ian Sommerville 2006 Software Engineering, 8th edition. Chapter 22 Slide 1

Lecture 1 Contracts. 1 A Mysterious Program : Principles of Imperative Computation (Spring 2018) Frank Pfenning

Lecture 6: Specifications & Testing

Final Exam. COMP Summer I June 26, points

CSI33 Data Structures

Verification and Validation. Verification and validation

Writing better code Loop invariants Correctness. John Edgar 2

a. The following method would allow an object of the static type List<String> to be passed to it as an argument.

Depiction of program declaring a variable and then assigning it a value

Program Correctness and Efficiency. Chapter 2

CSE331 Winter 2014, Midterm Examination February 12, 2014

Intermediate Code Generation

CS61C Machine Structures. Lecture 4 C Pointers and Arrays. 1/25/2006 John Wawrzynek. www-inst.eecs.berkeley.edu/~cs61c/

Software Testing. Testing: Our Experiences

1 A question of semantics

Chapter 3 (part 3) Describing Syntax and Semantics

Black Box Testing. EEC 521: Software Engineering. Specification-Based Testing. No Source Code. Software Testing

Control Structures. Lecture 4 COP 3014 Fall September 18, 2017

CPS122 Lecture: From Python to Java

Question 1: What is a code walk-through, and how is it performed?

Program Verification (6EC version only)

Programming in the Real World. Dr. Baldassano Yu s Elite Education

Programming Languages Third Edition

PRG PROGRAMMING ESSENTIALS. Lecture 2 Program flow, Conditionals, Loops

CSE331 Winter 2014, Midterm Examination February 12, 2014

Software Design Fundamentals. CSCE Lecture 11-09/27/2016

Lecture 1 Contracts : Principles of Imperative Computation (Fall 2018) Frank Pfenning

STUDENT LESSON A12 Iterations

Code verification. CSE 331 University of Washington. Michael Ernst

Overview The Java Modeling Language (Part 1) Related Work

CS112 Lecture: Variables, Expressions, Computation, Constants, Numeric Input-Output

Types and Static Type Checking (Introducing Micro-Haskell)

What Is Computer Science? The Scientific Study of Computation. Expressing or Describing

Introduction to Computers and C++ Programming p. 1 Computer Systems p. 2 Hardware p. 2 Software p. 7 High-Level Languages p. 8 Compilers p.

Programming language design and analysis

Darshan Institute of Engineering & Technology for Diploma Studies

CSCI 1100L: Topics in Computing Lab Lab 11: Programming with Scratch

Text Input and Conditionals

(Refer Slide Time: 00:26)

COMP 202 Java in one week

Department of Computer Science COMP The Programming Competency Test

Slide Set 1. for ENEL 339 Fall 2014 Lecture Section 02. Steve Norman, PhD, PEng

Semantics of programming languages

Objectives. Chapter 19. Verification vs. validation. Topics covered. Static and dynamic verification. The V&V process

Testing! Prof. Leon Osterweil! CS 520/620! Spring 2013!

Organization of Programming Languages (CSE452) Why are there so many programming languages? What makes a language successful?

(From Glenford Myers: The Art of Software Testing)

Introduction to Problem Solving and Programming in Python.

CIS24 Project #3. Student Name: Chun Chung Cheung Course Section: SA Date: 4/28/2003 Professor: Kopec. Subject: Functional Programming Language (ML)

Reasoning About Imperative Programs. COS 441 Slides 10

Transcription:

C. A. R. Hoare Emeritus Professor of Computing at the University of Oxford and is now a senior researcher at Microsoft Research in Cambridge, England. He received the 1980 ACM Turing Award for his fundamental contributions to the definition and design of programming languages. Knighted by the Queen of England in 2000.

When Brunel s ship the SS Great Britain was launched into the River Thames, it made such a splash that several spectators on the opposite bank were drowned. Nowadays, engineers reduce the force of entry into the water by rope tethers which are designed to break at carefully calculated intervals. When the first computer came into operation in the Mathematish Centrum in Amsterdam, one of the first tasks was to calculate the appropriate intervals and breaking strains of these tethers. In order to ensure the correctness of the program which did the calculations, the programmers were invited to watch the launching from the first row of the ceremonial viewing stand set up on the opposite bank. They accepted and they survived.

... [1.5 pages omitted] I therefore suggest that we should explore an additional method, which promises to increase the reliability of programs. The same method has assisted the reliability of designs in other branches of engineering, namely the use of mathematics to calculate the parameters and check, the soundness of a design before passing it for construction and installation. C. A. R. Hoare, New Scientist, 18 September 1986.

Correct Programming Most people can learn to write simple programs. Few people can learn to write correct programs. In September 1999, NASA s Mars Climate Orbiter crashed into Mars instead of going into orbit. Preliminary findings indicated that one team of programmers used English units while the other used metric units for a key spacecraft operation. Total mission cost of $327.6 million.

Programming Without Thought If I let my fingers wander idly over the keys of a typewriter it might happen that my screed made an intelligible sentence. If an army of monkeys were strumming on typewriters they might write all the books in the British Museum. A. S. Eddington. The Nature of the Physical World: The Gifford Lectures, 1927. New York: Macmillan, 1929, page 72.

Levels of Correctness 1. legal according to syntax rules 2.... fine print 3. good style 4. makes sense 5. no runtime errors 6. works on some data (tested) 7. formal correctness with respect to some specification 8. is correct

Correctness The opening levels of correctness are more familiar since they are obvious parts of the development cycle. It is the later levels which are more subtle and difficult. One reason that state of software in the world is disappointing is that programmers tend to pay less attention to the later levels because 1. they are unwilling to put in the effort, 2. they are pressed for time, or 3. not enough emphasis is placed on correctness. For this reason it is important to examine correctness.

Syntax The Java compiler checks to see if the input file conforms to a precise set of syntax rules. Adherence to syntax rules is necessary for the program to successfully communicate its actions to the computer and to any human reader. Advanced Java programmer know more constructs enabling them to do write more complex programmer easier than novice programs. For example,?:, for-each loops, exception handling, interfaces, generics, wildcards, and so on. The compiler may check that the program uses the constructs properly, but it does not teach the programmer how to use them.

Semantics In addition to the syntax checks, the compiler checks lots of obvious and not so obvious rules. For example, the programmer is free to choose any syntactically correct identifier to refer to objects in the program, but it is a rule that the identifier must be declared somewhere. So, if the programmer misspells a name, this will lead to a semantic error.

Style good identifier names indent consistently, use white space judiciously use exception handling do not use gotos or multiple return avoid import.* localize declarations avoid side effects: use functions, avoid non-local variables modularize

Localize Scope Declare variables right before you need them. Initialize the variable with the value you need. Don t reuse the variable with a different value or purpose. Mark the variable as final.

Runtime Errors Some languages do not check for runtime errors. This leads to something worse than a runtime error the absence of a runtime error. For example, by not checking array indexes or doing illegal operations on pointers, C and C++ allow the program to write over useful parts of memory. This is called a buffer overflow and is the cause of much malware. This is not possible in Java, Ada (checks can be suppressed), C#, Python, Modula-3, Haskell, or any recently designed high-level language.

Runtime Errors java.lang.arithmeticexception (e.g., division by zero) java.lang.nullpointerexception ( billion dollar mistake ) java.lang.arrayindexoutofbounds These represent a certain type of logical error in the program. Java was designed so that compiler would detect at compile-time many things which would be runtime errors in other languages. No language can eliminate runtime errors altogether; no language can eliminate logical errors. Billion Dollar Mistake presentation by Hoare in 2009.

Testing code walk-throughs, code inspection unit testing integration testing bottom-up testing, drivers top-down testing, stubs regression testing black-box testing white-/clear-/glass- box testing statement and path coverage

Assertions Assertion. An assertion is a boolean-valued expression relating the program variables, e.g., x>0, or x+y>0. Precondition. A precondition is an assertion that must be true, if the following statement or block of code in the program is to work correctly. To make use of code correctly, one must insure that the preconditions are met. Postcondition. A postcondition is an assertion that is true, after a statement or block of code has been executed, if the preconditions are met. The code author promises that the postconditions will be achieved.

Assert statement Examples in Java...

Class Invariant A property that remains true about an object after every method call on the object. E.e., Account balance is always non-negative.

Loop Invariant It is not possible to understand a program completely by mentally executing it. The number of states is too large to comprehend. Well-constructed programs have meaningful relationships among the program variables, and even though the values of the variables change the relationships do not. It is through these unchanging relationships that it is possible to understand and to write correct programs. Loop invariant. A loop invariant is an assertion relating the values of the program variables which is true before and after every execution of the body of a loop. Invariants are a bridge from the mutable world of the machine to the timeless truths of mathematics.

The following game illustrates the power of an invariant to understand dynamic systems.

Red and Blue take alternating turns, with Red going first. Red takes a turn by drawing a red line segment, either horizontal or vertical, connecting any two adjacent points on the grid that are not yet connected by any line segment. Blue takes a turn by doing the same thing, except that the line segment drawn is blue. Red s goal is to form a closed curve (i.e., a sequence of (four or more) distinct line segments starting at some point and returning to that point) comprised entirely of red line segments. Blue s goal is to prevent Red from doing so. The game ends when either Red has formed a closed curve or there are no more line segments to draw. 6........ 5........ 4........ 3........ 2........ 1........ 1 2 3 4 5 6 7 8

public static int sum(int a[]) { int s = 0; for (int i = 0; i < a. length; i ++) { // s is the sum of the first i array elements // s == a[0] +.. + a[i-1] s = s + a[i]; } return s; }

public static int quotient (int n, int d) { int q = 0, r = n; assert n=q* d + r; while (r >= d) { r = r - d; q = q + 1; assert n=q* d + r; } return q; }

public static int power(int x, int n) { int p = 1, i = 0; assert p== Math.pow(x,i); while (i < n) { p = p * x; i = i + 1; assert p== Math.pow(x,i); } return p; }

public static int power(int x, int n) { int p = 1, i = 0; while (i < n) { p = p * x; i = i + 1; } return p; }

Performance Requirements Some program requirments do not pertain to the output, but to the performance. Compare the following two ways to compute n i=1 i. Algorithm 1 O(n) final int n = Integer. parseint ( args [0]); int sum = 0; for (int count =1; count <= n; i ++) { sum += count; } Algorithm 2 O(1) final int n = Integer. parseint ( args [0]); int sum = (n*(n+1))/2;