[pro] Heartbleed?

Pascal J. Bourguignon pjb at informatimago.com
Tue Apr 29 07:45:55 UTC 2014


On 29 Apr 2014, at 09:12, Alexander Schreiber <als at thangorodrim.de> wrote:

> On Tue, Apr 29, 2014 at 12:40:09AM +0200, Pascal J. Bourguignon wrote:
>>  * Programmed in Common Lisp, either the fixnum in the Ariane 5 would have
>>    been converted into a bignum, or an condition would have been
>>    signaled, which could have been handled.  This would have taken
>>    time, which could perhaps have "exploded" the real time constraints,
>>    but it is better to control your rocket slughishly than not to
>>    control it at all.
> 
> That was not the real problem. The root cause was the design assumption that
> overflowing value was _physically_ limited, i.e. during normal operation
> it would have been impossible to overflow and an overflow would in fact have
> signaled some serious problems bad enough to abort. While this held true in
> Ariane 4, it no longer was true in the more powerful Ariane 5.
> 
> Your "solution" would have papered over the flawed design assumptions, which
> is _not_ the same is fixing them.

You’re forgetting we’re talking about embedded programs with real-time processes.  
You don’t have the time to stop everything and “debug” the design.  
You have to control a rocket and avoid it crashing!

That’s the reason I’ve not mentionned RAX yet: the situation was quite different, 
since they had the time to perform remote debugging, over several days.




>  * Programmed in Common Lisp, instead of using raw numbers of physical
>>    magnitudes, you'd use objects such as: 
>> 
>>      (+ #<kilometer/hour 5.42>  #<foot/fortnight 12857953.0> )
>>      --> #<meter/second 4.7455556>
>> 
>>    and Mars Climate Orbiter wouldn't have crashed.
> 
> This is ridiculous. If you end up mixing measurement systems (such as metric
> and imperial) in the same project, you are _already_ doing it horribly wrong.

It wasn’t in the same project.  The data was actually sent from a remote Earth station.  
So this is even worse than not using magnitude with units inside the process, it was a 
serialization/deserialization error.  But notice how Lisp prints out the speeds above!  
It writes the units along with the values!

Now, of course it’s not a programming language question.  We already determined that, 
when noting that neither the ANSI Common Lisp nor the ANSI C standard imposes 
bound checking, but that C programmers don’t code bound checkings, and C implementers, 
being C programmers, implement compilers that don’t do bound checking, while the 
inverse is true of Common Lisp programmers.

This is always the same thing:  “statically typed” proponents want to separate the checks 
from the code, performing (or not) the checks during design/proof/compilation,  while 
“dynamically typed” proponents keep the checks inside the code, making the compiler 
and system generate and perform all the typing, bounds, etc checks at run-time.  
So when a C guy (any statically typed guy) sends data, he expects that the type and
bounds of the data are know (before hand, by both parties).  But when a Lisp guy (any 
dynamically typed guy) sends data, he sends it in a syntactic form that explicitely 
types it, and the data is parsed, validated, bound checked and typed according to 
the transmitted syntax on the receiving end.


Of course, generating C code doesn’t mean that you can’t design your system in a 
"dynamically typed” spirit.  But this is not the natural noosphere of the C ecosystem.




> The design fault was mixing measurement systems, which one should _never_ do
> on pain of embarassing failure. Papering over this design screwup with a
> language environment that _supports_ this (instead of screaming bloody
> murder at such nonsense) doesn't really help here.


Again, we are talking about an embedded program, in a real time system, where you 
have only seconds of burn stage on re-entry, and where you DON’T HAVE THE TIME 
to detect, debug, come back to the design board, compile and upload a new version!

The software that uploaded the untagged, without units, bit field *data*, instead of 
some meaningful *information*, hadn’t even been completed before the orbiter was 
in space!  It wasn’t developed by the same team, and wasn’t compiled into the same 
executable.

Nonetheless, here a lisper would have sent *information* in a sexp, and dynamic 
checks and conversions would have been done.

If you will, the design would have been different in the first place!


>>  * Programmed in Common Lisp, the Therac-5 bug wouldn't have occured:
>> 
>>      "The defect was as follows: a one-byte counter in a testing
>>       routine frequently overflowed; if an operator provided manual
>>       input to the machine at the precise moment that this counter
>>       overflowed, the interlock would fail."
> 
> But why did the counter overflow in the first place? Was it simply programmer
> oversight that too small a datatype was used or was this actually an error
> that just didn't have noticeable consequences most of the times?  If the
> later, then again, papering over it with a never overflowing counter is
> not a fix.

But it if was a problem, it *would* eventually reach a bound check, and signal 
a condition, thus stopping the process of irradiating and killing people.

Remember: a Lisp program (any "dynamically typed” program) is FULL of checks!



>>    since again, incrementing a counter doesn't fucking overflow in
>>    lisp!
>> 
>>  * Programmed in Common Lisp, heartbleed wouldn't have occured, because
>>    lisp implementors provide array bound checks, and lisp programmers
>>    are conscious enough to run always with (safety 3), as previously
>>    discussed in this thread.
> 
> Hehe, "conscious enough to run always with (safety 3)". Riiiiight. And nobody
> was ever tempted to trade a little runtime safety for speed, correct?

Those are C programmers.  You won’t find any other safety that 3 in my code.  
You should not find any other safety than 3 in mission critical code, much less
in life threatening code.


> As for heartbleed: arguably, the RFC that the broken code implemented
> shouldn't have existed in the first place.
> 
>> What I'm saying is that there's a mind set out-there, of using modular
>> arithmetic to approximate arithmetic blindly.  Until you will be able to
>> pay $1.29 for 3 kg of apples @ $2.99, people should not program with
>> modular arithmetic!
> 
> Well, modular arithmetic doesn't go away because one wishes it so. As a
> developer doing non time critical high level work one might be able to
> cheerfully ignore it, but the moment one writes sufficiently time critical
> or low level code one will have to deal with it. Because modular arithmetic
> is what your CPU is doing - unless you happen to have a CPU at hand that
> does bignums natively at the register level? No? Funny that.

This might have been true in 1968, when adding a bit of memory added 50 gr. of payload!

Nowadays, there’s no excuse.


>>> And if the flight safety of an aircraft depended upon the current
>>> Lisp version of Ironclad's impenetrability, we would be in trouble.
>> 
>> This is another question, that of the resources invested in a software
>> ecosystem, and that of programming language mind share.   Why the
>> cryptographists don't write their libraries in Common Lisp and choose to
>> produce piles of C instead?
> 
> Usefulness. If I write a library in C, pretty much everything that runs on
> Unix can link to it (if need be, via FFI and friends) and use it. If I write
> a library i Common Lisp, then code written in Common Lisp can use it unless
> people are willing to do some interesting contortions (such wrapping it in
> an RPC server).

Anything running on unix can link to libecl.so (which is ironically a CL
 implementation using gcc, but we can assume it’s a temporary solution).


> Exercise for the interested: write a library in Common Lisp that does, say,
> some random data frobnication and try to use it from: C, Python, Perl, C++
> _without_ writing new interface infrastructure.

But the point is to eliminate code written in C, Perl, C++! So your exercise is academic.

— 
__Pascal Bourguignon__



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/pro/attachments/20140429/8cafec43/attachment.html>


More information about the pro mailing list