D enters Tiobe top 20

Doc Andrew x at x.com
Sun Nov 10 19:14:56 UTC 2019


On Sunday, 10 November 2019 at 10:22:27 UTC, Timon Gehr wrote:
> - Modular verification means it's enough to have DI files for 
> functions you call, without a function body.
>
In a unit testing world, every assert gets checked every time the 
function is called anyhow, so it makes little difference whether 
they are pre or post-conditions, or just sprinkled throughout a 
function.

In a verified world, it makes a _huge_ difference. A verified 
function with an "in" contract states, "this function satisfies 
all of its contracts (explicit and implicit) _if and only if_ the 
in contracts/preconditions are satisfied".

With this, once that function is verified,
a caller need only make sure that it satisfies those 
preconditions at each call site. In the absence of preconditions, 
the verifier has to re-prove _every_ assert() in the callee 
function (and every OTHER function that the callee uses too...) 
_every time_ it's called throughout the program. It's an 
exponential increase in the problem space.

You _might_ be able to do a flow analysis to suss out which 
asserts are considered preconditions without explicitly stating 
so, but it seems like a tough problem, and explicitly stating 
them seems like a better practice anyhow.

Modular verification is really the only tractable way to approach 
the problem. You build up the proof starting from leaf functions 
which, once proven, need only their pre-conditions checked at 
subsequent calls. Globals and functions with side-effects 
complicate this somewhat, but for pure functions it works very 
cleanly.

And like Timon said, in the absence of in/ out contracts in a .di 
file, verified libraries provide no way to extend their 
guarantees to the user.

-Doc



More information about the Digitalmars-d mailing list