Handbook of Reliability Engineering

Xiaolin Teng and Hoang Pham
Software fault tolerance is achieved through special programming techniques that enable the software to detect and recover from failures. This requires redundant software elements that provide alternative means of fulfilling the same specifications. The different versions must be developed independently such that they do not have common faults, if any, to avoid simultaneous failures in response to the same inputs.
The difference between software fault tolerance and hardware fault tolerance is that software faults are usually design faults, and hardware faults are usually physical faults. Hardware physical faults can be tolerated in redundant (spare) copies of a component that are identical to the original, since it is commonly assumed that hardware components fail independently. However, software design faults cannot generally be tolerated in this way because the error is likely to recur on the spare component if it is identical to the original [1].
Two of the best known fault-tolerant software schemes are N-version programming (NVP) and recovery block (RB). Both schemes are based on software component redundancy and the assumption that coincident failures of components are rare.
NVP was proposed by Chen and Avizienis. In this scheme, there are N ?2 functionally equivalent programs, called versions, which are developed independently from the same initial specification. An independent development means that each version will be developed by different groups of people. Those individuals and groups do not communicate with each other during the software...