Abstract
Programming faults are defined in the framework of the program verification schema (proof outline). Component S in program P is faulty if P cannot be proved correct with the current implementation of S but it can be proved using the implementation specification for S. A programming error is a state that violates that specification. Conditions for error propagation and masking are expressed in terms of the relationships between the implementation and design specification of S, which defines the role of S in the overall design of P. Errors propagate due to the dependencies between program entities. It is shown that “classical” static dependencies, developed for the purpose of code optimization, are inadequate for the analysis of error propagation since they do not capture events that occur on individual paths through the program. A novel path analysis method is proposed to identify variables potentially corrupted on a same path due the existence of the fault. The method is based upon error propagation axioms. The axioms are used to define path relations for structured programming constructs. The relations provide a conservative structural approximation to the semantical theory of error creation and propagation and are shown useful in testing, debugging and static analysis.
Similar content being viewed by others
References
Backhouse, R.C. (1986), Program Construction and Verification, Prentice Hall, Englewood Cliffs, NJ.
Bergerreti, J.F. and B.A. Carre (1985), “Information-Flow and Data-Flow Analysis of while-Programs,” ACM Transactions on Programming Languages and Systems 7,1, 37–61.
Budd, T.A., R.A. DeMillo, R.J. Lipton, and F.G. Sayward (1978), “The Design of a Prototype Mutation System for Program Testing,” In Proceedings of AFIPS National Computer Conference, pp. 623–627.
DeMillo, R.A. and A.J. Offutt (1991), “Constraint-Based Automatic Test Data Generation,” IEEE Transactions on Software Engineering 17,9, 900–910.
Ferrante, J., K.J. Ottenstein and J.D. Warrem (1987), “The Program Dependence Graph and Its Use in Optimization,” ACM Transactions Programming Language and Systems 9,3, 319–349.
Gries, D. (1981), The Science of Programming, Springer, New York.
Harman, M. and S. Danicic (1995), “Using Program Slicing to Simplify Testing,” Journal for Software Testing, Verification and Reliability 5,3, 143–162.
Hamlet, R. (1987), “Probable Correctness Theory,” Information Processing Letters 25,1, 17–25.
Haralick, R.B. (1974), “The Diclique Representation and Decomposition of Binary Relations,” Journal of ACM 21,3, 356–366.
Hecht, M.S. (1977), Flow Analysis of Computer Programs, North-Holland, Amsterdam.
Herman, P.M. (1976), “A Data Flow Analysis Approach to Program Testing,” The Australian Computer Journal 8,3, 347–354.
Jones, C.B. (1990), Systematic Software Development using VDM, Prentice Hall, New York.
Korel, B. and J. Laski (1988), “Dynamic Program Slicing,” Information Processing Letters 29,3, 155–163.
Korel, B. and J. Laski (1990), “Dynamic Slicing of Computer Programs,” Journal for Systems and Software 13,3, 187–195.
Laski, J. (1986), “An Algorithm for the Derivation of Codefinitions in Computer Programs,” Information Processing Letters 23, 85–90.
Laski, J. (1990), “Data Flow Testing in STAD,” The Journal of Systems Software 12,1, 3–14.
Laski, L. and P. Luczycki (1992), “System for Testing and Debugging STAD 1.0: User Perspective,” Technical Report CSE-92-03-1, Department of Computer Science and Engineering, Oakland University, Rochester, MI.
Laski, J. and W. Szermer (1992), “Identification of Program Modifications and its Applications in Software Maintenance,” In Proceedings of the IEEE Conference on Software Maintenance, IEEE Computer Society Press, Los Alamitos, CA, pp. 282–290.
Laski, J., W. Szermer and P. Luczycki (1995), “Error Masking in Computer Programs,” Journal for Software Testing, Verification and Reliability 5,2, 81–105.
Lyle, J.R. and M. Weiser (1987), “Automatic Program Bug Location by Program Slicing,” In Proceedings of the Second International Conference on Computer Applications, IEEE Computer Society Press, Los Alamitos, CA, pp. 877–882.
Miller, K.W., L.J. Morrell, R.R. Noonan, S.K. Park, D.M. Nicol, B.W. Murrill and J.M. Vaas (1992), “Estimating the Probability of Failure When Testing Reveals No Failures,” IEEE Transactions on Software Engineering 18,1, 33–43.
Morell, L.J. (1990), “A Theory of Fault-Based Testing,” IEEE Transactions on Software Engineering 16,8, 844–857.
Moriconi, M. and T.C. Winkler (1990), “Approximate Reasoning About the Semantic Effects of Program Changes,” IEEE Transactions on Software Engineering 16,9, 980–992.
Ntafos, S.C. (1984), “On Required Element Testing,” IEEE Transactions on Software Engineering SE-10,6, 795–803.
Ottenstein, K.L. and L.M. Ottenstein (1984), “The Program Dependence Graph in a Software Development Environment,” Proceedings of the ACM SIGPLAN/SIGSOFT Symposium on Practical Programming Environments, Also appears in ACM SIGPLAN Notices 19, 5, 177–184.
Podgurski, A. and L.A. Clarke (1990), “A Formal Model of Program Dependencies and Its Implications for Software Testing, Debugging, and Maintenance,” IEEE Transactions on Software Engineering 16,9, 965–979.
Rapps, S. and E. Weuyker (1985), “Selecting Software Test Data Using Data Flow Information,” IEEE Transactions on Software Engineering SE-11,4, 367–375.
Reiter, R. (1987), “Nonmonotonic Reasoning,” Annual Review of Computer Science 2, 147–186.
Richardson, D.J. and M.C. Thompson (1988), “The RELAY Model of Error Detection and its Application,” In Proceedings of the 2nd Workshop on Software Testing, Verification and Analysis, IEEE Computer Society Press, Los Alamitos, CA, pp. 223–230.
Shoham, Y. (1990), “Nonmonotonic Reasoning and Causation,” Cognitive Science 14,2, 213–252.
Voas, J. (1992), “PIE: A Dynamic Failure-Based Technique,” IEEE Transactions on Software Engineering 18,8, 717–727.
Weiser, M. (1984), “Program Slicing,” IEEE Transactions on Software Engineering SE-10,4, 352–357.
Author information
Authors and Affiliations
Rights and permissions
About this article
Cite this article
Laski, J. Programming faults and errors: Towards a theory of software incorrectness. Annals of Software Engineering 4, 79–114 (1997). https://doi.org/10.1023/A:1018966827888
Issue Date:
DOI: https://doi.org/10.1023/A:1018966827888