% @(#)$Id: PointerWithNull.lsl,v 1.9 1995/07/26 15:43:24 leavens Exp $ % Pointers, with the possibility of the null pointer and invalid pointers. PointerWithNull(Elem): trait includes PrePointer(Elem) introduces NULL: -> Ptr[Elem] isNull, notNull, isLegal, isValid: Ptr[Elem] -> Bool allocated, allAllocated: Ptr[Elem] -> Bool minIndex, maxIndex: Ptr[Elem] -> int legalIndex, validUpTo, allocated, allocatedUpTo: Ptr[Elem], int -> Bool validInRange, allocatedInRange: Ptr[Elem], int, int -> Bool * __: Ptr[Elem] -> Elem __[__]: Ptr[Elem], int -> Elem slice: Ptr[Elem], int, int -> Arr[Elem] asserts sort Ptr[Elem] generated by NULL, [__,__] sort Ptr[Elem] partitioned by isNull, .idx, .locs \forall p: Ptr[Elem], i,j,siz: int isNull(p) == (p = NULL); notNull(p) == ~(p = NULL); legalIndex(p,i) == if isNull(p) then false else ((minIndex(p) <= i) /\ (i <= maxIndex(p))); isLegal(p) == isNull(p) \/ allocated(p.locs, p.idx); isValid(p) == notNull(p) /\ allocated(p.locs, p.idx); allocated(p) == isValid(p); allocated(p,i) == allocated(p+i); allAllocated(p) == isValid(p) /\ allAllocated(p.locs); validInRange(p,i,j) == if i > j then true else isValid(p+i) /\ validInRange(p,i+1,j); validUpTo(p,siz) == validInRange(p, 0, siz-1); allocatedInRange(p, i, j) == validInRange(p,i,j); allocatedUpTo(p,siz) == allocatedInRange(p, 0, siz-1); notNull(p) => (minIndex(p) = -(p.idx)); notNull(p) => (maxIndex(p) = maxIndex(p.locs) - p.idx); allocated(p) => (*p = p.locs[p.idx]); allocated(p,i) => (p[i] = p.locs[p.idx + i]); notNull(p) => (slice(p, i, j) = slice(p.locs, p.idx+i, p.idx+j)); implies \forall p: Ptr[Elem], i: int notNull(p) => (minIndex(p) + maxIndex(p) = maxIndex(p.locs)); isValid(p) == notNull(p) /\ isLegal(p); allocated(p,i) => (p[i] = *(p + i)); allocated(p,i) => (p[i] = (locs(p))[p.idx + i]); isValid(p) => isLegal(p); allocated(p) => isLegal(p); converts .idx, .locs, locs, index, isNull, notNull, isLegal, isValid, allocated: Ptr[Elem] -> Bool, allAllocated: Ptr[Elem] -> Bool, minIndex: Ptr[Elem] -> int, maxIndex: Ptr[Elem] -> int, legalIndex: Ptr[Elem], int -> Bool, allocated: Ptr[Elem], int -> Bool, validUpTo, allocatedUpTo: Ptr[Elem], int -> Bool, validInRange, allocatedInRange: Ptr[Elem], int, int -> Bool, slice: Ptr[Elem], int, int -> Arr[Elem] exempting \forall i,j: int NULL.idx, NULL.locs, locs(NULL), index(NULL), minIndex(NULL), maxIndex(NULL), slice(NULL, i, j)
[Index]
HTML generated using lcpp2html.