checkedint call removal

via Digitalmars-d digitalmars-d at puremagic.com
Thu Jul 31 13:01:31 PDT 2014


On Thursday, 31 July 2014 at 11:32:11 UTC, bearophile wrote:
> A problem with code like this is that it's drowing in noise. 
> The precondition/invariant/variant code in the 't3' function is 
> obscuring what the code is actually doing on the data:
> http://toccata.lri.fr/gallery/queens.en.html

Yes, if the algorithm is a bit involved it becomes complicated. 
It is also expensive to get right, $100-$1000 per line of code?

However, simple stuff that you often have in a standard library 
is usually easier on the eyes and easier to get right:

http://toccata.lri.fr/gallery/power.en.html

So, having a formally proven standard library would be quite 
within reach. And if you also have inlining + assume() you could 
do stuff like this

inline uint floor_sqrt(long x){
    assert(x>=0);
    uint r = _proven_floor_sqrt(x);
    assume(r<=x*x);
    assume( (r>(x-1)*(x-1)) || x==0 );
    return r
}

Precompiled library:

uint _proven_floor_sqrt(long x){
    assume(x>=0); // not test necessary, use this for optimization
    return ...
}

Another nice thing is that you can replace _proven… with 
handwritten machine language that has been exhaustively tested 
(all combinations) and still let the compiler assume() the 
postconditions with no runtime cost.

Another area where assume() is useful is for reading hardware 
registers that are guaranteed to have certain values so no 
runtime check is needed:

auto x = read_hw_register(123456);
assume( x==0 || x==1 || x==4 );

> I have added a third version here:
> http://rosettacode.org/wiki/Dutch_national_flag_problem#More_Verified_Version

Thanks, I like the way you go about this. Experimenting with the 
syntax this way.

> D lacks the pre-state (old a) and (at a 'Init), the loop 
> variants, the loop invariants (despite D has a invariant 
> keyword used for struct/classe invariants),

Yeah, I also think having invariant() in loops makes for more 
readable code than assert/enforce.

I imagine that you could specify a reduced set of D and do this:

D-source => machinetranslate => prover-source

prover-source => prover => proof-source

proof-source + prover-source => machinetranslate => D-source 
w/assume() etc


Btw, here is an example of an open source operating system kernel 
vetted against a haskell modell of the kernel:

http://sel4.systems/
https://github.com/seL4/seL4/tree/master/haskell

So, this formal correctness support in one way or another is 
clearly a valuable direction for a system level programming 
language.


More information about the Digitalmars-d mailing list