We propose to check the execution of an abstract data type's imperative implementation against its algebraic specification. An explicit mapping from implementation states to abstract values is added to the imperative code. The form of specification allows mechanical checking of desirable properties such as consistency and completeness, particularly when operations are added incrementally to the data type. During unit testing, the specification serves as a test oracle. Any variance between computed and specified values is automatically detected. When the module is made part of some application, the checking can be removed, or may remain in place for further validating the implementation. The specification, executed by rewriting, can be thought of as itself an implementation with maximum design diversity, and the validation as a form of multiversion-programming comparison.
|
1268
|
The C++ Programming Language
– Stroustrup
- 1997
|
|
1190
|
Object-Oriented Software Construction
– Meyer
- 1997
|
|
784
|
On the criteria to be used in decomposing systems into modules
– Parnas
- 1972
|
|
719
|
The Java Programming Language
– Arnold, Gosling
- 1996
|
|
579
|
Term rewriting systems
– Klop
- 1992
|
|
418
|
Simple word problems in universal algebras
– Knuth, Bendix
- 1970
|
|
342
|
Proofs of correctness of data representations
– Hoare
- 1972
|
|
305
|
Confluent reductions: Abstract properties and applications to term rewriting systems: Abstract properties and applications to term rewriting systems
– Huet
- 1980
|
|
240
|
E.G.: ‘An initial algebra approach to specification, correctness and implementation of abstract data types
– GOGUEN, THATCHER, et al.
- 1978
|
|
211
|
Selecting software test data using data flow information
– Rapps, Weyuker
- 1985
|
|
204
|
Fundamentals of Algebraic Specification 1
– Ehrig, Mahr
- 1985
|
|
162
|
An Experimental Evaluation of the Assumption of Independence in Multiversion Programming
– Knight, Leveson
- 1986
|
|
135
|
Yacc: Yet another compiler compiler
– Johnson
- 1979
|
|
112
|
Partition testing does not inspire confidence
– Hamlet, Taylor
- 1990
|
|
109
|
Lex - a lexical analyzer generator
– Lesk, Schmidt
- 1975
|
|
107
|
Introducing OBJ3
– Goguen, Winkler, et al.
- 2000
|
|
100
|
editors. Algebraic Specification
– Bergstra, Heering, et al.
- 1989
|
|
89
|
The algebraic specification of abstract data types
– Guttag, Horning
- 1978
|
|
87
|
The Larch family of specification languages
– GUTTAG, HORNING, et al.
- 1985
|
|
79
|
Testing programs with the aid of a compiler
– Hamlet
- 1977
|
|
75
|
Fault Tolerance by Design Diversity: Concepts and Experiments
– Avizienis, Kelly
- 1984
|
|
68
|
Equational Logic as a Programming Language
– O'Donnell
- 1985
|
|
62
|
Comparing the Effectiveness of Software Testing Strategies
– Basili, Selby
- 1987
|
|
57
|
On the Automated Generation of Program Test Data
– Ramamoorthy, Ho, et al.
- 1976
|
|
56
|
A Comparison of Some Structural Testing Strategies
– Ntafos
- 1988
|
|
47
|
Abstract data types and software validation
– Guttag, Horowitz, et al.
- 1978
|
|
46
|
Data-abstraction implementation, specification and testing
– Gannon, McMullin, et al.
- 1981
|
|
40
|
Programming with Specifications: An Introduction to Anna, A language for specifying Ada programs
– Luckham, editor
- 1990
|
|
37
|
The Operational Versus the Conventional Approach to Software Development
– Zave
- 1984
|
|
35
|
Operational semantics of order-sorted algebra
– Goguen, Jouannaud, et al.
- 1985
|
|
32
|
Random testing
– Hamlet
- 2002
|
|
30
|
Case studies on testing object-oriented programs
– Doong, Frankl
- 1991
|
|
26
|
Methodology for the generation of program test data
– Howden
- 1975
|
|
20
|
The Design of Data Type Specifications
– Guttag, Horowitz, et al.
- 1978
|
|
18
|
GYPSY: A language for specification and implementation of verifiable programs
– Ambler, Good, et al.
- 1977
|
|
17
|
Theory of Modules
– Gannon, Hamlet, et al.
- 1987
|
|
16
|
An Initial Algebra Approach to the Specification
– Goguen, Thatcher, et al.
- 1978
|
|
15
|
Software Templates
– Volpano, Kieburtz
- 1985
|
|
13
|
Module test case generation
– Hoffman, Brealey
- 1989
|
|
11
|
Fault Tolerance by Design Diversity
– Avizienis, Kelly
- 1984
|
|
11
|
Test Data Generation Using a Prolog with Constraints
– Choquet
- 1986
|
|
8
|
A lexical analyzer generator for Standard ML
– Appel, Mattson, et al.
- 1989
|
|
8
|
The use of self checks and voting in software detection: An empirical study
– Leveson, Cha, et al.
- 1990
|
|
8
|
A formal notion of program-based test data adequacy
– Davis, Weyuker
- 1983
|
|
8
|
Run-time consistency checking of algebraic specifications
– Sankar
- 1991
|
|
7
|
Sbreve2: A term rewriting laboratory with (AC-)unfailing completion
– Anantharaman, Hsiang, et al.
- 1989
|
|
7
|
ªOn the Criteria to be Used in Decomposing Systems into Modules,º
– Parnas
- 1972
|
|
7
|
Hardware testing and Software ICs
– Hoffman
- 1989
|
|
7
|
Using term rewriting systems to verify software
– Antoy, Gannon
- 1994
|
|
7
|
Dynamic verification of C++ generic algorithms
– Wang, Musser
- 1997
|