Everyone who writes safety critical software should read this
bearophile
bearophileHUGS at lycos.com
Sat Nov 2 05:56:21 PDT 2013
Timon Gehr:
> Well, if there is a formal proof of correctness, checking for
> overflow at runtime is as pointless as limiting oneself to a
> language without undefined behaviour in its basic semantics.
Perhaps you remember the funny quote by Knuth: "Beware of bugs in
the above code; I have only proved it correct, not tried it."
Proof of correctness are usually limited to certain subsystems,
because writing a proof for the whole system usually it too much
hard, or takes too much time/money, or because you have to
interface with modules written by subcontractors. Often there is
an "outer world" you are not including in your proof. This is a
common strategy for systems written in Spark-Ada, and this is
done even by NASA (and indeed was the cause of one famous crash
of a NASA probe). So you rely on the language and simpler means
to assure the safety of interfaces between the sections of the
program.
Another purpose for the run-time tests is to guard against random
flips of bits, caused by radiations, cosmic rays, interferences,
heat noise, etc. Such run-time tests are present in the probes on
Mars, because even space-hardened electronics sometimes errs (and
relying on other back-up means is not enough, as I have explained
in the precedent post).
And generally in high integrity systems you don't want to use a
language with undefined behaviour in its basic constructs because
such language is harder to test for the compiler writer too. If
you take a look at blogs that today discuss the semantics of C
programs you see there are cases where the C standard is
ambiguous and the GCC/Intel/Clang compilers behave differently.
This is a fragile foundation you don't want to build high
integrity software on. It took decades to write a certified C
compiler.
Bye,
bearophile
More information about the Digitalmars-d
mailing list