A way of interpreting the detailed analysis results
is required, so that failure modes can be identified.
The functions of a system are ideal since they have a
close link to the original requirements. The functions
must be captured in a form where they can be used
by an analysis tool. One such approach is the Func-
tional Interpretation Language (FIL)(Bell et al., 2007)
that has been successfully used to build hierarchical
functional models for electrical systems, and should
be general enough to apply to software. Such meth-
ods are designed to provide a formalised framework
that allows automated reasoning, while also provid-
ing an intuitive way for engineers to provide applica-
tion information. Some of the information is already
available, for example UML use cases identify user
level input/output relationships that have a close re-
semblance to the trigger/effect relationships that iden-
tify function state (inoperative, achieved, failed, unex-
pected) in the FIL.
Code execution is neither feasible nor required,
and specific values are not considered unless they
have a specific and distinct behavioural significance.
The analysis can be carried out at a number of lev-
els from system block diagrams, to state charts to the
code itself providing levels of effect detail. High level
analysis can demonstrate the effects of architectural
choices on potential failure behaviour, and low levels
can both verify that implementation details have not
modified the high level effects, as well as identify-
ing specific local vulnerabilities. Lower level or code
analysis must make use of pseudo-static methods that
abstract behaviour as necessary for failure analysis. In
an investigation into automated SFMEA (Snooke and
Price, 2008), the code is not executed and modified
functional dependency modelling (Chen et al., 2004;
Chen and Wotawa, 2003; Mateis et al., 1999) and data
path analysis combined with shape analysis (Corbett,
2000; Sagiv et al., 1998) that abstracts out the form of
data structures allow worst case effects to be consid-
ered. To take an example, if some code implements a
list, an error in the data value in the list will be pre-
dicted to propagate into any code that accesses the list.
It is not necessary to consider where (or even if) in an
execution cycle it will happen since sooner or later it
can. If a failure mode cannot happen for some (ap-
plication specific, or logical, or value related) reason
then documenting the implicit constraints and adding
the relevant checks into the code (possibly automati-
cally) will ensure that the system continues to exhibit
the required and tested behaviour.
We therefore envisage an analysis that does not
actually execute the code but is able to reason about
worst case analysis in the presence of faults. Clearly
the technicalities of such an analysis are complex
and some types of coding are more easily amenable;
for example embedded code that does not allow dy-
namic data structures is clearly much easier to anal-
yse. However as modelling and languages develop
more sophisticated ways to design software and pre-
vent programmer errors the constraints imposed also
make the analysis easier.
The failure modes of software based systems have
been considered by several studies (Raheja, 2005; Cz-
erney et al., 2005; Goddard, 2000). From these there
are a set of generic failure modes associated with soft-
ware, many of which are catastrophic at the level of
a software process such as failure to execute, exe-
cutes incompletely, failure to return from ISR. Others
such as coding errors, logic errors, I/O errors, exter-
nal hardware/software failure, definition of variables,
omissions in the specification, insufficient memory,
operational environment, resource conflict are gen-
eral and require specific instances to be considered
within the context of system functions and implemen-
tation. Hardware failures such as EMI/RFI, power
outage, corrupted memory, loose wires and cables are
not the concern of the software design, but rather of
the system architecture and can be addressed via ex-
isting hardware design techniques.
Other systems have similar distinctions for exam-
ple failures in electrical systems may cause catas-
trophic short-circuits and unexpected thermal over-
load in the wires of the system, but most affect only
(loss of) functionality. Design rule checking and good
design practice helps alleviate many of the catas-
trophic problems in electrical systems and in soft-
ware we have exception handlers, strong typing and
other widely used techniques to prevent catastrophic
execution failures. Functional failures are currently
much more difficult to assess and detect in software,
and such an analysis only makes sense once the sys-
tem structure and behaviour is somewhat localised.
The application specific failure modes then become
specific combinations of function failure, possibly in-
cluding an abstraction of the mechanism that causes
the failure.
In electrical systems physics provides fault local-
isation and results in limited effect propagation and
therefore most faults do not lead to total failure. In
software at the lowest level almost any fault is like this
and can also lead to almost any effect. For example
writing in assembly language on a Von Neuman archi-
tecture computer a fault leading to data being written
to the wrong address can lead to any effect when that
data is interpreted as an instruction.
Physical constraints such as spatial partitioning,
mass, manufacture cost and material strength consid-
erations tend to limit structural complexity, leading
ICSOFT 2010 - 5th International Conference on Software and Data Technologies
242