Page 311 -
P. 311

294   Chapter 11   Dependability and security


                                    system’s availability. If a system is infected with a virus, you cannot then be confident
                                    in its reliability or safety because the virus may change its behavior.
                                       To develop dependable software, you therefore need to ensure that:


                                    1.  You avoid the introduction of accidental errors into the system during software
                                        specification and development.
                                    2.  You design verification and validation processes that are effective in discovering
                                        residual errors that affect the dependability of the system.
                                    3.  You design protection mechanisms that guard against external attacks that can
                                        compromise the availability or security of the system.
                                    4.  You configure the deployed system and its supporting software correctly for its
                                        operating environment.

                                       In addition, you should usually assume that your software is not perfect and
                                    that software failures may occur. Your system should therefore include recovery
                                    mechanisms that make it possible to restore normal system service as quickly as
                                    possible.
                                       The need for fault tolerance means that dependable systems have to include
                                    redundant code to help them monitor themselves, detect erroneous states, and
                                    recover from faults before failures occur. This affects the performance of systems, as
                                    additional checking is required each time the system executes. Therefore, designers
                                    usually have to trade off performance and dependability. You may need to leave
                                    checks out of the system because these slow the system down. However, the conse-
                                    quential risk here is that some failures occur because a fault has not been detected.
                                       Because of extra design, implementation, and validation costs, increasing the
                                    dependability of a system significantly increases development costs. In particular,
                                    validation costs are high for systems that must be ultra-dependable such as safety-
                                    critical control systems. As well as validating that the system meets its requirements,
                                    the validation process may have to prove to an external regulator that the system is
                                    safe. For example, aircraft systems have to demonstrate to regulators, such as the
                                    Federal Aviation Authority, that the probability of a catastrophic system failure that
                                    affects aircraft safety is extremely low.
                                       Figure 11.2 shows that the relationship between costs and incremental improve-
                                    ments in dependability. If your software is not very dependable, you can get signifi-
                                    cant improvements at relatively low costs by using better software engineering.
                                    However, if you are already using good practice, the costs of improvement are much
                                    greater and the benefits from that improvement are less. There is also the problem of
                                    testing your software to demonstrate that it is dependable. This relies on running
                                    many tests and looking at the number of failures that occur. As your software
                                    becomes more dependable, you see fewer and fewer failures. Consequently, more
                                    and more tests are needed to try and assess how many problems remain in the
                                    software.  As  testing is  very  expensive, this dramatically increases the cost of
                                    high-dependability systems.
   306   307   308   309   310   311   312   313   314   315   316