Academia.eduAcademia.edu

Precise Documentation of Critical Software

2007, 10th IEEE High Assurance Systems Engineering Symposium (HASE'07)

This experience and research based paper discusses the reasons that software cannot be trusted and then explains how the use of greatly improved documentation can make software more trustworthy. It shows how tabular expressions can be used to prepare software documents that are both precise and easily used by developers, inspectors, and testers. The paper reviews a number of "tried and true" ideas and illustrates some new refinements in the methods that resulted from recent research. It is intended both to tell developers of techniques available to them and to suggest new research areas.

10th IEEE High Assurance Systems Engineering Symposium Precise Documentation of Critical Software David L. Parnas Sergiy A. Vilkomir∗ Software Quality Research Laboratory (SQRL) Department of Computer Science and Information Systems University of Limerick, Ireland ware-safety were saying that they would not fly in an aircraft that was controlled by software. Today we can read long articles from other experts who believe that software cannot be trusted for a simple job like counting votes. The reasons for this lack of trust are many and complex; we list a few of them in the next section. Abstract This experience and research based paper discusses the reasons that software cannot be trusted and then explains how the use of greatly improved documentation can make software more trustworthy. It shows how tabular expressions can be used to prepare software documents that are both precise and easily used by developers, inspectors, and testers. The paper reviews a number of "tried and true" ideas and illustrates some new refinements in the methods that resulted from recent research. It is intended both to tell developers of techniques available to them and to suggest new research areas. Keywords: critical software, documentation, specifications, testing. 2. Trustworthiness of software The following factors impact trustworthiness of software and hardware systems: • Software is usually very difficult to inspect/understand. • Software is difficult to test. • There is often lack of agreement on the functions required of software products. Difficult to inspect/understand. Decades of experience have made it clear that we find it difficult to understand long programs. When trying to understand and verify the correctness of a long program, we must decompose it into small parts and (provisionally) associate a function with each one. We must then convince ourselves that: • If each part implements its assigned function, the whole program will be correct, • Each part implements its assigned function. Frequently, we find that our provisional assumptions do not correspond exactly to what the programmer intended or what the program does. Then, after revising our initial division and function descriptions, we try again. In principle, this iterative process converges and we learn whether or not the program is correct. In practice, we usually give up before we have a complete understanding of the program. The process terminates when we run out of time or patience. 1. Introduction Telephony, cameras, car radios, and power plants are all vastly improved by the availability of programmable processors. Because the hardware is programmable, it can be mass-produced making the processors are far less expensive to produce than the custom hardware that it replaces. Programmability also means that products can be improved without changing the hardware. Often, the software includes programs that download and install a new version of itself. Moreover, in applications such as power-plant control, we can introduce much more refined behaviour, i.e. makes finer distinctions, than we could make when all such functions were “hard-wired”. Software also allows us to collect and display more operating data than would be possible with older technologies. We do not need to look far to see that people are wary of software. Not too long ago, experts in soft∗ Now with Software Quality Research Laboratory (SQRL), Department of Electrical Engineering and Computer Science, University of Tennessee, USA 1530-2059/07 $25.00 © 2007 IEEE DOI 10.1109/HASE.2007.70 237 This inspection/understanding process is also unreliable because it depends on imprecise descriptions of component functions supplemented by the inspector’s memory and assumptions. A program may look correct but be wrong because a small detail was not mentioned or forgotten. People do not trust devices whose design is so complex that nobody seems to understand them. Until we improve our ability to understand and inspect software, it will not be trusted. Difficult to test. One of the most often quoted remarks by the late software pioneer E. W. Dijkstra is “Program testing can be used to show the presence of bugs, but never to show their absence” [4]. This remark is based on the fact that the number of possible tests for even simple programs is very large and it is usually possible to find a program that will pass every test that you have done but fail every other. Consequently, in most cases, we never know when we have tested enough. In sharp contrast to older technologies, interpolation does not work properly for the discrete functions that describe the behaviour of software. The result is that, even after extensive testing has been performed, errors are found by users. One can never be sure that all those errors have been found or when the next one will be encountered. People will not trust a product unless they are convinced that it has been tested adequately. Lack of agreement on the desired function. Most people find it extremely difficult to say what behaviour they want from a computer system. Often, when asked to state requirements, the reply is something like, “I will know it when I see it”. After delivery, we hear, “That’s not it”. People do not trust software when they keep discovering new requirements as they try to use it. fession. The properties that need to be confirmed are well defined and the methods that lead to confidence are understood. There is little doubt about what functions are expected from the vehicle and from each of its components. These have been documented, reviewed, and used in the review of internal designs. If we wish to increase the trustworthiness of software we must improve our ability to inspect, test, and specify software systems and their components. 4. Good documentation can make software more trustworthy If we look at the methods used to engender confidence in mechanical and electrical engineering products, we will see that documentation of the function, design, and components of those products, plays an essential role. The professional Engineering documentation used in those processes is precise, abstract, and, designed for use as a reference document rather than an introduction. Good documentation helps us to conduct more effective inspections and tests. Precise documents allow Engineers to confirm that if each component meets its stated specification, the product will be satisfactory. Combining testing and mathematical methods, we can confirm that each component does meet its specification. In the remainder of this section, we discuss what is required of this documentation. Documentation must be precise. Precise documents do not allow differing interpretations. Statements such as “The system must shut down if the temperature is over limit for too long” are obviously imprecise. However, although “The system must shut down if the average temperature over the most recent 3 second period is above 89 C” is much more precise, it still does not indicate whether we are taking about mean, median, or rms (root of the mean square) averages. Usually, precision in engineering requires the use of mathematical expressions. Documentation must be abstract. We consider documentation to be abstract if it refers only to observable, information and abstracts from (does not mention) anything that a user or using-program could not observe. This is a special case of a more general definition of “an abstraction” as something that represents many distinct things. Abstract documents represent all implementations that have the properties they describe. Abstract documentation of devices with memory must be able to refer to past (as well as present) input and output values. 3. Comparison with hardware systems Although we are fully aware that our lives will depend on the work of a large team of Engineers, most of us climb into airplanes without much concern. We know that the products are complex and that the failure of even a small part might put us in danger but we do trust the product. Again, it is easy to list some of the reasons: The track record of mechanical and electrical systems is good. Although the products are complex, they have a clearly visible structure that allows them to be divided in parts, each with precise specifications, and each part can be inspected and understood separately. Testing of mechanical and electrical systems is a well-developed, mathematics and physics based pro- 238 System requirements documentation must be a representation of a set of relations between timefunctions that represent the visible past history of the system and the values of the system’s outputs. The domain of the relation must include all possible histories of the inputs and outputs of the system (see [5]). Software component interface documentation must be a representation of the relation between a sequence of event descriptions (traces) and the present output values of the component. The domain of the relation must be the set of all possible histories of the input and output values. Program function documentation (for terminating programs) must be a representation of the LD-relation between starting and stopping states of the program. The domain of the relation must include all states with the property that if the program starts in that state, termination is possible. The competence set of the LDrelation includes all starting states for which termination is guaranteed [11]. Component internal design documentation must be a representation of an abstraction relation and the program relations of the principle programs in the component. The domain of the abstraction relation must include all reachable internal states of the component. The range of the relation is a set of traces that includes all possible histories of the component. A document is considered an accurate description if every ordered pair that can occur is included in the relation and all pairs that are included can occur. This is discussed in more detail in [13]. Document must be designed for easy retrieval of specific facts. Reference documents are not introductory or overview documentation; they assume general familiarity with the product and environment. It is endemic in Computer Science to mix reference documentation with introductory material. The usual collection of syntactic information and informal comments that come with software is also not adequate. Separate documentation should be available for those who are first becoming familiar with the general nature and structure of a product. Reference documents must be designed as repositories suitable for information retrieval. Reference documentation must be an easily accessed source of trustworthy and detailed information about the program and its behaviour. Using a reference document, one should be able to quickly answer questions such as: • What will this component do if it receives the input sequence ...? • What are the circumstances that lead to the output of ...? • How can I get this component to ...? Reference documentation must be organized according to strict rules that dictate one-and-only-one place for each fact. They are not designed to be read from start to finish but to make it easy to quickly find an accurate answer to a specific question. 5. The content of key software documents The secret of making any product more trustworthy is the old adage, “divide-and-conquer”. We need to be able to look at a set of small components in such a way that we are confident that if all of the components are trustworthy the product as a whole can be trusted. With complex products this means that each of the components must be precisely specified and that the correctness of a component can be verified knowing only that component’s specification and the specification of the components that it uses. Those specifications are the documents that we have been discussing. Clearly, the process will only work if the documents are accurate, precise, and complete. The process will be easier if the documents are abstract because this reduces the amount of information that must be considered. Many people are surprised to learn that it is possible to define the required contents of software documentation mathematically. Each document has a distinct purpose and intended audience, but all represent a relation (set of ordered pairs). Most of those relations are functions. For example: 6. Descriptions of piecewise-continuous relations The content descriptions in Section 4 are simple but quite abstract. We need to be able to provide readable representations of these relations. If conventional mathematical notation is used the result is often something that its author would not want to read. Fig. 1 is a precise abstract description of the behaviour required of a keyboard testing program used at Dell in Limerick, Ireland. To learn more about the meaning of the relations and predicates that appear in this expression you can read [1] but the exact meaning is not important here. It is clear that although this expression is complete, precise, and abstract, it is not useful as a reference document. Moreover, it is very tiresome to check the correctness of this expression. Simply counting the parentheses is difficult and a true semantic check would be very difficult and time consuming for most software developers. With a great deal of effort one 239 could make minor improvements in the format and construction of this expression, but our experience is that software developers asked to write or read documentation in this form will not do so willingly and will argue that it is not worth the effort. However, since 1977 [6], the senior author has been using a novel form of expression, which we call tabular expressions. A tabular expression that is equivalent to Fig. 1 is shown in Table 1. When tabular expressions were first introduced to the Software Engineering community, some called them “semi-formal”. In fact, they are fully formal their meaning has been defined in a variety of ways. We define them by showing how an equivalent conventional expression. The above is only one of many types of tabular expressions that a practitioner can use. The same relation can be described in many ways; the practitioner is free to choose the one that is best for readers or writers. The best form for those who prepare a table may not be the best for use as a reference. Algorithms for converting from one form to another have been developed [18]. While a glance at the small examples that fit in publishable papers may give the impression that such expressions are only practical for small examples, our experience shows the contrary. The newer models of tabular expressions that we are using allow the following techniques to be used when things get complex: • The headers can be hierarchically structured as illustrated above. • The dimension of the table can be increased from two to three, four or more to allow a speedier "look up". • The expressions in cells can be tabular expressions. (N(T)=2∧keyOK∧(¬(T=_)∧N(p(T))=1)) ∨ (N(T)=1∧(T=_∨(¬(T=_)∧N(p(T))=1)) ∧ (¬keyOK∧¬prevkeyOK∧¬prevkeyesc)) ∨((¬(T=_)∧N(p(T))=1) ∧((¬keyOK∧keyesc∧ ¬prevkeyesc) ∨(¬keyOK∧keyesc∧ prevkeyesc∧prevexpkeyesc)) ∨ ((N(T)=N(p(T))+1) ∧(¬(T=_)∧ (1<N(p(T))<L)) ∧(keyOK)) ∨ ((N(T)=N(p(T))-1)) ∧(¬keyOK∧¬keyesc∧ (¬prevkeyOK∧prevkeyesc∧preprevkeyOK)∨ prevkeyOK) ∧((¬(T=_)∧(1<N(p(T))<L)) ∨ (¬(T=_)∧N(p(T))=L))) ∨((N(T)=N(p(T))) ∧ (¬(T=_)∧(1<N(p(T))≤L))∧((¬keyOK∧ ¬keyesc∧(¬prevkeyOK∧prevkeyesc∧ ¬preprevkeyOK)) ∨ (¬keyOK ∧¬prevkeyOK ∧ ¬prevkeyesc) ∨(¬keyOK∧keyesc∧ ¬prevkeyesc) ∨ ¬keyOK∧keyesc∧ prevkeyesc∧prevexpkeyesc)) ∨ ((N(P(T)=Fail) ∧(¬keyOK∧keyesc ∧ prevkeyesc∧¬prevexpkeyesc) ∧ (1≤N(p(T))≤L)) ∨ ((N(P(T)=Pass) ∧(¬(T= _)∧ N(p(T))=L) ∧(keyOK)) 6. Example of precise documentation – TFM specifications As an example of precise documentation, we consider the Trace Function Method (TFM) for specifying or describing components or modules. TFM has been successfully applied for two industrial projects [16, 1] and is being used at the Software Quality Research Laboratory in Limerick for several projects. TFM specifications determine values of every output of a software component (module) as a function of the history of events affecting this module. An event is a discrete point in time when the component reads or changes the values of global variables. Each event is described by an event descriptor, which contains names and values of the global variables before and after the event. We call a sequence of event descriptors a trace. We use tabular representations of mathematical functions. The tables can be created systematically, identifying conditions that divide the traces into mutually exclusive and exhaustive subsets at the every step. To illustrate TFM, we consider an electronic date display device (Fig. 2). Fig. 1. Example of an abstract description that is too difficult to read Tabular expressions allow the expression to be parsed so that it is easy to check for completeness, consistency, and correctness. To check for completeness and correctness of this table, one makes sure that the cases in the header grids are mutually exclusive and cover all cases. One can check the correctness one case (cell) at a time. Our experience with expressions in this form has been that practitioners will use them and prefer them to long textual paragraphs because they can quickly and easily find the information that they need. Our experience also suggests that errors are less likely using tabular expressions. 240 Table 1. Tabular expression N(T)= ¬(T = _ ) ∧ T =_ N(p(T))= 1 keyOK ∧ ∧ ¬keyesc ¬keyOK keyesc∧ 2 (¬prevkeyOK ∧ prevkeyesc ∧ preprevkeyOK) ∨ prevkeyOK ¬prevkeyOK ∧ prevkeyesc ∧ ¬preprevkeyOK ¬prevkeyOK ∧ ¬prevkeyesc ¬prevkeyesc prevkeyesc ∧ ¬prevexpkeyesc prevkeyesc ∧ prevexpkeyesc 1 1<N(p(T))< L N(p(T))= L N(p(T))+1 N(p(T))-1 Pass N(p(T))-1 N(p(T)) N(p(T)) 1 N(p(T)) N(p(T)) 1 Fail N(p(T)) Fail N(p(T)) Fail 1 N(p(T)) N(p(T)) output function returns a 3-tuple (S(T), D(T), M(T)), where S(T) ∈ {day, month} is the current mode, D(T) ∈ {1, 2, …31} is the day displayed, and M(T) ∈ {1, 2, …12} is the month displayed. We use two standard functions to reflect the history of operation: r(T) is the most recent event descriptor in Trace T.; p(T) is the trace T with the most recent event descriptor removed. For example, if T=set.up.set then r(T)=set and p(T)=set.up. We can describe the required behaviour of the electronic date display device using one tabular expression (Tab. 2). For real software, TFM tables can be more complicated and additional tables for auxiliary functions are often necessary. However, even for complex programs, the size of a TFM specification is often surprisingly small. This is because the documents are abstract, i.e. they do not show any implementation details or models of those details. 27 / 03 set up Fig. 2. Electronic date display device The date display device shows the current date (day and month) and has two buttons (“set” and “up”) to set up an initial date. The “set” button determines the mode (i.e., what we are going to set) and switches between “day” and “month”. The small triangle indicates the current mode. The “up” button increments the selected quantity by one until “day” equals 31 or “month” equals 12 and then starts the cycle from 1. The initial date is 1/1. For this example, a trace describes a sequence of button presses, e.g. T1= set.up.up.up.up or T2= sup.up.set.set.up.set.up.up.up. For every trace T, the 7. Use of documentation at different stages of software product development and maintenance Software design. One of the tools used to increase the trustworthiness of mechanical and electrical problems is very demanding review of designs 241 before implementation. Using mathematical tools such as differential equations, one can estimate such quantities as power consumption, heat production, and distortion from circuit diagrams and other design documents. As software is now developed, there is no possibility of doing a careful analysis until code is produced because the documentation, if any is produced, is not precise enough. The precise mathematical documentation discussed in this paper changes that situation. Research on relational methods such as those described in [17], gives us equations that must be true if a design is correct. Without module interface specifications and internal design documents, these requirements remain in the theoretical domain. With such documents, one can check designs before proceeding further with the implementation. This can save a lot of wasted effort that comes from correctly implementing an erroneous design. Software inspection. While, it is obviously “a good thing” to have design documents that were checked, it is the code that has to be correct if we are to trust software products. It is quite possible to have a very good design but a fatally flawed implementation. Inspecting the code to eliminate the many minor errors that are common has proven incredibly difficult. Even “productive” inspections, inspections that reveal many errors, often fail to find other errors. Table 2. (S(T), D(T), M(T)) ≡ ¬ (T =_) ∧ r(T)=set ∧ r(T)=up ∧ TFM specification of Electronic date display device T =_ S(p(T))=day S(p(T))=month D(p(T))=31 S(p(T))=day ∧ ¬ (D(p(T))=31) M(p(T))=12 S(p(T))=month ∧ ¬ (M(p(T))=12) • Software has many subtle interactions between components and one must have an incredible memory for detail to find the errors. Experience reported in [12] and [10] has shown that precise documentation enables us to conduct very effective software inspections. The software is decomposed into a set of components and each component presented as a set of displays. Using descriptions of the components in the displays and the component interface specifications, we can inspect the displays one-at-a-time and know that if each display is correct, the whole system is correct. This is discussed in more detail in [10]. Software testing. Testing is an essential tool for increasing confidence in our products. However, testers in the software area work with three handicaps: • Because of the lack of precise documentation, preparation for the tests is delayed until code is available and must be done under extreme time pressure. • Useful coverage measures are “white box” that is they depend on the code. (day, 1, 1) (month, D(p(T)), M(p(T))) (day, D(p(T)), M(p(T))) (S(p(T)), 1, M(p(T))) (S(p(T)), D(p(T))+1, M(p(T))) (S(p(T)), D(p(T)), 1) (S(p(T)), D(p(T)), M(p(T))+1) When test results are obtained, there can be disagreement on whether the behaviour is correct or not. Precise documentation helps to alleviate all of these problems because: • Preparation for tests can begin as soon as design documents are approved. • Precise design documents tell us exactly which results are acceptable and leave no room for arguments over the correctness of results. • Precise documents provide a basis for “black box” coverage measures. For example, we can make sure that each cell in a tabular expression is adequately tested. We can use precise specifications to identify test values where past experience shows that errors are more likely. For example, if we know where certain functions pass through zero or have singularities, we can be sure to test these “interesting points” [3]. Other “interesting values” are the boundaries between different rows and columns in a tabular specification. 242 Precise documentation is also helpful for statistical testing. The purpose of statistical testing is reliability estimation. Reliability estimation requires an operational profile – a probabilistic characterization of how a software system is expected to be used [2, 9]. This profile is used to make sure situations are tested with a frequency proportional to their expected occurrence. Precise specifications can be used as a basis for describing the operational profile by associating probabilities with each cell in a tabular expression. The use of precise documentation for improved testing is also discussed in [7, 14, 15, 19]. We believe that the first areas to take up these methods must be projects where the software is critical, either for safety reasons or because it is needed for commercial success. In the safety area, our experience suggests that the first step should be to introduce more demanding standards for documentation, testing and inspection [20]. There are now many standards documents but because they do not demand precise abstract documentation they are effectively “toothless”. Mathematical methods can put the teeth into such standards. 8. The practicality of the approach [1] Baber, R., Parnas, D.L., Vilkomir, S., Harrison, P., O'Connor, T., Disciplined Methods of Software Specifications: A Case Study, Proceedings of the International Conference on Information Technology Coding and Computing (ITCC 2005), April 4-6, 2005, Las Vegas, NV, USA, IEEE Computer Society. [2] Brown, J.R., Lipow, M., Testing for software reliability, Proceedings of the International Conference on Reliable Software, Los Angeles, California, 1975, pp. 518 – 527. [3] Clermont, M., Parnas, D. L., Using Information about Functions in Selecting Test Cases, ICSE 2005 Workshop on Advances in Model-Based Software Testing (AMOST), St. Louis, Missouri, USA, May 15-16, 2005, IEEE Computer Society. [4] Dijkstra, E. W., Notes on Structured Programming, in Structured Programming, O.-J. Dahl, E. W. Dijkstra, and C. A. R. Hoare, Editors, Academic Press, London,1972, pp. 1–82. [5] Heninger, K.L., Specifying Software Requirements for Complex Systems: New Techniques and their Application, IEEE Transactions Software Engineering, Vol. SE-6, January 1980, pp. 2-13. [6] Heninger, K.L., Kallander, J., Parnas, D.L., Shore, J.E., Software Requirements for the A-7E Aircraft, NRL Memorandum Report 3876, United States Naval Research Laboratory, Washington D.C., November 1978, 523 pp. [7] Hester, S.D., Parnas, D.L., Utter, D.F., Using Documentation as a Software Design Medium, Bell System Technical Journal, 60, 8, October 1981, pp. 1941-1977. [8] Hoffman, D.M., Weiss, D.M. (eds.), Software Fundamentals: Collected Papers by David L. Parnas, AddisonWesley, 2001, 664 p., ISBN 0-201-70369-6. [9] Musa, J.D., Operational profiles in software-reliability engineering, IEEE Software, Vol. 10 Issue 2, March 1993, pp. 14-32. [10] Parnas, D.L., Inspection of Safety Critical Software using Function Tables, Proceedings of IFIP World Congress 1994, Volume III, August 1994, pp. 270 - 277. Reprinted as Chapter 19 in [8]. [11] Parnas, D.L., Precise Description and Specification of Software, in Mathematics of Dependable Systems II, edited by V. Stavridou, Clarendon Press, 1997, pp. 1 - 14. Reprinted as Chapter 5 in [8]. 7. References Whereas many attempts at technology transfer are intended to transfer research ideas to industry, the ideas discussed in this paper originated with industrial problems and academic research has been used to refine them and put them on a solid mathematical foundation. The first use of tabular expressions was to document the requirements for real-time military software [6]. The U.S. Naval Research Laboratory, where the ideas were first developed has built tools and continues to work with Navy contractors on practical problems. These ideas were then applied in a telephony system at Bell Labs [7], where they were subsequently emulated by other projects. The inspection methods discussed in [12] and [10] were proven to be extremely effective by subsequent experience; in 15 years of use and modification, no missed errors were discovered [21]. More recently, experience using new forms of the documentation has been found to be effective in joint work with Dell [1] and Ericsson [16]. We usually get a mixed reaction from our industrial partners. Engineers like the brevity and precision of documents that they get from others, but feel that they do not have time to prepare them. Managers like the abstract idea of producing precise design documents but seem unwilling to allow for the “up-front-investment” that is needed to produce them. Producing these documents requires that we take the time to answer questions that are usually not answered until the coding phase. Some view this time as unproductive. Our experience has been that the coding phase is shortened and testing times can be reduced if this investment is made. It is difficult, however, to engender faith in future pay-back in managers who have found earlier documentation efforts or earlier attempts at “formal methods” to have little value. 243 [12] Parnas, D.L., Asmis, G.J.K., Madey, J., Assessment of Safety-Critical Software in Nuclear Power Plants, Nuclear Safety, vol. 32, no. 2, April-June 1991, pp. 189-198. [13] Parnas, D.L., Madey, J., Functional Documentation for Computer Systems Engineering, Science of Computer Programming (Elsevier) vol. 25, number 1, October 1995, pp. 41-61. Reprinted as Chapter 1 in [8]. [14] Peters, D., Parnas, D.L., Using Test Oracles Generated from Program Documentation, IEEE Transactions on Software Engineering, Vol. 24, No.3, March 1998, pp. 161 – 173. [15] Peters, D., Parnas, D.L. Requirements-based Monitors for Real-Time Systems, IEEE Transactions on Software Engineering, Vol. 28, Issue 2, Feb. 2002, pp. 146-158. [16] Quinn, C., Vilkomir, S.A., Parnas, D.L., Kostic, S., Specification of Software Component Requirements Using the Trace Function Method, Proceeding of the International Conference on Software Engineering Advances (ICSEA 2006), Oct. 29 – Nov. 1, 2006, Tahiti, French Polynesia. [17] Schmidt, G., Ströhlein, T., Relations and Graphs Discrete Mathematics for Computer Scientists. EATCS Monographs on Theoretical Computer Science. Springer, 1993, 301 p. [18] Shen H., Zucker J.I., Parnas, D.L., Table Transformation Tools: Why and How, Proceedings of the Eleventh Annual Conference on Computer Assurance (COMPASS ‘96), Gaithersburg, MD., June 1996, pp. 3-11. [19] Vilkomir, S.A, Tips, P., Parnas, D.L., Monahan, J., O'Connor, T., Evaluation of Automated Testing Coverage: a Case Study of Wireless Secure Connection Software Testing, Supplementary proceedings of the 16th IEEE International Symposium on Software Engineering Reliability (ISSRE 2005), November 8-11, 2005, Chicago, Illinois, USA, pp. 3.123-3.134. [20] Vilkomir, S.A., Bowen, J.P., Ghose, A. Formalization and assessment of regulatory requirements for safetycritical software, Innovations in Systems and Software Engineering - A NASA Journal, Vol. 2, Num. 3-4, December 2006, pp. 165-178. [21] Wassyng, Alan. Private Communication. 244