: William Stanley, Janusz Laski.
: Software Verification and Analysis An Integrated, Hands-On Approach
: Springer Verlag London Limited
: 9781848822405
: 1
: CHF 56.60
:
: Anwendungs-Software
: English
: 229
: DRM
: PC/MAC/eReader/Tablet
: PDF

This book addresses the most important techniques in improving the correctness of software, including correctness by construction (top-down refinement), program proving, static analysis and dynamic, execution-based analysis (testing and debugging). Three major software verification techniques are discussed: Semantic program synthesis and analysis, static program analysis and dynamic program analysis. The correctness by construction paradigm is illustrated using the VDM-SL and the corresponding CSK Toolbox. The discussion involves the synthesis of direct and/or indirect specification, interpreting the latter and carrying out high-level testing of the specification. Problems are included in the text and one or more difficult exercises appear at the end of each chapter. Also, where appropriate, STAD’s handling of the concepts is illustrated. Written for advanced students and professionals wishing to explore more than one technique, this comprehensive text will be invaluable with its unique integrated approach.

Preface6
Structure of the Text7
Software Tools9
The Accompanying Web Site9
The Audience of the Book10
Acknowledgments11
Contents12
Introduction: What Do We Want To Know About the Program?16
1 What is the Program Doing: Specification16
2 How to Make Sure That the Program is Doing it Right: Verification20
3 Trying to Show That the Program is Incorrect: Testing23
4 Trying to Locate the Cause of Incorrectness: Debugging26
5 What One Can Tell About The Program Without Executing It: Static Analysis30
6 The Scope of the SAT Methods32
7 Conclusions35
Exercises36
References36
The Semantic Analysis37
Why Not Write Correct Software the First Time?38
1.1 Express Yourself Precisely: The Precondition38
1.2 The Postcondition41
1.3 The Principles of Top-Down Refinement45
1.4 The Example Continued46
1.5 Conclusions49
References50
How to Prove a Program Correct: Programs Without Loops52
2.1 Program Correctness52
2.2 The Weakest Precondition wp( S , Q)55
2.3 Finding the wp( S , Q )56
2.4 SPARK Experiments58
2.5 Programs With Many Paths62
2.6 The Derivation of Partial Weakest Precondition (pwp) and Path Traversal ( tr)65
2.7 The Assertion Method69
2.8 Conclusions73
References74
How to Prove a Program Correct: Iterative Programs75
3.1 When You Cannot Verify All Paths: Programs with Loops75
3.2 From the Particular to the General: Mathematical Induction77
3.3 Loop Invariants78
3.4 Where Do Invariants Come From: Goal Invariant82
3.5 Supporting the Proof: Using the Proof Checker84
3.6 Does the Loop Terminate? Variants88
3.7 Conclusions89
References91
Prepare Test for Any Implementation: Black- Box Testing92
4.1 Testing Principles92
4.2 Functionality Testing96
4.3 Partition Testing99
4.4 An Example100
4.5 Random Testing106
4.6 Conclusions108
References110
Static Analysis111
Intermediate Program Representation112
5.1 Introduction112
5.2 Program Parse and Syntax Trees113
5.3 Program Control Flowgraph113
5.4 Labeled Flowgraphs118
5.5 Deriving the Flowgraph121
5.6 Paths in Flowgraphs125
5.7 Conclusions132
References132
Program Dependencies133
6.1 Motivations133
6.2 Dominators and Attractors136
6.3 Control Dependency: Structured Control139
6.4 Control Dependency: Arbitrary Control143
6.5 Computing Control Dependency145
6.6 Data and General Dependency147
6.7 Conclusions149
References150
What Can One Tell About a Program Without Its Execution: Static Analysis151
7.1 Motivations151
7.2 Control Flow Anomalies153
7.3 Data Flow Anomalies155
7.4 Modeling Procedure Calls160
7.5 Signature Anomalies166
7.6 Descriptive Static Analysis171
7.7 Events on Program Paths173
7.8 Conclusions176
References177
Dynamic Analysis178
Is There a Bug in the Program? Structural Program Testing179
8.1 Introduction179
8.2 Code Coverage Criteria180
8.3 Testing Scenario185
8.4 Faults and Errors191
8.5 Fault Detection Power of Code Coverage Testing197
8.6 Program Dependencies in Software Testing199
8.7 Conclusions204
References207
Dynamic Program Analysis209
9.1 Introduction209
9.2 Operational Semantics: States and Computations210
9.3 Dynamic Analysis Concepts214
9.4 An Application: Dynamic Program Slicing217
9.5 An Application: Handling Dynamic Data Structures220
9.6 Conclusions223
References225
Index226