NetBSD/usr.bin/vndcompress
riastradh 76d4b81251 Clarify compile-time and run-time arithmetic safety assertions.
This is an experiment with a handful of macros for writing the
checks, most of which are compile-time:

MUL_OK(t, a, b)         Does a*b avoid overflow in type t?
ADD_OK(t, a, b)         Does a + b avoid overflow in type t?
TOOMANY(t, x, b, m)     Are there more than m b-element blocks in x in type t?
                        (I.e., does ceiling(x/b) > m?)

Addenda that might make sense but are not needed here:

MUL(t, a, b, &p)        Set p = a*b and return 0, or return ERANGE if overflow.
ADD(t, a, b, &s)        Set s = a+b and return 0, or return ERANGE if overflow.

Example:

	uint32_t a = ..., b = ..., y = ..., z = ..., x, w;

        /* input validation */
        error = MUL(size_t, a, b, &x);
        if (error)
                fail;
        if (TOOMANY(uint32_t, x, BLKSIZ, MAX_NBLK))
                fail;
        y = HOWMANY(x, BLKSIZ);
        if (z > Z_MAX)
                fail;
        ...
        /* internal computation */
        __CTASSERT(MUL_OK(uint32_t, Z_MAX, MAX_NBLK));
        w = z*y;

Obvious shortcomings:

1. Nothing checks your ctassert matches your subsequent arithmetic.
   (Maybe we could have BOUNDED_MUL(t, x, xmax, y, ymax) with a
   ctassert inside.)

2. Nothing flows the bounds needed by the arithmetic you use back
   into candidate definitions of X_MAX/Y_MAX.

But at least the reviewer's job is only to make sure that (a) the
MUL_OK matches the *, and (b) the bounds in the assertion match the
bounds on the inputs -- in particular, the reviewer need not derive
the bounds from the context, only confirm they are supported by the
paths to it.

This is not meant to be a general-purpose proof assistant, or even a
special-purpose one like gfverif <http://gfverif.cryptojedi.org/>.
Rather, it is an experiment in adding a modicum of compile-time
verification with a simple C API change.

This also is not intended to serve as trapping arithmetic on
overflow.  The goal here is to enable writing the program with
explicit checks on input and compile-time annotations on computation
to gain confident that overflow won't happen in the computation.
2017-07-29 21:04:07 +00:00
..
common.h Clarify compile-time and run-time arithmetic safety assertions. 2017-07-29 21:04:07 +00:00
main.c Rename block size option from -s' to -b'. 2014-01-22 06:17:25 +00:00
Makefile Fix vndcompress restart failure fallback when input is a pipe. 2014-11-18 03:48:17 +00:00
offtab.c Clarify compile-time and run-time arithmetic safety assertions. 2017-07-29 21:04:07 +00:00
offtab.h Justify the last unjustified assertion here. 2017-04-16 23:50:40 +00:00
utils.c Simplify. 2017-03-21 13:56:38 +00:00
utils.h Implement machinery for fixed-size windows into the offset table. 2014-01-22 06:15:22 +00:00
vndcompress.1 Bump date on vndcompress(1) man page. 2014-01-22 06:18:17 +00:00
vndcompress.c Clarify compile-time and run-time arithmetic safety assertions. 2017-07-29 21:04:07 +00:00
vnduncompress.c Clarify compile-time and run-time arithmetic safety assertions. 2017-07-29 21:04:07 +00:00