CONTRACT BASED PROGRAMMING
Alexander Karapetian
Fraser Waters
Amélie Windel
Theorem Proving
Natural Deduction systems
Pandora – Functionally sound & complete
Limited – Relies on user’s
introduction/elimination rules
Mathematical Theorem Proving
Automated
deduction
E
Equational Calculus
Proof by refutation
Otter
First Order Logic
Dev. halted in 2004
Program Analysis
Contracts in programs
Pre conditions
Must be satisfied prior to program load
Assumed by the program to be satisfied
Indeterministic result if not satisfied
Post conditions
Describe state of output after execution
Assumed by higher order methods to be satisfied
Invariants
Code Checking Code
Programs proving correctness of code
Vampire theorem prover
Equinox first order theorem prover
Microsoft Research contract code
Code Checking Code
Programs proving correctness of code
Vampire theorem prover
Equinox first order theorem prover
Microsoft Research contract code
Microsoft Research – Spec#
Contract code – .NET 4.0
using System.Diagnostics.Contracts;
Contract.Requires() // Pre condition
Contract.Ensures() // Post condition
Contract.Invariant() // Object invariant
Contract.Assume() // Truth assumed for condition
Code Contracts
Available in the BCL of .NET Framework 4.0
VB, C#, F#
Static analysis engine cccheck
Infers loop invariants
Infers method contracts
Runtime checking binary rewriter ccrewrite
Rewrites method to do runtime checking
Contract doc generation ccdoc
Generates XML (Standard for .NET) documentation
Code Examples
Simple division method
public static int Divide(int dividend, int divisor)
{
return dividend / divisor;
}
Code Examples
Simple division method
public static int Divide(int dividend, int divisor)
{
return dividend / divisor;
}
Call with divisor argument 0
static void Main(string[] args)
{
Divide(5, 0);
}
Code Examples
Simple division method
public static int Divide(int dividend, int divisor)
{
return dividend / divisor;
}
Call with divisor argument 0
static void Main(string[] args)
{
Divide(5, 0);
}
DivideByZero exception thrown
Contract Code Enforcement
Pre-conditioning
Pre-conditioning
Using Contract.Requires()
public static int Divide(int dividend, int divisor)
{
Contract.Requires(divisor != 0);
return dividend / divisor;
}
Pre-conditioning
Using Contract.Requires()
public static int Divide(int dividend, int divisor)
{
Contract.Requires(divisor != 0);
return dividend / divisor;
}
Static checker: condition breach
Pre-conditioning
Using Contract.Requires()
public static int Divide(int dividend, int divisor)
{
Contract.Requires(divisor != 0);
return dividend / divisor;
}
Static checker: condition breach/possible overflow
Pre-conditioning
Possible overflow remedied
Change from divisor != 0 to divisor > 0
public static int Divide(int dividend, int divisor)
{
Contract.Requires(divisor > 0);
return dividend / divisor;
}
Contract Code Enforcement
Pre-conditioning
Post-conditioning
Post-conditioning
Add new method
GetNumber()
public static int GetNumber(int i)
{
return i * 2;
}
Post-conditioning
Add new method
GetNumber()
Call Divide with method
Divisor source unknown
public static int GetNumber(int i)
{
return i * 2;
}
static void Main(string[] args)
{
Divide(5, GetNumber(0));
}
Post-conditioning
Add new method
GetNumber()
Call Divide with method
Divisor source unknown
Static checker warning
Precondition unproven
public static int GetNumber(int i)
{
return i * 2;
}
static void Main(string[] args)
{
Divide(5, GetNumber(0));
}
Post-conditioning
Provide Contract.Ensures() code
Postcondition of returning int > 0
public static int GetNumber(int i)
{
Contract.Ensures(Contract.Result<int>() > 0);
return i * 2;
}
Post-conditioning
Provide Contract.Ensures() code
Postcondition of returning int > 0
public static int GetNumber(int i)
{
Contract.Ensures(Contract.Result<int>() > 0);
return i * 2;
}
Static checker warning upon compilation – postcondition unproven
Contract Code Enforcement
Pre-conditioning
Post-conditioning
Static checking
Static Checking
Remedy warning from static checker
Add precondition of i > 0
public static int GetNumber(int i)
{
Contract.Requires(i > 0);
Contract.Ensures(Contract.Result<int>() > 0);
return i * 2;
}
Checker verifies that i > 0 implies 2i > 0
Static Checking
Remedy warning from static checker
Add precondition of i > 0
public static int GetNumber(int i)
{
Contract.Requires(i > 0);
Contract.Ensures(Contract.Result<int>() > 0);
return i * 2;
}
Checker verifies that i > 0 implies 2i > 0
GetNumber() is now also contracted
Contract Code Enforcement
Pre-conditioning
Post-conditioning
Static checking
Runtime checking
Runtime Checking
Run preconditioned Divide() with 0 divisor
public static int Divide(int dividend, int divisor)
{
Contract.Requires(divisor != 0);
return dividend / divisor;
}
Runtime Checking
Run preconditioned Divide() with 0 divisor
public static int Divide(int dividend, int divisor)
{
Contract.Requires(divisor != 0);
return dividend / divisor;
}
Static checker warning shown
Runtime Checking
Run preconditioned Divide() with 0 divisor
public static int Divide(int dividend, int divisor)
{
Contract.Requires(divisor != 0);
return dividend / divisor;
}
Static checker warning shown
Runtime exception thrown if executed
Runtime Checking
In Release builds
Only Requires<E>() is checked
Prevents slowdown from lots of verification
Example would throw DivideByZero exception
In Debug build
Assert() and Assume() are also checked
Break into debugger
Can be rewritten with ccrewrite
Varying levels of checking
Full
Pre & Post only
Pre only
ReleaseRequires
None
Contract Code Enforcement
Pre-conditioning
Post-conditioning
Static checking
Runtime checking
The Future
The Future
When will I see Contracts in widespread use?
The Future
When will I see Contracts in widespread use?
Languages implement native support
The Future
When will I see Contracts in widespread use?
Languages implement native support
Contract code libraries/extensions popularise
The Future
When will I see Contracts in widespread use?
Languages implement native support
Contract code libraries/extensions popularise
Microsoft releases .NET Framework 4.0
The Future
When will I see Contracts in widespread use?
Languages implement native support
Contract code libraries/extensions popularise
Microsoft releases .NET Framework 4.0
Tools in early stages
Static checker under development for stronger type support
Cleared for Release Candidate status – Feb 2010
Visual Studio 2010 RC out
References
Images
http://en.wikipedia.org/wiki/File:Agda_proof.jpg
http://en.wikipedia.org/wiki/File:First-order_tableau_with_unification.svg
http://www3.imperial.ac.uk/portal/page/portallive/computing/research/areas/LAI
http://commons.wikimedia.org/wiki/File:P_np_np-complete_np-hard.svg
http://members.deri.at/~michaels/phd/html-sources/images/sdcprototype-architecture.jpg
http://www.cs.miami.edu/~tptp/Seminars/ATP/THMPrf.gif
Information
http://members.deri.at/~michaels/phd/html-sources/prototype.html
http://research.microsoft.com/en-us/projects/contracts/default.aspx
http://www.cs.miami.edu/~tptp/OverviewOfATP.html
http://plato.stanford.edu/entries/reasoning-automated/
Automated Theorem Proving: A Quarter Century Review - Donald W Loveland
Screenshots/Code
Internally generated
Questions?
Alexander Karapetian
[email protected]
Fraser Waters
[email protected]
Amélie Windel
[email protected]
© Copyright 2025 Paperzz