Design by Contract & Exceptions David Talby. Software Correctness When is a class correct? – It ’ s a relative concept; what is required? – But it ’ s.

Slides:



Advertisements
Similar presentations
Automated Theorem Proving Lecture 1. Program verification is undecidable! Given program P and specification S, does P satisfy S?
Advertisements

Ceg860(Prasad)L10DC1 Design by Contract Invariants Pre-post conditions : Rights and Obligations Exceptions : Contract Violations.
Exceptions CSE301 University of Sunderland Harry Erwin, PhD.
11-Jun-14 The assert statement. 2 About the assert statement The purpose of the assert statement is to give you a way to catch program errors early The.
Exception Handling The purpose of exception handling is to permit the program to catch and handle errors rather than letting the error occur and suffer.
An Introduction to Java Programming and Object- Oriented Application Development Chapter 8 Exceptions and Assertions.
CSE 332: C++ exceptions Overview of C++ Exceptions Normal program control flow is halted –At the point where an exception is thrown The program call stack.
Exceptions1 Syntax, semantics, and pragmatics. Exceptions2 Syntax, semantics, pragmatics Syntax –How it looks, i.e. how we have to program to satisfy.
Error Handling with Exceptions Concepts C and other earlier languages often had multiple error-handling schemes, and these were generally established.
Exceptions1 Syntax, semantics, and pragmatics. Exceptions2 Syntax, semantics, pragmatics Syntax –How it looks, i.e. how we have to program to satisfy.
C++ Exception Handling
1 Design by Contract Building Reliable Software. 2 Software Correctness Correctness is a relative notion  A program is correct with respect to its specification.
Exceptions Amit Shabtay. March 3rd, 2004 Object Oriented Design Course 2 Covariance\Contravariance Reminder class Parent { void test (covar : Mammal,
-5- Exception handling What is an exception? “An abnormal event” Not a very precise definition Informally: something that you don’t want to happen.
1 Specifying Object Interfaces. 2 Major tasks in this stage: --are there any missing attributes or operations? --how can we reduce coupling, make interface.
Software Testing and Quality Assurance
Design by Contract David Talby. Software Correctness When is a class correct? It ’ s a relative concept; what is required? But it ’ s the correct question:
Static and Dynamic Contract Verifiers For Java Hongming Liu.
Rossella Lau Lecture 8, DCO10105, Semester B, DCO10105 Object-Oriented Programming and Design  Lecture 8: Polymorphism & C++ pointer  Inheritance.
© Copyright Eliyahu Brutman Exceptions. © Copyright Eliyahu Brutman Exceptions and Design Patterns - 2 Introduction to Exception Handling Definition:
© 2006 Pearson Addison-Wesley. All rights reserved4-1 Chapter 4 Data Abstraction: The Walls.
Exceptions David Rabinowitz. March 3rd, 2004 Object Oriented Design Course 2 The Role of Exceptions Definition: a method succeeds if it terminates in.
OOP #10: Correctness Fritz Henglein. Wrap-up: Types A type is a collection of objects with common behavior (operations and properties). (Abstract) types.
Design by Contract David Talby. Software Correctness When is a class correct? – It ’ s a relative concept; what is required? – But it ’ s the correct.
© 2006 Pearson Addison-Wesley. All rights reserved4-1 Chapter 4 Data Abstraction: The Walls.
Computer Science 340 Software Design & Testing Design By Contract.
Ranga Rodrigo. Class is central to object oriented programming.
PRAGMATIC PARANOIA Steven Hadfield & Anthony Rice.
C++ Programming: Program Design Including Data Structures, Fourth Edition Chapter 13: Pointers, Classes, Virtual Functions, and Abstract Classes.
C++ Programming: From Problem Analysis to Program Design, Fourth Edition Chapter 14: Pointers, Classes, Virtual Functions, and Abstract Classes.
1 Exception Handling Introduction to Exception Handling Exception Handling in PLs –Ada –C++ –Java Sebesta Chapter 14.
Liang, Introduction to Java Programming, Seventh Edition, (c) 2009 Pearson Education, Inc. All rights reserved Chapter 18 Exception Handling.
1 Exceptions and error handling. 2 Java exception mechanism when an error or exceptional condition occurs, you throw an exception which is caught by an.
© Bertrand Meyer and Yishai Feldman Notice Some of the material is taken from Object-Oriented Software Construction, 2nd edition, by Bertrand Meyer (Prentice.
Design by Contract in Java Concept and Comparison.
SWE 619 © Paul Ammann Procedural Abstraction and Design by Contract Paul Ammann Information & Software Engineering SWE 619 Software Construction cs.gmu.edu/~pammann/
How to Design Error Steady Code Ivaylo Bratoev Telerik Corporation
CS212: Object Oriented Analysis and Design Lecture 7: Arrays, Pointers and Dynamic Memory Allocation.
More About Classes Ranga Rodrigo. Information hiding. Copying objects.
Introduction to Exception Handling and Defensive Programming.
C++ Memory Overview 4 major memory segments Key differences from Java
Exception Handling Programmers must deal with errors and exceptional situations: User input errors Device errors Empty disk space, no memory Component.
ISBN Chapter 11 Abstract Data Types and Encapsulation Concepts.
Design by Contract Ranga Rodrigo based on Mark Priestley's Lectures.
ANU COMP2110 Software Design in 2003 Lecture 10Slide 1 COMP2110 Software Design in 2004 Lecture 12 Documenting Detailed Design How to write down detailed.
CSE 332: C++ Statements C++ Statements In C++ statements are basic units of execution –Each ends with ; (can use expressions to compute values) –Statements.
L13: Design by Contract Definition Reliability Correctness Pre- and post-condition Asserts and Exceptions Weak & Strong Conditions Class invariants Conditions.
Exception Handling in C++. Outline What exceptions are and when to use them Using try, catch and throw to detect, handle and indicate exceptions, respectively.
SWE 4743 Abstract Data Types Richard Gesick. SWE Abstract Data Types Object-oriented design is based on the theory of abstract data types Domain.
Defensive Programming CNS 3370 Copyright 2003, Fresh Sources, Inc.
PROGRAMMING PRE- AND POSTCONDITIONS, INVARIANTS AND METHOD CONTRACTS B MODULE 2: SOFTWARE SYSTEMS 13 NOVEMBER 2013.
Programming & Debugging. Key Programming Issues Modularity Modifiability Ease of Use Fail-safe programming Style Debugging.
DBC NOTES. Design By Contract l A contract carries mutual obligations and benefits. l The client should only call a routine when the routine’s pre-condition.
M180: Data Structures & Algorithms in Java Stacks Arab Open University 1.
1 Exceptions When the Contract is Broken. 2 Definitions A routine call succeeds if it terminates its execution in a state satisfying its contract A routine.
Object Design More Design Patterns Object Constraint Language Object Design Specifying Interfaces Review Exam 2 CEN 4010 Class 18 – 11/03.
Design by Contract. The Goal Ensure the correctness of our software (correctness) Recover when it is not correct anyway (robustness) Correctness: Assertions.
CHAPTER 18 C – C++ Section 1: Exceptions. Error Handling with Exceptions Forces you to defend yourself Separates error handling code from the source.
© Bertrand Meyer and Yishai Feldman Notice Some of the material is taken from Object-Oriented Software Construction, 2nd edition, by Bertrand Meyer (Prentice.
CSE 332: C++ Exceptions Motivation for C++ Exceptions Void Number:: operator/= (const double denom) { if (denom == 0.0) { // what to do here? } m_value.
CSE 374 Programming Concepts & Tools Hal Perkins Fall 2015 Lecture 17 – Specifications, error checking & assert.
י"ח/תשרי/תשע"ח Design by Contract David Talby.
C ++ MULTIPLE CHOICE QUESTION
CS 2704 Object Oriented Software Design and Construction
Exceptions David Rabinowitz.
Chapter 6 CS 3370 – C++ Functions.
Assertions References: internet notes; Bertrand Meyer, Object-Oriented Software Construction; 4/25/2019.
SWE 619 Last modified Fall 2007 Saket Kaushik, Paul Ammann
Computer Science 340 Software Design & Testing
Exception Handling.
Presentation transcript:

Design by Contract & Exceptions David Talby

Software Correctness When is a class correct? – It ’ s a relative concept; what is required? – But it ’ s the correct question: the class is the basic independent, reusable unit of software Theory flashback: class = Abstract Data Type – Commands (push, pop, empty, full) – Axioms (count == 0 iff empty) – Preconditions (pop requires not empty) Why isn ’ t this reflected in programming?

Approaches to Correctness Testing – Tests only cover specific cases – Tests don ’ t affect extensions (inheritance) – If something doesn ’ t work, where is the problem? – It is difficult to (unit-) test individual classes Formal Verification – Requires math & logic background – Successful in hardware, not in software The assert() macro – Introduced to Java only in JDK 1.4

Design by Contract Created by Bertrand Meyer, in Eiffel Each class defines a contract, by placing assertions inside the code Assertions are just Boolean expressions – Eiffel: identified by language keywords – iContract: identified by javadoc attributes Assertions have no effect on execution Assertions can be checked or ignored

Methods Each feature is equipped with a precondition and a postcondition double sqrt (double x) require x >= 0 do … ensure result * result == x end

Methods II The same in iContract syntax: //** return Square root of x >= return * return == x */ double sqrt (double x) { … } Assertions are just Boolean expressions – Except result and old in postconditions – Function calls are allowed, but… – Don’t modify data: ++i, inc(x), a = b

The Contract

Class Invariants Each class has an explicit invariant class Stack[G] private int count; boolean isEmpty() { … } … other things … invariant isEmpty() == (count == 0) end

Theory: Hoare Clauses Hoare’s Notation for discussing correctness: { P } code { Q } For example: { x >= 10 } x = x + 2 { x >= 12 } Partial Correctness: If a program starts from a state satisfying P, runs the code and completes, then Q will be true. Full Correctness: If a program start from a state satisfying Q and runs the code, then eventually it will complete with Q being true.

When is a Class Correct? For every constructor: { Pre } code { Post /\ Inv } For every public method call: { Pre /\ Inv } code { Post /\ Inv } Origin is Abstract Data Type theory Private methods are not in the contract Undecidable at compile time

DbC in Real Life: C/C++ In C, the assert macro expands to an if statement and calls abort() if it’s false assert(strlen(filename) > 0); Assertion checking can be turned off: #define NDEBUG In C++, redefine Assert to throw instead of terminating the program Every class should have an invariant Never use if() when assert() is required

DbC in Real Life: UML UML supports pre- and post-conditions as part of each method’s properties Invariants are supported at class level Object Constraint Language is used – Formal language - not code – Readable, compared to its competitors – Supports forall and exists conditions

DbC in Real Life: Java Assertions that can be turned on and off are only supported from JDK 1.4 assert interval > 0 && interval <= 1 : interval; The most popular tool is iContract – Assertions are Javadoc-style comments – Instruments source code, handles inheritance Based on the OCL forall IEmployee e in getEmployees() | getRooms().contains(e.getOffice()) exists IRoom r in getRooms() | r.isAvailable()

Common Mistakes Not an input-checking mechanism – Use if to test human or machine output – Assertions are always true Not a control structure – Assertion monitoring can be turned off – They are applicative, not imperative, and must not include any side effects – Besides, exceptions are inefficient An assertion violation is always a bug – In precondition: client bug – In postcondition or invariant: supplier bug

Common Mistakes II Don’t use defensive programming – The body of a routine must never check its pre- or post-conditions. – This is inefficient, and raises complexity. Don’t hide the contract from clients – All the queries in a method’s precondition must be at least as exported as the method – Doesn’t have to be so in postconditions

The Role of Exceptions Definition: a method succeeds if it terminates in a state satisfying its contract. It fails if it does not succeed. Definition: An exception is a runtime event that may cause a routine to fail. Exception cases – An assertion violation (pre-, post-, invariant, loop) – A hardware or operating system problem – Intentional call to throw – A failure in a method causes an exception in its caller

Disciplined Exception Handling Mistake 1: Handler doesn’t restore stable state Mistake 2: Handler silently fails its own contract There are two correct approaches – Resumption: Change conditions, and retry method – Termination: Clean up and fail (re-throw exception) Correctness of a catch clause – Resumption: { True } Catch { Inv  Pre } – Termination: { True } Catch { Inv }

Improper Flow of Control Mistake 3: Using exceptions for control flow try { value = hashtable.find(key); } catch ( NotFoundException e ) { value = null; } It’s bad design – The contract should never include exceptions It’s extremely inefficient – Global per-class data is initialized and stored – Each try, catch, or exception specification cost time – Throwing an exception is orders of magnitude slower than returning from a function call

Constructors & Destructors Never let an exception leave a destructor – In C++: Throwing an exception while destroying due to another exception causes terminate() – In finalize() : The finalize() method is stopped – The result is resource leaks (yes, in Java too) C++ doesn’t destroy partially built objects – Throwing an exception in a constructor after resources were allocated leads to resource leaks – Either split initialization to a method, or avoid pointers – Use auto_ptr members instead of T* pointers for const members or members initialized in constructor

Case Study: Genericity It’s very difficult to write generic, reusable classes that handle exceptions well – Genericity requires considering exceptions from the template parameters as well – Both default and copy constructors may throw – Assignment and equality operators may throw – In Java: constructors, equals() and clone() may throw See Tom Cargill paper’s Stack class code “Warm-up” bugs not related to exceptions: – Copy, assignment do not set top in empty stacks – Assignment does not protect against self-assignment

Goals Exception Neutrality – Exceptions raised from inner code (called functions or class T) are propagated well Weak Exception Safety – Exceptions (either from class itself or from inner code) do not cause resource leaks Strong Exception Safety – If a method terminates due to an exception, the object’s state remains unchanged

Case Study: Restoring State Bug: Throwing OutOfMemory in push() – top has already been incremented – count(), push(), pop() can no longer be used – Fix: restore top when throwing the exception Bug: Throwing OutOfMemoty in operator=() – Old array is freed before new one allocated – In x=y, x would be inconsistent after failure – Fix: Allocate new array into a temporary first

Case Study: Memory Leaks Bug: What if T.operator=() throws? – It can happen: stack > – See assignment in for loop of copy constructor – If T throws here, no stack destructor is called – The array allocated in the first line is leaked Bug: Same problem in push() – Again, assignment in for loop may throw – Only new_buffer points to allocated array – In case of exception, this array will be leaked

Case Study: More on State Bug: pop() ends with return v[top--]; – This involves copying the returned object – What if its copy constructor throws? – top has already been decremented – State of the stack has changed, and the client cannot retry to pop the same element

Case Study: More on Memory Bug: operator=() assumes T constructs well – First line: delete []v; – Second line: v = new T[nelems = s.nelems]; – If T’s default constructor throws, then v is undefined – This can lead to double delete: { stack x, y; y = x; // exception thrown – y.v is deleted } // end of scope – y.v is re-deleted

Case Study: Conclusions Paper’s title: “a false sense of security” Combining exceptions and genericity is extremely difficult – STL handles this Java has some of the same problems too – Constructors, equals(), hashCode(), clone(), toString() and other Object methods may throw – In collections: add(), addAll(), removeAll(), retainAll(), hashCode(), etc. may throw – The throws keyword does not guard against heirs of RuntimeException

Guidelines for Exceptions When propagating an exception, try to leave the object in the same state it had in method entry – Make sure const functions are really const – Perform exception-prone actions early – Perform them through temporaries – Watch for side effects in expression that might throw If you can’t leave the object in the same state, try to leave it in a stable state – Either re-initialize it, or mark it internally as invalid – Do not leave dangling pointers in the object – delete pointers and free resources through temporaries

Guidelines for Exceptions II Avoid resource leaks – In constructors, initialize raw pointers or resource handles to null first and initialize them inside a try..catch block in the constructor body – Don’t throw exceptions from a destructor / finalize() Don’t catch any exceptions you don’t have to – Rewrite functions to preserve state if possible push() {v_[top_] = element; top_++; } – Use catch(…) to deal with propagating exceptions Restore state and re-throw exception

Guidelines for Exceptions III Don’t hide exceptions from your clients – Always re-throw an exception caught with catch(…) – Throw a different exception only to add information – Make sure one catch block doesn’t hide another Use exception hierarchies – Define base exception classes for each library – Don’t be afraid of a deep hierarchy – Consider inheriting a standard exception Don’t get too paranoid

Summary Software Correctness & Fault Tolerance Design by Contract – When is a class correct? – Speed, Testing, Reliability, Documentation, Reusability, Improving Prog. Languages Exceptions – What happens when the contract is broken? – Neutrality, Weak Safety, Strong Safety