From 9741ae6286d2b830597176626184222fe8d85b16 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Tue, 4 Jan 2022 07:15:03 -0800 Subject: [PATCH 01/27] added a case to simplify1PermForDetVars to end lifetimes which are no longer determined --- heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs b/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs index 21116bbaca..d472a2fee0 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs @@ -3695,6 +3695,11 @@ simplify1PermForDetVars det_vars x (ValPerm_Conj ps) getPerm x >>>= \new_p -> simplify1PermForDetVars det_vars x new_p +-- For permission l:lowned(ps_in -o ps_out) where l is not determined, end l +simplify1PermForDetVars det_vars l (ValPerm_LOwned _ _ _) + | not (NameSet.member l det_vars) + = implEndLifetimeRecM l + -- For lowned permission l:lowned[ls](ps_in -o ps_out), end any lifetimes in ls -- that are not determined and remove them from the lowned permission for ls simplify1PermForDetVars det_vars l (ValPerm_LOwned ls _ _) From 180dbb7c94804a0aef011c354a1d23ef3b20caf9 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Tue, 4 Jan 2022 15:43:35 -0800 Subject: [PATCH 02/27] changed equal shapes to be parameterized by a length --- .../Verifier/SAW/Heapster/IRTTranslation.hs | 4 +- .../src/Verifier/SAW/Heapster/Implication.hs | 53 ++++++++++--------- .../src/Verifier/SAW/Heapster/Parser.y | 2 +- .../src/Verifier/SAW/Heapster/Permissions.hs | 45 +++++++++------- .../Verifier/SAW/Heapster/SAWTranslation.hs | 6 ++- .../src/Verifier/SAW/Heapster/TypeChecker.hs | 2 +- .../src/Verifier/SAW/Heapster/UntypedAST.hs | 4 +- .../src/Verifier/SAW/Heapster/Widening.hs | 5 +- 8 files changed, 68 insertions(+), 53 deletions(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/IRTTranslation.hs b/heapster-saw/src/Verifier/SAW/Heapster/IRTTranslation.hs index b762eae64a..d440ac4a2f 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/IRTTranslation.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/IRTTranslation.hs @@ -457,7 +457,7 @@ instance IRTTyVars (PermExpr (LLVMShapeType w)) where _ -> do sh' <- irtTSubstExt mb_sh let sh_trans = transTupleTerm <$> translate sh' return ([sh_trans], IRTVar ()) - [nuMP| PExpr_EqShape _ |] -> return ([], IRTVarsNil) + [nuMP| PExpr_EqShape _ _ |] -> return ([], IRTVarsNil) [nuMP| PExpr_PtrShape _ _ sh |] -> irtTyVars sh [nuMP| PExpr_FieldShape fsh |] -> irtTyVars fsh [nuMP| PExpr_ArrayShape _ _ sh |] -> irtTyVars sh @@ -677,7 +677,7 @@ instance IRTDescs (PermExpr (LLVMShapeType w)) where irtDescs mb_expr ixs = case (mbMatch mb_expr, ixs) of ([nuMP| PExpr_Var _ |], _) -> irtVarTDesc ixs ([nuMP| PExpr_EmptyShape |], _) -> return [] - ([nuMP| PExpr_EqShape _ |], _) -> return [] + ([nuMP| PExpr_EqShape _ _ |], _) -> return [] ([nuMP| PExpr_NamedShape _ _ nmsh args |], _) -> case (mbMatch $ namedShapeBody <$> nmsh, ixs) of (_, IRTRecVar) -> diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs index 594b91f78d..93211d3b5f 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs @@ -1012,9 +1012,9 @@ data SimplImpl ps_in ps_out where SimplImpl (RNil :> LLVMPointerType w) (RNil :> LLVMPointerType w) -- | Prove an llvmblock permission of shape @sh@ from one of equality shape - -- @eqsh(y)@ and a shape permission on @y@: + -- @eqsh(len,y)@ and a shape permission on @y@: -- - -- > x:memblock(rw,l,off,len,eqsh(y)), y:shape(sh) + -- > x:memblock(rw,l,off,len,eqsh(len,y)), y:shape(sh) -- > -o x:memblock(rw,l,off,len,sh) SImpl_IntroLLVMBlockFromEq :: (1 <= w, KnownNat w) => ExprVar (LLVMPointerType w) -> @@ -1329,7 +1329,7 @@ data PermImpl1 ps_in ps_outs where -- @eqsh(y)@ and a shape permission on @y@ for a fresh variable @y@: -- -- > x:memblock(rw,l,off,len,sh) - -- > -o y. x:memblock(rw,l,off,len,eqsh(y)), + -- > -o y. x:memblock(rw,l,off,len,eqsh(len,y)), -- > y:shape('modalizeShape'(rw,l,sh)) Impl1_ElimLLVMBlockToEq :: (1 <= w, KnownNat w) => ExprVar (LLVMPointerType w) -> LLVMBlockPerm w -> @@ -1920,7 +1920,8 @@ simplImplIn (SImpl_ElimLLVMBlockNamed x bp _) = distPerms1 x $ ValPerm_LLVMBlock bp simplImplIn (SImpl_IntroLLVMBlockFromEq x bp y) = distPerms2 x (ValPerm_Conj1 $ Perm_LLVMBlock $ - bp { llvmBlockShape = PExpr_EqShape $ PExpr_Var y }) + bp { llvmBlockShape = + PExpr_EqShape (llvmBlockLen bp) $ PExpr_Var y }) y (ValPerm_Conj1 $ Perm_LLVMBlockShape $ llvmBlockShape bp) simplImplIn (SImpl_IntroLLVMBlockPtr x bp) = case llvmBlockPtrShapeUnfold bp of @@ -2452,7 +2453,8 @@ applyImpl1 _ (Impl1_ElimLLVMBlockToEq x bp) ps = pushPerm y (ValPerm_Conj1 $ Perm_LLVMBlockShape $ modalizeBlockShape bp) $ set (topDistPerm x) (ValPerm_Conj1 $ Perm_LLVMBlock $ - bp { llvmBlockShape = PExpr_EqShape $ PExpr_Var y }) + bp { llvmBlockShape = + PExpr_EqShape (llvmBlockLen bp) (PExpr_Var y) }) ps) else error "applyImpl1: Impl1_ElimLLVMBlockToEq: unexpected permission" @@ -3614,7 +3616,7 @@ implElimLLVMBlockToEq :: ImplM vars s r (ps :> LLVMPointerType w) (ps :> LLVMPointerType w) (ExprVar (LLVMBlockType w)) implElimLLVMBlockToEq _ (LLVMBlockPerm - { llvmBlockShape = PExpr_EqShape (PExpr_Var y)}) = + { llvmBlockShape = PExpr_EqShape _ (PExpr_Var y)}) = pure y implElimLLVMBlockToEq x bp = implApplyImpl1 (Impl1_ElimLLVMBlockToEq x bp) @@ -4675,17 +4677,18 @@ implElimLLVMBlock x bp@(LLVMBlockPerm { llvmBlockShape = then implSetRecRecurseLeftM else pure ()) >>> implSimplM Proxy (SImpl_ElimLLVMBlockNamed x bp nmsh) --- For shape eqsh(y), prove y:block(sh) for some sh and then apply +-- For shape eqsh(len,y), prove y:block(sh) for some sh and then apply -- SImpl_IntroLLVMBlockFromEq implElimLLVMBlock x bp@(LLVMBlockPerm { llvmBlockShape = - PExpr_EqShape (PExpr_Var y) }) = - mbVarsM () >>>= \mb_unit -> - withExtVarsM (proveVarImplInt y $ mbCombine RL.typeCtxProxies $ - flip mbConst mb_unit $ - nu $ \sh -> ValPerm_Conj1 $ - Perm_LLVMBlockShape $ PExpr_Var sh) >>>= \(_, sh) -> - let bp' = bp { llvmBlockShape = sh } in - implSimplM Proxy (SImpl_IntroLLVMBlockFromEq x bp' y) + PExpr_EqShape len (PExpr_Var y) }) + | bvEq len (llvmBlockLen bp) = + mbVarsM () >>>= \mb_unit -> + withExtVarsM (proveVarImplInt y $ mbCombine RL.typeCtxProxies $ + flip mbConst mb_unit $ + nu $ \sh -> ValPerm_Conj1 $ + Perm_LLVMBlockShape $ PExpr_Var sh) >>>= \(_, sh) -> + let bp' = bp { llvmBlockShape = sh } in + implSimplM Proxy (SImpl_IntroLLVMBlockFromEq x bp' y) -- For [l]ptrsh(rw,sh), eliminate to a pointer to a memblock with shape sh implElimLLVMBlock x bp@(LLVMBlockPerm { llvmBlockShape = PExpr_PtrShape _ _ _ }) @@ -6669,23 +6672,25 @@ proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps proveVarLLVMBlocks x ps' psubst (mb_bp:mb_bps) --- If proving an equality shape eqsh(z) for evar z which has already been set, --- substitute for z and recurse +-- If proving an equality shape eqsh(len,z) for evar z which has already been +-- set, substitute for z and recurse proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps - | [nuMP| PExpr_EqShape (PExpr_Var mb_z) |] <- mb_sh + | [nuMP| PExpr_EqShape _ (PExpr_Var mb_z) |] <- mb_sh , Left memb <- mbNameBoundP mb_z , Just blk <- psubstLookup psubst memb = - let mb_bp' = fmap (\bp -> bp { llvmBlockShape = - PExpr_EqShape blk }) mb_bp in + let mb_bp' = fmap (\bp -> + let PExpr_EqShape len _ = llvmBlockShape bp in + bp { llvmBlockShape = PExpr_EqShape len blk }) mb_bp in proveVarLLVMBlocks x ps psubst (mb_bp' : mb_bps) --- If proving an equality shape eqsh(z) for unset evar z, prove any memblock +-- If proving an equality shape eqsh(len,z) for unset evar z, prove any memblock -- perm with the given offset and length and eliminate it to an llvmblock with -- an equality shape proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps - | [nuMP| PExpr_EqShape (PExpr_Var mb_z) |] <- mb_sh + | [nuMP| PExpr_EqShape mb_len (PExpr_Var mb_z) |] <- mb_sh , Left memb <- mbNameBoundP mb_z + , Just len <- partialSubst psubst mb_len , Nothing <- psubstLookup psubst memb = -- Locally bind z_sh for the shape of the memblock perm and recurse @@ -6703,7 +6708,7 @@ proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps -- Eliminate that block perm to have an equality shape, and set z to the -- resulting block implElimLLVMBlockToEq x bp >>>= \y_blk -> - let bp' = bp { llvmBlockShape = PExpr_EqShape $ PExpr_Var y_blk } in + let bp' = bp { llvmBlockShape = PExpr_EqShape len $ PExpr_Var y_blk } in setVarM memb (PExpr_Var y_blk) >>> -- Finally, recombine the resulting permission with the rest of them @@ -6715,7 +6720,7 @@ proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps -- this exactly offset, length, and shape, because it would have matched the -- first case above, so try to eliminate a memblock and recurse proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps - | [nuMP| PExpr_EqShape (PExpr_Var mb_z) |] <- mb_sh + | [nuMP| PExpr_EqShape _ (PExpr_Var mb_z) |] <- mb_sh , Right _ <- mbNameBoundP mb_z , Just off <- partialSubst psubst $ mbLLVMBlockOffset mb_bp , Just i <- findIndex (\case diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Parser.y b/heapster-saw/src/Verifier/SAW/Heapster/Parser.y index dd56cb132f..000ab3bc6c 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Parser.y +++ b/heapster-saw/src/Verifier/SAW/Heapster/Parser.y @@ -155,7 +155,7 @@ expr :: { AstExpr } | 'emptysh' { ExEmptySh (pos $1) } | expr 'orsh' expr { ExOrSh (pos $2) $1 $3 } | expr ';' expr { ExSeqSh (pos $2) $1 $3 } - | 'eqsh' '(' expr ')' { ExEqSh (pos $1) $3 } + | 'eqsh' '(' expr ',' expr ')' { ExEqSh (pos $1) $3 $5 } | lifetime 'ptrsh' '(' expr ',' expr ')' { ExPtrSh (pos $2) $1 (Just $4) $6 } | lifetime 'ptrsh' '(' expr ')' { ExPtrSh (pos $2) $1 Nothing $4 } | 'fieldsh' '(' expr ',' expr ')' { ExFieldSh (pos $1) (Just $3) $5 } diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs b/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs index 40eea5033e..1ce3889e90 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs @@ -622,8 +622,10 @@ data PermExpr (a :: CrucibleType) where NamedShape b args w -> PermExprs args -> PermExpr (LLVMShapeType w) - -- | The equality shape - PExpr_EqShape :: PermExpr (LLVMBlockType w) -> PermExpr (LLVMShapeType w) + -- | The equality shape, which describes some @N@ bytes of memory that are + -- equal to a given LLVM block + PExpr_EqShape :: PermExpr (BVType w) -> PermExpr (LLVMBlockType w) -> + PermExpr (LLVMShapeType w) -- | A shape for a pointer to another memory block, i.e., a @memblock@ -- permission, with a given shape. This @memblock@ permission will have the @@ -900,8 +902,8 @@ instance Eq (PermExpr a) where maybe_rw1 == maybe_rw2 && maybe_l1 == maybe_l2 && args1 == args2 (PExpr_NamedShape _ _ _ _) == _ = False - (PExpr_EqShape b1) == (PExpr_EqShape b2) = b1 == b2 - (PExpr_EqShape _) == _ = False + (PExpr_EqShape len1 b1) == (PExpr_EqShape len2 b2) = len1 == len2 && b1 == b2 + (PExpr_EqShape _ _) == _ = False (PExpr_PtrShape rw1 l1 sh1) == (PExpr_PtrShape rw2 l2 sh2) = rw1 == rw2 && l1 == l2 && sh1 == sh2 @@ -975,8 +977,10 @@ instance PermPretty (PermExpr a) where args_pp <- permPrettyM args return (l_pp <> rw_pp <> pretty (namedShapeName nmsh) <> pretty '<' <> align (args_pp <> pretty '>')) - permPrettyM (PExpr_EqShape b) = - ((pretty "eqsh" <>) . parens) <$> permPrettyM b + permPrettyM (PExpr_EqShape len b) = + do len_pp <- permPrettyM len + b_pp <- permPrettyM b + return (pretty "eqsh" <> parens (len_pp <> comma <> b_pp)) permPrettyM (PExpr_PtrShape maybe_rw maybe_l sh) = do l_pp <- maybe (return mempty) permPrettyLifetimePrefix maybe_l rw_pp <- case maybe_rw of @@ -3821,10 +3825,10 @@ llvmShapeLength (PExpr_NamedShape _ _ nmsh@(NamedShape _ _ -- FIXME: if the recursive shape contains itself *not* under a pointer, then -- this could diverge llvmShapeLength (unfoldNamedShape nmsh args) -llvmShapeLength (PExpr_EqShape _) = Nothing +llvmShapeLength (PExpr_EqShape len _) = Just len llvmShapeLength (PExpr_PtrShape _ _ sh) - | LLVMShapeRepr w <- exprType sh = Just $ bvInt (intValue w `ceil_div` 8) - | otherwise = Nothing + | w <- shapeLLVMTypeWidth sh + = Just $ bvInt (intValue w `ceil_div` 8) llvmShapeLength (PExpr_FieldShape fsh) = Just $ bvInt $ llvmFieldShapeLength fsh llvmShapeLength (PExpr_ArrayShape len stride _) = Just $ bvMult stride len @@ -3936,7 +3940,7 @@ modalizeShape _ _ sh@(PExpr_NamedShape _ _ nmsh _) modalizeShape rw l (PExpr_NamedShape rw' l' nmsh args) = -- If a named shape already has modalities, they take precedence Just $ PExpr_NamedShape (rw' <|> rw) (l' <|> l) nmsh args -modalizeShape _ _ sh@(PExpr_EqShape _) = Just sh +modalizeShape _ _ sh@(PExpr_EqShape _ _) = Just sh modalizeShape rw l (PExpr_PtrShape rw' l' sh) = -- If a pointer shape already has modalities, they take precedence Just $ PExpr_PtrShape (rw' <|> rw) (l' <|> l) sh @@ -4066,7 +4070,7 @@ splitLLVMBlockPerm off bp@(llvmBlockShape -> , Just sh' <- unfoldModalizeNamedShape maybe_rw maybe_l nmsh args = splitLLVMBlockPerm off (bp { llvmBlockShape = sh' }) splitLLVMBlockPerm _ (llvmBlockShape -> PExpr_NamedShape _ _ _ _) = Nothing -splitLLVMBlockPerm _ (llvmBlockShape -> PExpr_EqShape _) = Nothing +splitLLVMBlockPerm _ (llvmBlockShape -> PExpr_EqShape _ _) = Nothing splitLLVMBlockPerm _ (llvmBlockShape -> PExpr_PtrShape _ _ _) = Nothing splitLLVMBlockPerm _ (llvmBlockShape -> PExpr_FieldShape _) = Nothing splitLLVMBlockPerm off bp@(llvmBlockShape -> PExpr_ArrayShape len stride sh) @@ -5148,7 +5152,7 @@ shapeIsCopyable rw (PExpr_NamedShape maybe_rw' _ nmsh args) = -- the empty shape for the recursive shape RecShapeBody mb_sh _ _ -> shapeIsCopyable rw $ subst (substOfExprs (args :>: PExpr_EmptyShape)) mb_sh -shapeIsCopyable _ (PExpr_EqShape _) = True +shapeIsCopyable _ (PExpr_EqShape _ _) = True shapeIsCopyable rw (PExpr_PtrShape maybe_rw' _ sh) = let rw' = maybe rw id maybe_rw' in rw' == PExpr_Read && shapeIsCopyable rw' sh @@ -5321,7 +5325,7 @@ instance FreeVars (PermExpr a) where freeVars PExpr_EmptyShape = NameSet.empty freeVars (PExpr_NamedShape rw l nmsh args) = NameSet.unions [freeVars rw, freeVars l, freeVars nmsh, freeVars args] - freeVars (PExpr_EqShape b) = freeVars b + freeVars (PExpr_EqShape len b) = NameSet.union (freeVars len) (freeVars b) freeVars (PExpr_PtrShape maybe_rw maybe_l sh) = NameSet.unions [freeVars maybe_rw, freeVars maybe_l, freeVars sh] freeVars (PExpr_FieldShape fld) = freeVars fld @@ -5534,7 +5538,7 @@ readOnlyShape e@(PExpr_Var _) = e readOnlyShape PExpr_EmptyShape = PExpr_EmptyShape readOnlyShape (PExpr_NamedShape _ l nmsh args) = PExpr_NamedShape (Just PExpr_Read) l nmsh args -readOnlyShape e@(PExpr_EqShape _) = e +readOnlyShape e@(PExpr_EqShape _ _) = e readOnlyShape e@(PExpr_PtrShape _ (Just _) _) = e readOnlyShape (PExpr_PtrShape _ Nothing sh) = PExpr_PtrShape (Just PExpr_Read) Nothing $ readOnlyShape sh @@ -5717,8 +5721,8 @@ instance SubstVar s m => Substable s (PermExpr a) m where [nuMP| PExpr_NamedShape rw l nmsh args |] -> PExpr_NamedShape <$> genSubst s rw <*> genSubst s l <*> genSubst s nmsh <*> genSubst s args - [nuMP| PExpr_EqShape b |] -> - PExpr_EqShape <$> genSubst s b + [nuMP| PExpr_EqShape len b |] -> + PExpr_EqShape <$> genSubst s len <*> genSubst s b [nuMP| PExpr_PtrShape maybe_rw maybe_l sh |] -> PExpr_PtrShape <$> genSubst s maybe_rw <*> genSubst s maybe_l <*> genSubst s sh @@ -6463,8 +6467,9 @@ instance AbstractVars (PermExpr a) where `clMbMbApplyM` abstractPEVars ns1 ns2 l `clMbMbApplyM` abstractPEVars ns1 ns2 nmsh `clMbMbApplyM` abstractPEVars ns1 ns2 args - abstractPEVars ns1 ns2 (PExpr_EqShape b) = + abstractPEVars ns1 ns2 (PExpr_EqShape len b) = absVarsReturnH ns1 ns2 ($(mkClosed [| PExpr_EqShape |])) + `clMbMbApplyM` abstractPEVars ns1 ns2 len `clMbMbApplyM` abstractPEVars ns1 ns2 b abstractPEVars ns1 ns2 (PExpr_PtrShape maybe_rw maybe_l sh) = absVarsReturnH ns1 ns2 ($(mkClosed [| PExpr_PtrShape |])) @@ -6828,7 +6833,8 @@ instance AbstractNamedShape w (PermExpr a) where -> pure $ nu PExpr_Var True -> fail "named shape not applied to its arguments" False -> pureBindingM (PExpr_NamedShape maybe_rw maybe_l nmsh args) - abstractNSM (PExpr_EqShape b) = fmap PExpr_EqShape <$> abstractNSM b + abstractNSM (PExpr_EqShape len b) = + mbMap2 PExpr_EqShape <$> abstractNSM len <*> abstractNSM b abstractNSM (PExpr_PtrShape rw l sh) = mbMap3 PExpr_PtrShape <$> abstractNSM rw <*> abstractNSM l <*> abstractNSM sh abstractNSM (PExpr_FieldShape fsh) = fmap PExpr_FieldShape <$> abstractNSM fsh @@ -7556,7 +7562,8 @@ getShapeDetVarsClauses (PExpr_Var x) = getShapeDetVarsClauses (PExpr_NamedShape _ _ _ args) = -- FIXME: maybe also include the variables determined by the modalities? getDetVarsClauses args -getShapeDetVarsClauses (PExpr_EqShape e) = getDetVarsClauses e +getShapeDetVarsClauses (PExpr_EqShape len e) = + map (detVarsClauseAddLHS (freeVars len)) <$> getDetVarsClauses e getShapeDetVarsClauses (PExpr_PtrShape _ _ sh) = -- FIXME: maybe also include the variables determined by the modalities? getShapeDetVarsClauses sh diff --git a/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs b/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs index d77917b534..97649a489a 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs @@ -909,7 +909,7 @@ instance TransInfo info => [nuMP| RecShapeBody _ trans_id _ |] -> ETrans_Term <$> applyOpenTermMulti (globalOpenTerm $ mbLift trans_id) <$> transTerms <$> translate args - [nuMP| PExpr_EqShape _ |] -> return $ ETrans_Term unitTypeOpenTerm + [nuMP| PExpr_EqShape _ _ |] -> return $ ETrans_Term unitTypeOpenTerm [nuMP| PExpr_PtrShape _ _ sh |] -> translate sh [nuMP| PExpr_FieldShape fsh |] -> ETrans_Term <$> tupleOfTypes <$> translate fsh @@ -3523,8 +3523,10 @@ translatePermImpl1 prx mb_impl mb_impls = case (mbMatch mb_impl, mbMatch mb_impl mbCombine RL.typeCtxProxies $ mbMapCl $(mkClosed [| \bp -> nu $ \y -> + let len = llvmBlockLen bp in ValPerm_Conj1 $ Perm_LLVMBlock $ - bp { llvmBlockShape = PExpr_EqShape $ PExpr_Var y } |]) + bp { llvmBlockShape = + PExpr_EqShape len $ PExpr_Var y } |]) mb_bp tp_trans1 <- translate mb_p_out1 let mb_p_out2 = diff --git a/heapster-saw/src/Verifier/SAW/Heapster/TypeChecker.hs b/heapster-saw/src/Verifier/SAW/Heapster/TypeChecker.hs index 2ac7d0a5f0..51a0c87531 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/TypeChecker.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/TypeChecker.hs @@ -424,7 +424,7 @@ tcLLVMShape (ExExSh _ var vartype sh) = withExprVar var (unKnownReprObj ktp') z (tcKExpr sh) tcLLVMShape (ExSeqSh _ x y) = PExpr_SeqShape <$> tcKExpr x <*> tcKExpr y tcLLVMShape ExEmptySh{} = pure PExpr_EmptyShape -tcLLVMShape (ExEqSh _ v) = PExpr_EqShape <$> tcKExpr v +tcLLVMShape (ExEqSh _ len v) = PExpr_EqShape <$> tcKExpr len <*> tcKExpr v tcLLVMShape (ExPtrSh _ maybe_l maybe_rw sh) = PExpr_PtrShape <$> traverse tcKExpr maybe_l diff --git a/heapster-saw/src/Verifier/SAW/Heapster/UntypedAST.hs b/heapster-saw/src/Verifier/SAW/Heapster/UntypedAST.hs index 557b858282..125bff3355 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/UntypedAST.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/UntypedAST.hs @@ -54,7 +54,7 @@ data AstExpr | ExOr Pos AstExpr AstExpr | ExEmptySh Pos -- ^ empty shape - | ExEqSh Pos AstExpr -- ^ equal shape + | ExEqSh Pos AstExpr AstExpr -- ^ equal shape | ExTrue Pos -- ^ trivial permission | ExExists Pos String AstType AstExpr -- ^ existentially quantified value | ExSeqSh Pos AstExpr AstExpr -- ^ sequenced shapes @@ -94,7 +94,7 @@ instance HasPos AstExpr where pos (ExStruct p _ ) = p pos (ExLlvmWord p _ ) = p pos (ExEmptySh p ) = p - pos (ExEqSh p _ ) = p + pos (ExEqSh p _ _ ) = p pos (ExEq p _ ) = p pos (ExOr p _ _ ) = p pos (ExTrue p ) = p diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Widening.hs b/heapster-saw/src/Verifier/SAW/Heapster/Widening.hs index c0133094be..01c12c35a3 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Widening.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Widening.hs @@ -393,8 +393,9 @@ widenExpr' _ (PExpr_NamedShape Nothing Nothing nmsh1 args1) PExpr_NamedShape Nothing Nothing nmsh1 <$> widenExprs (namedShapeArgs nmsh1) args1 args2 -widenExpr' (LLVMShapeRepr w) (PExpr_EqShape e1) (PExpr_EqShape e2) = - PExpr_EqShape <$> widenExpr (LLVMBlockRepr w) e1 e2 +widenExpr' (LLVMShapeRepr w) (PExpr_EqShape len1 e1) (PExpr_EqShape len2 e2) + | bvEq len1 len2 + = PExpr_EqShape len1 <$> widenExpr (LLVMBlockRepr w) e1 e2 widenExpr' tp (PExpr_PtrShape Nothing Nothing sh1) (PExpr_PtrShape Nothing Nothing sh2) = From 4a699e3a76e51ce40377006825c30cfc475ceec7 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Wed, 5 Jan 2022 12:13:08 -0800 Subject: [PATCH 03/27] added rules SImpl_IntroLLVMBlockNamedMods and SImpl_ElimLLVMBlockNamedMods to introduce an eliminate just the modalities on named shapes --- .../src/Verifier/SAW/Heapster/Implication.hs | 91 ++++++++++++++++++- .../Verifier/SAW/Heapster/SAWTranslation.hs | 14 +++ 2 files changed, 103 insertions(+), 2 deletions(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs index 93211d3b5f..fa97a1dafb 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs @@ -1011,6 +1011,22 @@ data SimplImpl ps_in ps_out where NamedShape 'True args w -> SimplImpl (RNil :> LLVMPointerType w) (RNil :> LLVMPointerType w) + -- | Add modalities to a named shape in a @memblock@ permission: + -- + -- > x:memblock(rw,l,off,len,nmsh) + -- > -o memblock(rw',l',off,len,[l](rw)nmsh) + SImpl_IntroLLVMBlockNamedMods :: + (1 <= w, KnownNat w) => ExprVar (LLVMPointerType w) -> LLVMBlockPerm w -> + SimplImpl (RNil :> LLVMPointerType w) (RNil :> LLVMPointerType w) + + -- | Eliminate modalities on a named shape in a @memblock@ permission: + -- + -- > x:memblock(rw,l,off,len,[l'](rw')nmsh) + -- > -o memblock(rw',l',off,len,nmsh) + SImpl_ElimLLVMBlockNamedMods :: + (1 <= w, KnownNat w) => ExprVar (LLVMPointerType w) -> LLVMBlockPerm w -> + SimplImpl (RNil :> LLVMPointerType w) (RNil :> LLVMPointerType w) + -- | Prove an llvmblock permission of shape @sh@ from one of equality shape -- @eqsh(len,y)@ and a shape permission on @y@: -- @@ -1918,6 +1934,17 @@ simplImplIn (SImpl_IntroLLVMBlockNamed x bp nmsh) = _ -> error "simplImplIn: SImpl_IntroLLVMBlockNamed: unexpected block shape" simplImplIn (SImpl_ElimLLVMBlockNamed x bp _) = distPerms1 x $ ValPerm_LLVMBlock bp +simplImplIn (SImpl_IntroLLVMBlockNamedMods x bp) = + case llvmBlockShape bp of + PExpr_NamedShape maybe_rw maybe_l nmsh args + | rw <- fromMaybe (llvmBlockRW bp) maybe_rw + , l <- fromMaybe (llvmBlockLifetime bp) maybe_l -> + distPerms1 x $ ValPerm_LLVMBlock $ + bp { llvmBlockRW = rw, llvmBlockLifetime = l, + llvmBlockShape = PExpr_NamedShape Nothing Nothing nmsh args } + _ -> error "simplImplIn: SImpl_IntroLLVMBlockNamedMods: malformed input permission" +simplImplIn (SImpl_ElimLLVMBlockNamedMods x bp) = + distPerms1 x $ ValPerm_LLVMBlock bp simplImplIn (SImpl_IntroLLVMBlockFromEq x bp y) = distPerms2 x (ValPerm_Conj1 $ Perm_LLVMBlock $ bp { llvmBlockShape = @@ -2253,6 +2280,17 @@ simplImplOut (SImpl_ElimLLVMBlockNamed x bp nmsh) = , Just sh' <- unfoldModalizeNamedShape rw l nmsh args -> distPerms1 x (ValPerm_LLVMBlock $ bp { llvmBlockShape = sh' }) _ -> error "simplImplOut: SImpl_ElimLLVMBlockNamed: unexpected block shape" +simplImplOut (SImpl_IntroLLVMBlockNamedMods x bp) = + distPerms1 x $ ValPerm_LLVMBlock bp +simplImplOut (SImpl_ElimLLVMBlockNamedMods x bp) = + case llvmBlockShape bp of + PExpr_NamedShape maybe_rw maybe_l nmsh args + | rw <- fromMaybe (llvmBlockRW bp) maybe_rw + , l <- fromMaybe (llvmBlockLifetime bp) maybe_l -> + distPerms1 x $ ValPerm_LLVMBlock $ + bp { llvmBlockRW = rw, llvmBlockLifetime = l, + llvmBlockShape = PExpr_NamedShape Nothing Nothing nmsh args } + _ -> error "simplImplOut: SImpl_ElimLLVMBlockNamedMods: malformed input permission" simplImplOut (SImpl_IntroLLVMBlockFromEq x bp _) = distPerms1 x (ValPerm_Conj1 $ Perm_LLVMBlock bp) simplImplOut (SImpl_IntroLLVMBlockPtr x bp) = @@ -2774,6 +2812,10 @@ instance SubstVar PermVarSubst m => [nuMP| SImpl_ElimLLVMBlockNamed x bp nmsh |] -> SImpl_ElimLLVMBlockNamed <$> genSubst s x <*> genSubst s bp <*> genSubst s nmsh + [nuMP| SImpl_IntroLLVMBlockNamedMods x bp |] -> + SImpl_IntroLLVMBlockNamedMods <$> genSubst s x <*> genSubst s bp + [nuMP| SImpl_ElimLLVMBlockNamedMods x bp |] -> + SImpl_ElimLLVMBlockNamedMods <$> genSubst s x <*> genSubst s bp [nuMP| SImpl_IntroLLVMBlockFromEq x bp y |] -> SImpl_IntroLLVMBlockFromEq <$> genSubst s x <*> genSubst s bp <*> genSubst s y @@ -4668,6 +4710,12 @@ implElimLLVMBlock x bp implSimplM Proxy (SImpl_IntroLLVMBlockSeqEmpty x bp) >>> implSimplM Proxy (SImpl_ElimLLVMBlockSeq x bp PExpr_EmptyShape) +-- Eliminate modalities on named shapes +implElimLLVMBlock x bp@(LLVMBlockPerm { llvmBlockShape = + PExpr_NamedShape rw l _ _ }) + | isJust rw || isJust l + = implSimplM Proxy (SImpl_ElimLLVMBlockNamedMods x bp) + -- Unfold defined or recursive named shapes implElimLLVMBlock x bp@(LLVMBlockPerm { llvmBlockShape = PExpr_NamedShape rw l nmsh args }) @@ -6448,8 +6496,8 @@ proveVarLLVMBlocks1 x ps psubst (mb_bp:mb_bps) -- If the offset and length of the top block matches one that we already have on --- the left, but the left-hand permission has a defined shape, unfold the --- defined shape +-- the left, but the left-hand permission has either a defined shape or a named +-- shape with modalities, eliminate the left-hand block. proveVarLLVMBlocks1 x ps psubst mb_bps_in@(mb_bp:_) | Just off <- partialSubst psubst $ mbLLVMBlockOffset mb_bp , Just len <- partialSubst psubst $ mbLLVMBlockLen mb_bp @@ -6460,6 +6508,12 @@ proveVarLLVMBlocks1 x ps psubst mb_bps_in@(mb_bp:_) , DefinedShapeBody _ <- namedShapeBody nmsh -> bvEq (llvmBlockOffset bp) off && bvEq (llvmBlockLen bp) len + + | PExpr_NamedShape maybe_rw maybe_l _ _ <- llvmBlockShape bp + , isJust maybe_rw || isJust maybe_l -> + bvEq (llvmBlockOffset bp) off && + bvEq (llvmBlockLen bp) len + _ -> False) ps = implElimAppendIthLLVMBlock x ps i >>>= \ps' -> proveVarLLVMBlocks x ps' psubst mb_bps_in @@ -6631,6 +6685,39 @@ proveVarLLVMBlocks2 x ps psubst mb_bp _ mb_bps implSwapInsertConjM x (Perm_LLVMBlock bp_out) ps'' 0 +-- For a named shape with modalities, prove it without the modalities first and +-- then add the modalities +proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps + | [nuMP| PExpr_NamedShape mb_maybe_rw mb_maybe_l _ _ |] <- mb_sh + , isJust (mbMaybe mb_maybe_rw) || isJust (mbMaybe mb_maybe_l) = + + -- Recurse using the shape without the modalities + let mb_bp' = + flip mbMapCl mb_bp + $(mkClosed + [| \bp -> case llvmBlockShape bp of + PExpr_NamedShape maybe_rw maybe_l nmsh args + | rw <- fromMaybe (llvmBlockRW bp) maybe_rw + , l <- fromMaybe (llvmBlockLifetime bp) maybe_l -> + bp { llvmBlockRW = rw, llvmBlockLifetime = l, + llvmBlockShape = + PExpr_NamedShape Nothing Nothing nmsh args } + _ -> error "Unreachable!" |]) in + proveVarLLVMBlocks x ps psubst (mb_bp' : mb_bps) >>> + + -- Extract out the block perm we proved + getTopDistPerm x >>>= \(ValPerm_Conj ps_out) -> + let (_ : ps_out') = ps_out in + implSplitSwapConjsM x ps_out 1 >>> + + -- Introduce the modalities + partialSubstForceM mb_bp "proveVarLLVMBlocks" >>>= \bp -> + implSimplM Proxy (SImpl_IntroLLVMBlockNamedMods x bp) >>> + + -- Finally, recombine the resulting permission with the rest of them + implSwapInsertConjM x (Perm_LLVMBlock bp) ps_out' 0 + + -- For an unfoldable named shape, prove its unfolding first and then fold it proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps | [nuMP| PExpr_NamedShape _ _ mb_nmsh _ |] <- mb_sh diff --git a/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs b/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs index 97649a489a..f9d8f40f01 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs @@ -3065,6 +3065,20 @@ translateSimplImpl (ps0 :: Proxy ps0) mb_simpl m = case mbMatch mb_simpl of | otherwise -> fail "translateSimplImpl: ElimLLVMBlockNamed, unknown named shape" + [nuMP| SImpl_IntroLLVMBlockNamedMods _ _ |] -> + do ttrans <- translateSimplImplOutHead mb_simpl + withPermStackM id + (\(pctx :>: ptrans) -> + pctx :>: typeTransF ttrans (transTerms ptrans)) + m + + [nuMP| SImpl_ElimLLVMBlockNamedMods _ _ |] -> + do ttrans <- translateSimplImplOutHead mb_simpl + withPermStackM id + (\(pctx :>: ptrans) -> + pctx :>: typeTransF ttrans (transTerms ptrans)) + m + [nuMP| SImpl_IntroLLVMBlockFromEq _ _ _ |] -> do ttrans <- translateSimplImplOutHead mb_simpl withPermStackM RL.tail From 7c2e43d59086a81c5bc3b0d46a911f5dd6ce67d9 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Wed, 5 Jan 2022 12:51:26 -0800 Subject: [PATCH 04/27] added a case to eliminate equality shapes on the left when trying to prove a recursive shape on the right --- .../src/Verifier/SAW/Heapster/Implication.hs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs index fa97a1dafb..ae3db00589 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs @@ -6718,6 +6718,28 @@ proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps implSwapInsertConjM x (Perm_LLVMBlock bp) ps_out' 0 +-- For a recursive named shape with an equality permission on the left that has +-- the same offset and length, eliminate the equality permission, because it +-- might expose an occurrence of the same recursive named shape on the left, and +-- because eliminating it is necessary anyway (unless the recursive permission +-- on the right unfolds to an equality shape, which should never be the case in +-- practice) +proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps + | [nuMP| PExpr_NamedShape _ _ mb_nmsh _ |] <- mb_sh + , mbNamedShapeIsRecursive mb_nmsh + , Just off <- partialSubst psubst $ mbLLVMBlockOffset mb_bp + , Just len <- partialSubst psubst $ mbLLVMBlockLen mb_bp + , Just i <- findIndex + (\case + Perm_LLVMBlock bp + | PExpr_EqShape _ _ <- llvmBlockShape bp -> + bvEq (llvmBlockOffset bp) off && + bvEq (llvmBlockLen bp) len + _ -> False) ps = + implElimAppendIthLLVMBlock x ps i >>>= \ps' -> + proveVarLLVMBlocks x ps' psubst (mb_bp:mb_bps) + + -- For an unfoldable named shape, prove its unfolding first and then fold it proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps | [nuMP| PExpr_NamedShape _ _ mb_nmsh _ |] <- mb_sh From 45f394e6ad331e349c577279077781908a4de205 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Wed, 5 Jan 2022 12:55:31 -0800 Subject: [PATCH 05/27] updated examples to use the new form of the equality shape --- heapster-saw/examples/memcpy.saw | 4 ++-- heapster-saw/examples/rust_data.saw | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/heapster-saw/examples/memcpy.saw b/heapster-saw/examples/memcpy.saw index f2b9a22f62..92196ff710 100644 --- a/heapster-saw/examples/memcpy.saw +++ b/heapster-saw/examples/memcpy.saw @@ -7,9 +7,9 @@ heapster_define_perm env "int64" " " "llvmptr 64" "exists x:bv 64.eq(llvmword(x) heapster_assume_fun env "llvm.memcpy.p0i8.p0i8.i64" "(rw:rwmodality, l1:lifetime, l2:lifetime, sh:llvmshape 64, \ \ b:llvmblock 64, len:bv 64). \ - \ arg0:[l1]memblock(W,0,len,sh), arg1:[l2]memblock(rw,0,len,eqsh(b)), \ + \ arg0:[l1]memblock(W,0,len,sh), arg1:[l2]memblock(rw,0,len,eqsh(len,b)), \ \ arg2:eq(llvmword(len)) -o \ - \ arg0:[l1]memblock(W,0,len,eqsh(b)), arg1:[l2]memblock(rw,0,len,eqsh(b))" + \ arg0:[l1]memblock(W,0,len,eqsh(len,b)), arg1:[l2]memblock(rw,0,len,eqsh(len,b))" "\\ (X:sort 0) (len:Vec 64 Bool) (x:X) (_:#()) -> returnM (#() * #()) ((),())"; diff --git a/heapster-saw/examples/rust_data.saw b/heapster-saw/examples/rust_data.saw index 5f8e1c0a17..69555b9df9 100644 --- a/heapster-saw/examples/rust_data.saw +++ b/heapster-saw/examples/rust_data.saw @@ -240,9 +240,9 @@ heapster_assume_fun env "llvm.expect.i1" heapster_assume_fun env "llvm.memcpy.p0i8.p0i8.i64" "(rw:rwmodality, l1:lifetime, l2:lifetime, sh:llvmshape 64, \ \ b:llvmblock 64, len:bv 64). \ - \ arg0:[l1]memblock(W,0,len,sh), arg1:[l2]memblock(rw,0,len,eqsh(b)), \ + \ arg0:[l1]memblock(W,0,len,sh), arg1:[l2]memblock(rw,0,len,eqsh(len,b)), \ \ arg2:eq(llvmword(len)) -o \ - \ arg0:[l1]memblock(W,0,len,eqsh(b)), arg1:[l2]memblock(rw,0,len,eqsh(b))" + \ arg0:[l1]memblock(W,0,len,eqsh(len,b)), arg1:[l2]memblock(rw,0,len,eqsh(len,b))" "\\ (X:sort 0) (len:Vec 64 Bool) (x:X) (_:#()) -> returnM (#() * #()) ((),())"; // ::to_string From 4113d78a75a3360661c72d82dc31a2d1c2a1799d Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Wed, 5 Jan 2022 13:58:18 -0800 Subject: [PATCH 06/27] changed load instructions to always load whole multiples of bytes at a time; added a FIXME for only storing whole multiples of bytes --- .../Verifier/SAW/Heapster/TypedCrucible.hs | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs b/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs index d472a2fee0..0d839c1e8e 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs @@ -3282,17 +3282,18 @@ tcEmitLLVMStmt :: StmtPermCheckM LLVM cblocks blocks tops rets RNil RNil (CtxTrans (ctx ::> tp)) --- Type-check a word-sized load of an LLVM pointer by requiring a standard ptr --- permission and using TypedLLVMLoad +-- Type-check a load of an LLVM pointer by requiring a ptr permission and using +-- TypedLLVMLoad, rounding up the size of the load to a whole number of bytes tcEmitLLVMStmt arch ctx loc (LLVM_Load _ ptr tp storage _) - | Just (Some (sz :: NatRepr sz)) <- someNat $ bytesToBits $ storageTypeSize storage - , Left LeqProof <- decideLeq (knownNat @1) sz - = withKnownNat ?ptrWidth $ - withKnownNat sz $ + | sz_bits <- bytesToBits $ storageTypeSize storage + , sz_rnd_bits <- 8 * ceil_div sz_bits 8 + , Just (Some (sz_rnd :: NatRepr sz_rnd)) <- someNat sz_rnd_bits + , Left LeqProof <- decideLeq (knownNat @1) sz_rnd + = withKnownNat ?ptrWidth $ withKnownNat sz_rnd $ let tptr = tcReg ctx ptr in - -- Prove [l]ptr((0,rw) |-> eq(y)) for some l, rw, and y - stmtProvePerm tptr (llvmPtr0EqExPerm sz) >>>= \impl_res -> - let fp = subst impl_res (llvmPtr0EqEx sz) in + -- Prove [l]ptr((sz_rnd,0,rw) |-> eq(y)) for some l, rw, and y + stmtProvePerm tptr (llvmPtr0EqExPerm sz_rnd) >>>= \impl_res -> + let fp = subst impl_res (llvmPtr0EqEx sz_rnd) in -- Emit a TypedLLVMLoad instruction emitTypedLLVMLoad arch loc tptr fp DistPermsNil >>>= \z -> -- Recombine the resulting permissions onto the stack @@ -3301,6 +3302,8 @@ tcEmitLLVMStmt arch ctx loc (LLVM_Load _ ptr tp storage _) (convertRegType knownRepr loc (TypedReg z) knownRepr tp >>>= \ret -> pure (addCtxName ctx $ typedRegVar ret)) +-- FIXME: add a case for stores of smaller-than-byte-sized values + -- Type-check a store of an LLVM pointer tcEmitLLVMStmt arch ctx loc (LLVM_Store _ ptr tp storage _ val) | Just (Some sz) <- someNat $ bytesToBits $ storageTypeSize storage From 49e559653045b61f1cd3184e231e679bc010ff41 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Wed, 5 Jan 2022 14:07:23 -0800 Subject: [PATCH 07/27] added a comment about how to better support sub-byte-sized fields in RustTypes --- heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs index 71c6fedef2..8cac653fe8 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs @@ -607,6 +607,12 @@ instance RsConvert w (StructField Span) (PermExpr (LLVMShapeType w)) where -- * Computing the ABI-Specific Layout of Rust Types ---------------------------------------------------------------------- +-- FIXME: add support for shapes like bool whose size is smaller than a byte, +-- with the constraint that the end result should only have fields whose sizes +-- are whole numbers of bytes. The idea would be to allow sub-byte-sized fields +-- be appended, but to then round their sizes up to whole numbers of bytes at +-- disjunctions and at the top level. + -- | An 'ArgLayoutPerm' is a set of permissions on a sequence of 0 or more -- arguments, given by the @tps@ type-level argument. These permissions are -- similar to the language of permissions on a Crucible struct, except that the From 95a2ffd41fd39ac9dbd2c272acfd80ba6098f369 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Thu, 6 Jan 2022 12:53:07 -0800 Subject: [PATCH 08/27] added a new lborrowed permission that combines a simplified version of the lowned permission with the actual permissions that are borrowed --- .../Verifier/SAW/Heapster/IRTTranslation.hs | 5 ++ .../src/Verifier/SAW/Heapster/Implication.hs | 68 +++++++++++++++++-- .../src/Verifier/SAW/Heapster/Permissions.hs | 48 +++++++++++++ .../src/Verifier/SAW/Heapster/RustTypes.hs | 34 ++++++---- .../Verifier/SAW/Heapster/SAWTranslation.hs | 44 ++++++++++++ 5 files changed, 180 insertions(+), 19 deletions(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/IRTTranslation.hs b/heapster-saw/src/Verifier/SAW/Heapster/IRTTranslation.hs index d440ac4a2f..dc94a42a0e 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/IRTTranslation.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/IRTTranslation.hs @@ -155,6 +155,7 @@ instance ContainsIRTRecName (AtomicPerm a) where containsIRTRecName n (Perm_LLVMFrame fperm) = containsIRTRecName n (map fst fperm) containsIRTRecName _ (Perm_LOwned _ _ _) = False + containsIRTRecName _ (Perm_LBorrowed _) = False containsIRTRecName _ (Perm_LCurrent _) = False containsIRTRecName _ Perm_LFinished = False containsIRTRecName n (Perm_Struct ps) = containsIRTRecName n ps @@ -415,6 +416,8 @@ instance IRTTyVars (AtomicPerm a) where [nuMP| Perm_LLVMFrame _ |] -> return ([], IRTVarsNil) [nuMP| Perm_LOwned _ _ _ |] -> throwError "lowned permission in an IRT definition!" + [nuMP| Perm_LBorrowed _ |] -> + throwError "lborrowed permission in an IRT definition!" [nuMP| Perm_LCurrent _ |] -> return ([], IRTVarsNil) [nuMP| Perm_LFinished |] -> return ([], IRTVarsNil) [nuMP| Perm_Struct ps |] -> irtTyVars ps @@ -663,6 +666,8 @@ instance IRTDescs (AtomicPerm a) where ([nuMP| Perm_LLVMFrame _ |], _) -> return [] ([nuMP| Perm_LOwned _ _ _ |], _) -> error "lowned permission made it to IRTDesc translation" + ([nuMP| Perm_LBorrowed _ |], _) -> + error "lborrowed permission made it to IRTDesc translation" ([nuMP| Perm_LCurrent _ |], _) -> return [] ([nuMP| Perm_LFinished |], _) -> return [] ([nuMP| Perm_Struct ps |], _) -> diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs index ae3db00589..c2eaf555c6 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs @@ -924,6 +924,20 @@ data SimplImpl ps_in ps_out where SimplImpl (ps_in :> LifetimeType) (ps_out :> LifetimeType) + -- | Prove an @lborrowed(ps)@ permission from permissions @ps@ and an empty + -- @lowned@ permission: + -- + -- > ps * l:lowned (empty -o empty) -o l:lborrowed(ps) + SImpl_IntroLBorrowed :: ExprVar LifetimeType -> LOwnedPerms ps -> + SimplImpl (ps :> LifetimeType) (RNil :> LifetimeType) + + -- | Eliminate an @l:lborrowed(ps)@ permission into the modalized version + -- @[l]ps@ of @ps@ plus the corresponding @lowned@ permission: + -- + -- > l:lborrowed(ps) -o [l]ps * l:lowned ([l](R)ps -o ps) + SImpl_ElimLBorrowed :: ExprVar LifetimeType -> LOwnedPerms ps -> + SimplImpl (RNil :> LifetimeType) (ps :> LifetimeType) + -- | Reflexivity for @lcurrent@ proofs: -- -- > . -o l:lcurrent(l) @@ -1904,6 +1918,13 @@ simplImplIn (SImpl_EndLifetime l ps_in ps_out) = DistPermsCons perms_in l $ ValPerm_LOwned [] ps_in ps_out Nothing -> error "simplImplIn: SImpl_EndLifetime: non-variables in input permissions" +simplImplIn (SImpl_IntroLBorrowed l lops) = + case lownedPermsToDistPerms lops of + Just dps -> DistPermsCons dps l (ValPerm_LOwned [] MNil MNil) + Nothing -> + error "simplImplIn: SImpl_IntroLBorrowed: malformed permissions list" +simplImplIn (SImpl_ElimLBorrowed l lops) = + distPerms1 l (ValPerm_LBorrowed lops) simplImplIn (SImpl_LCurrentRefl _) = DistPermsNil simplImplIn (SImpl_LCurrentTrans l1 l2 l3) = distPerms2 l1 (ValPerm_LCurrent $ PExpr_Var l2) l2 (ValPerm_LCurrent l3) @@ -2240,6 +2261,15 @@ simplImplOut (SImpl_EndLifetime l _ ps_out) = Just perms_out -> DistPermsCons perms_out l ValPerm_LFinished _ -> error "simplImplOut: SImpl_EndLifetime: non-variable in output permissions" +simplImplOut (SImpl_IntroLBorrowed l lops) = + distPerms1 l (ValPerm_LBorrowed lops) +simplImplOut (SImpl_ElimLBorrowed l lops) = + case lownedPermsToDistPerms lops of + Just dps -> + DistPermsCons dps l (ValPerm_LOwned + [] (lownedPermsInForBorrow (PExpr_Var l) lops) lops) + Nothing -> + error "simplImplOut: SImpl_ElimLOwned: malformed permissions list" simplImplOut (SImpl_LCurrentRefl l) = distPerms1 l (ValPerm_LCurrent $ PExpr_Var l) simplImplOut (SImpl_LCurrentTrans l1 _ l3) = @@ -2377,6 +2407,10 @@ simplImplOut (SImpl_NamedArgRead x npn args off memb) = simplImplOut (SImpl_ReachabilityTrans x rp args off _ e) = distPerms1 x (ValPerm_Named (recPermName rp) (PExprs_Cons args e) off) +-- | Compute the input permissions of a 'SimplImpl' implication in a binding +mbSimplImplIn :: Mb ctx (SimplImpl ps_in ps_out) -> Mb ctx (DistPerms ps_in) +mbSimplImplIn = mbMapCl $(mkClosed [| simplImplIn |]) + -- | Compute the output permissions of a 'SimplImpl' implication in a binding mbSimplImplOut :: Mb ctx (SimplImpl ps_in ps_out) -> Mb ctx (DistPerms ps_out) mbSimplImplOut = mbMapCl $(mkClosed [| simplImplOut |]) @@ -2787,6 +2821,10 @@ instance SubstVar PermVarSubst m => [nuMP| SImpl_EndLifetime l ps_in ps_out |] -> SImpl_EndLifetime <$> genSubst s l <*> genSubst s ps_in <*> genSubst s ps_out + [nuMP| SImpl_IntroLBorrowed l lops |] -> + SImpl_IntroLBorrowed <$> genSubst s l <*> genSubst s lops + [nuMP| SImpl_ElimLBorrowed l lops |] -> + SImpl_ElimLBorrowed <$> genSubst s l <*> genSubst s lops [nuMP| SImpl_LCurrentRefl l |] -> SImpl_LCurrentRefl <$> genSubst s l [nuMP| SImpl_LCurrentTrans l1 l2 l3 |] -> @@ -5188,6 +5226,15 @@ recombinePermConj x _ (Perm_LLVMBlock bp) | PExpr_FalseShape <- llvmBlockShape bp = implElimLLVMBlock x bp >>> implElimFalseM x +-- If p is an lborrowed permission, eliminate it +recombinePermConj x x_ps (Perm_LBorrowed lops) + | Just dps <- lownedPermsToDistPerms lops = + let prx = Proxy in + implSimplM prx (SImpl_ElimLBorrowed x lops) >>> + recombinePermConj x x_ps + (Perm_LOwned [] (lownedPermsInForBorrow (PExpr_Var x) lops) lops) >>> + recombinePermsPartial prx dps + -- Default case: insert p at the end of the x_ps recombinePermConj x x_ps p = implPushM x (ValPerm_Conj x_ps) >>> @@ -7451,6 +7498,16 @@ proveVarAtomicImpl x ps mb_p = case mbMatch mb_p of implSimplM Proxy (SImpl_MapLifetime x [] ps_inL ps_outL ps_inR ps_outR ps1 ps2 impl_in impl_out) + [nuMP| Perm_LBorrowed mb_lops |] + | Just mb_dps <- mbMaybe (mbMapCl + $(mkClosed [| lownedPermsToDistPerms |]) mb_lops) -> + implPopM x (ValPerm_Conj ps) >>> + proveVarsImplAppendInt mb_dps >>> + partialSubstForceM mb_lops "proveVarAtomicImpl" >>>= \lops -> + mbVarsM (distPerms1 x $ ValPerm_LOwned [] MNil MNil) >>>= \mb_p' -> + proveVarsImplAppendInt mb_p' >>> + implSimplM Proxy (SImpl_IntroLBorrowed x lops) + [nuMP| Perm_LCurrent mb_l' |] -> partialSubstForceM mb_l' "proveVarAtomicImpl" >>>= \l' -> case ps of @@ -8017,8 +8074,9 @@ findProvablePerm unsetVars ps = case ps of (best_rank, extDistPermsSplit best x p) --- | Find all existential lifetime variables with @lowned@ permissions in an --- 'ExDistPerms' list, and instantiate them with fresh lifetimes +-- | Find all existential lifetime variables with @lowned@ or @lborrowed@ +-- permissions in an 'ExDistPerms' list, and instantiate them with fresh +-- lifetimes instantiateLifetimeVars :: NuMatchingAny1 r => ExDistPerms vars ps -> ImplM vars s r ps_in ps_in () instantiateLifetimeVars mb_ps = @@ -8030,8 +8088,10 @@ instantiateLifetimeVars' :: NuMatchingAny1 r => PartialSubst vars -> ExDistPerms vars ps -> ImplM vars s r ps_in ps_in () instantiateLifetimeVars' psubst mb_ps = case mbMatch mb_ps of [nuMP| DistPermsNil |] -> pure () - [nuMP| DistPermsCons mb_ps' mb_x (ValPerm_LOwned _ _ _) |] - | Left memb <- mbNameBoundP mb_x + [nuMP| DistPermsCons mb_ps' mb_x (ValPerm_Conj1 mb_p) |] + | [nuP| Just Refl |] <- mbMapCl $(mkClosed + [| isLifetimeOwnershipPerm |]) mb_p + , Left memb <- mbNameBoundP mb_x , Nothing <- psubstLookup psubst memb -> implBeginLifetimeM >>>= \l -> setVarM memb (PExpr_Var l) >>> diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs b/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs index 1ce3889e90..d86c3e87f8 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs @@ -1655,6 +1655,13 @@ data AtomicPerm (a :: CrucibleType) where LOwnedPerms ps_in -> LOwnedPerms ps_out -> AtomicPerm LifetimeType + -- | A lifetime borrow permission @l:lborrowed(ps)@ describes a set of + -- permissions @ps@ that have been borrowed by lifetime @l@. It is logically + -- equivalent to @ps * l:lowned ([l](R)ps -o ps)@, where @[l](R)ps@ represents + -- the minimal possible versions of @ps@ in lifetime @l@ that could be given + -- back when @l@ is ended. + Perm_LBorrowed :: LOwnedPerms ps -> AtomicPerm LifetimeType + -- | Assertion that a lifetime is current during another lifetime Perm_LCurrent :: PermExpr LifetimeType -> AtomicPerm LifetimeType @@ -1796,6 +1803,13 @@ pattern ValPerm_LLVMBlockShape sh <- ValPerm_Conj [Perm_LLVMBlockShape sh] ValPerm_LLVMBlockShape sh = ValPerm_Conj [Perm_LLVMBlockShape sh] -- | A single @lowned@ permission +pattern ValPerm_LBorrowed :: () => (a ~ LifetimeType) => + LOwnedPerms ps -> ValuePerm a +pattern ValPerm_LBorrowed ps <- ValPerm_Conj [Perm_LBorrowed ps] + where + ValPerm_LBorrowed ps = ValPerm_Conj [Perm_LBorrowed ps] + +-- | A single @lborrow@ permission pattern ValPerm_LOwned :: () => (a ~ LifetimeType) => [PermExpr LifetimeType] -> LOwnedPerms ps_in -> LOwnedPerms ps_out -> ValuePerm a pattern ValPerm_LOwned ls ps_in ps_out <- ValPerm_Conj [Perm_LOwned @@ -2982,6 +2996,9 @@ instance Eq (AtomicPerm a) where , Just Refl <- testEquality ps_out1 ps_out2 = ls1 == ls2 (Perm_LOwned _ _ _) == _ = False + (Perm_LBorrowed lops1) == (Perm_LBorrowed lops2) + | Just Refl <- testEquality lops1 lops2 = True + (Perm_LBorrowed _) == _ = False (Perm_LCurrent e1) == (Perm_LCurrent e2) = e1 == e2 (Perm_LCurrent _) == _ = False Perm_LFinished == Perm_LFinished = True @@ -3148,6 +3165,8 @@ instance PermPretty (AtomicPerm a) where _ -> ppEncList False <$> mapM permPrettyM ls return (pretty "lowned" <> ls_pp <+> parens (align $ sep [pp_in, pretty "-o", pp_out])) + permPrettyM (Perm_LBorrowed lops) = + (pretty "lborrowed" <>) <$> parens <$> permPrettyM lops permPrettyM (Perm_LCurrent l) = (pretty "lcurrent" <+>) <$> permPrettyM l permPrettyM Perm_LFinished = return (pretty "lfinished") permPrettyM (Perm_Struct ps) = @@ -3326,10 +3345,17 @@ isLLVMBlockPerm _ = False -- | Test if an 'AtomicPerm' is a lifetime permission isLifetimePerm :: AtomicPerm a -> Maybe (a :~: LifetimeType) isLifetimePerm (Perm_LOwned _ _ _) = Just Refl +isLifetimePerm (Perm_LBorrowed _) = Just Refl isLifetimePerm (Perm_LCurrent _) = Just Refl isLifetimePerm Perm_LFinished = Just Refl isLifetimePerm _ = Nothing +-- | Test if an 'AtomicPerm' is a lifetime permission that gives ownership +isLifetimeOwnershipPerm :: AtomicPerm a -> Maybe (a :~: LifetimeType) +isLifetimeOwnershipPerm (Perm_LOwned _ _ _) = Just Refl +isLifetimeOwnershipPerm (Perm_LBorrowed _) = Just Refl +isLifetimeOwnershipPerm _ = Nothing + -- | Test if an 'AtomicPerm' is a struct permission isStructPerm :: AtomicPerm a -> Bool isStructPerm (Perm_Struct _) = True @@ -5112,6 +5138,7 @@ atomicPermIsCopyable Perm_IsLLVMPtr = True atomicPermIsCopyable (Perm_LLVMBlockShape sh) = shapeIsCopyable PExpr_Write sh atomicPermIsCopyable (Perm_LLVMFrame _) = False atomicPermIsCopyable (Perm_LOwned _ _ _) = False +atomicPermIsCopyable (Perm_LBorrowed _) = False atomicPermIsCopyable (Perm_LCurrent _) = True atomicPermIsCopyable Perm_LFinished = True atomicPermIsCopyable (Perm_Struct ps) = and $ RL.mapToList permIsCopyable ps @@ -5175,6 +5202,18 @@ lownedPermsToDistPerms MNil = Just MNil lownedPermsToDistPerms (lops :>: lop) = (:>:) <$> lownedPermsToDistPerms lops <*> lownedPermVarAndPerm lop +-- | Convert an 'LOwnedPerms' list @ps@ to the input permission list @[l](R)ps@ +-- used in converting an @lborrowed@ permission to an @lowned@ permission +lownedPermsInForBorrow :: PermExpr LifetimeType -> LOwnedPerms ps -> + LOwnedPerms ps +lownedPermsInForBorrow l = RL.map $ \case + LOwnedPermField x fp -> + LOwnedPermField x $ fp { llvmFieldRW = PExpr_Read, llvmFieldLifetime = l } + LOwnedPermArray x ap -> + LOwnedPermArray x $ ap { llvmArrayRW = PExpr_Read, llvmArrayLifetime = l } + LOwnedPermBlock x bp -> + LOwnedPermBlock x $ bp { llvmBlockRW = PExpr_Read, llvmBlockLifetime = l } + -- | Convert the expressions of an 'LOwnedPerms' to variables, if possible lownedPermsVars :: LOwnedPerms ps -> Maybe (RAssign Name ps) lownedPermsVars = fmap distPermsVars . lownedPermsToDistPerms @@ -5371,6 +5410,7 @@ instance FreeVars (AtomicPerm tp) where freeVars (Perm_LLVMFrame fperms) = freeVars $ map fst fperms freeVars (Perm_LOwned ls ps_in ps_out) = NameSet.unions [freeVars ls, freeVars ps_in, freeVars ps_out] + freeVars (Perm_LBorrowed lops) = freeVars lops freeVars (Perm_LCurrent l) = freeVars l freeVars Perm_LFinished = NameSet.empty freeVars (Perm_Struct ps) = NameSet.unions $ RL.mapToList freeVars ps @@ -5501,6 +5541,7 @@ instance NeededVars (AtomicPerm a) where neededVars (Perm_LLVMBlock bp) = neededVars bp neededVars (Perm_LLVMBlockShape _) = NameSet.empty neededVars p@(Perm_LOwned _ _ _) = freeVars p + neededVars (Perm_LBorrowed lops) = neededVars $ RL.map lownedPermPerm lops neededVars p = freeVars p instance NeededVars (LLVMFieldPerm w sz) where @@ -5775,6 +5816,7 @@ instance SubstVar s m => Substable s (AtomicPerm a) m where [nuMP| Perm_LLVMFrame fp |] -> Perm_LLVMFrame <$> genSubst s fp [nuMP| Perm_LOwned ls ps_in ps_out |] -> Perm_LOwned <$> genSubst s ls <*> genSubst s ps_in <*> genSubst s ps_out + [nuMP| Perm_LBorrowed lops |] -> Perm_LBorrowed <$> genSubst s lops [nuMP| Perm_LCurrent e |] -> Perm_LCurrent <$> genSubst s e [nuMP| Perm_LFinished |] -> return Perm_LFinished [nuMP| Perm_Struct tps |] -> Perm_Struct <$> genSubst s tps @@ -6574,6 +6616,9 @@ instance AbstractVars (AtomicPerm a) where `clMbMbApplyM` abstractPEVars ns1 ns2 ls `clMbMbApplyM` abstractPEVars ns1 ns2 ps_in `clMbMbApplyM` abstractPEVars ns1 ns2 ps_out + abstractPEVars ns1 ns2 (Perm_LBorrowed lops) = + absVarsReturnH ns1 ns2 $(mkClosed [| Perm_LBorrowed |]) + `clMbMbApplyM` abstractPEVars ns1 ns2 lops abstractPEVars ns1 ns2 (Perm_LCurrent e) = absVarsReturnH ns1 ns2 $(mkClosed [| Perm_LCurrent |]) `clMbMbApplyM` abstractPEVars ns1 ns2 e @@ -6886,6 +6931,7 @@ instance AbstractNamedShape w (AtomicPerm a) where abstractNSM (Perm_LOwned ls ps_in ps_out) = mbMap3 Perm_LOwned <$> abstractNSM ls <*> abstractNSM ps_in <*> abstractNSM ps_out + abstractNSM (Perm_LBorrowed lops) = fmap Perm_LBorrowed <$> abstractNSM lops abstractNSM (Perm_LCurrent e) = fmap Perm_LCurrent <$> abstractNSM e abstractNSM Perm_LFinished = pureBindingM Perm_LFinished abstractNSM (Perm_Struct ps) = fmap Perm_Struct <$> abstractNSM ps @@ -7523,6 +7569,8 @@ instance GetDetVarsClauses (AtomicPerm a) where getDetVarsClauses (Perm_LLVMFrame frame_perm) = concat <$> mapM (getDetVarsClauses . fst) frame_perm getDetVarsClauses (Perm_LOwned _ _ _) = return [] + getDetVarsClauses (Perm_LBorrowed lops) = + getDetVarsClauses $ RL.map lownedPermPerm lops getDetVarsClauses _ = return [] instance (1 <= w, KnownNat w, 1 <= sz, KnownNat sz) => diff --git a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs index 8cac653fe8..e713d73166 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs @@ -1097,22 +1097,26 @@ abstractMbLOPsModalities mb_lops = case mbMatch mb_lops of -- | Find all field or block permissions containing lifetime @l@ and return them --- as an 'LOwnedPerms' list +-- as an 'LOwnedPerms' list, also returning the result of removing these +-- permissions from the input permissions lownedPermsForLifetime :: ExprVar LifetimeType -> DistPerms ctx -> - RustConvM (Some LOwnedPerms) -lownedPermsForLifetime _ MNil = return (Some MNil) + RustConvM (Some LOwnedPerms, DistPerms ctx) +lownedPermsForLifetime _ MNil = return (Some MNil, MNil) lownedPermsForLifetime l (perms :>: VarAndPerm x (ValPerm_LLVMField fp)) | NameSet.member l (freeVars fp) = - do Some lops <- lownedPermsForLifetime l perms - return $ Some $ (lops :>: LOwnedPermField (PExpr_Var x) fp) + do (Some lops, perms') <- lownedPermsForLifetime l perms + return (Some (lops :>: LOwnedPermField (PExpr_Var x) fp), + perms' :>: VarAndPerm x ValPerm_True) lownedPermsForLifetime l (perms :>: VarAndPerm x (ValPerm_LLVMBlock bp)) | NameSet.member l (freeVars bp) = - do Some lops <- lownedPermsForLifetime l perms - return $ Some $ (lops :>: LOwnedPermBlock (PExpr_Var x) bp) + do (Some lops, perms') <- lownedPermsForLifetime l perms + return (Some (lops :>: LOwnedPermBlock (PExpr_Var x) bp), + perms' :>: VarAndPerm x ValPerm_True) lownedPermsForLifetime l (perms :>: VarAndPerm x p) | Nothing <- testEquality x l - , not (NameSet.member l $ freeVars p) - = lownedPermsForLifetime l perms + , not (NameSet.member l $ freeVars p) = + lownedPermsForLifetime l perms >>= \(some_lops, perms') -> + return (some_lops, perms' :>: VarAndPerm x p) lownedPermsForLifetime l (_ :>: vap) = rsPPInfo >>= \ppInfo -> fail $ renderDoc $ fillSep @@ -1162,9 +1166,9 @@ mbLifetimeFunPerm (LifetimeDef _ _ [] _) let mb_l_out = extMbMulti rets_prxs $ extMbMulti args_prxs $ extMbMulti ghosts_prxs $ nu id - [nuMP| Some mb_lops_in |] <- + [nuMP| (Some mb_lops_in, mb_ps_in_rem) |] <- mbMatchM $ mbMap2 lownedPermsForLifetime mb_l mb_ps_in - [nuMP| Some mb_lops_out |] <- + [nuMP| (Some mb_lops_out, _) |] <- mbMatchM $ mbMap2 lownedPermsForLifetime mb_l_out mb_ps_out case abstractMbLOPsModalities mb_lops_in of SomeTypedMb ghosts' mb_mb_lops_in_abs -> @@ -1173,10 +1177,10 @@ mbLifetimeFunPerm (LifetimeDef _ _ [] _) Some3FunPerm $ FunPerm (appendCruCtx (singletonCruCtx LifetimeRepr) ghosts) args gouts ret - (mbMap3 (\ps_in lops_in lops_in_abs -> - assocAppend (MNil :>: ValPerm_LOwned [] lops_in lops_in_abs) - ghosts args_prxs $ distPermsToValuePerms ps_in) - mb_ps_in mb_lops_in mb_lops_in_abs) + (mbMap2 (\ps_in_rem lops_in_abs -> + assocAppend (MNil :>: ValPerm_LBorrowed lops_in_abs) + ghosts args_prxs $ distPermsToValuePerms ps_in_rem) + mb_ps_in_rem mb_lops_in_abs) (mbMap3 (\ps_out lops_out lops_in_abs -> let (ps_ghosts, ps_args, ps_rets) = rlSplit3 ghosts_prxs args_prxs rets_prxs $ diff --git a/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs b/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs index f9d8f40f01..7fb960fd49 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs @@ -1062,6 +1062,11 @@ data AtomicPermTrans ctx a where Mb ctx (LOwnedPerms ps_out) -> OpenTerm -> AtomicPermTrans ctx LifetimeType + -- | LBorrowed permissions translate to the same thing as the permissions they + -- borrow + APTrans_LBorrowed :: Mb ctx (LOwnedPerms ps) -> PermTransCtx ctx ps -> + AtomicPermTrans ctx LifetimeType + -- | LCurrent permissions have no computational content APTrans_LCurrent :: Mb ctx (PermExpr LifetimeType) -> AtomicPermTrans ctx LifetimeType @@ -1222,6 +1227,7 @@ instance IsTermTrans (AtomicPermTrans ctx a) where transTerms (APTrans_DefinedNamedConj _ _ _ ptrans) = transTerms ptrans transTerms (APTrans_LLVMFrame _) = [] transTerms (APTrans_LOwned _ _ _ t) = [t] + transTerms (APTrans_LBorrowed _ pctx) = transTerms pctx transTerms (APTrans_LCurrent _) = [] transTerms APTrans_LFinished = [] transTerms (APTrans_Struct pctx) = transTerms pctx @@ -1279,6 +1285,8 @@ atomicPermTransPerm _ (APTrans_DefinedNamedConj npn args off _) = atomicPermTransPerm _ (APTrans_LLVMFrame fp) = fmap Perm_LLVMFrame fp atomicPermTransPerm _ (APTrans_LOwned ls ps_in ps_out _) = mbMap3 Perm_LOwned ls ps_in ps_out +atomicPermTransPerm _ (APTrans_LBorrowed lops _) = + fmap Perm_LBorrowed lops atomicPermTransPerm _ (APTrans_LCurrent l) = fmap Perm_LCurrent l atomicPermTransPerm prxs APTrans_LFinished = nus prxs $ const Perm_LFinished atomicPermTransPerm prxs (APTrans_Struct ps) = @@ -1342,6 +1350,8 @@ instance ExtPermTrans AtomicPermTrans where extPermTrans (APTrans_LLVMFrame fp) = APTrans_LLVMFrame $ extMb fp extPermTrans (APTrans_LOwned ls ps_in ps_out t) = APTrans_LOwned (extMb ls) (extMb ps_in) (extMb ps_out) t + extPermTrans (APTrans_LBorrowed lops pctx) = + APTrans_LBorrowed (extMb lops) (RL.map extPermTrans pctx) extPermTrans (APTrans_LCurrent p) = APTrans_LCurrent $ extMb p extPermTrans APTrans_LFinished = APTrans_LFinished extPermTrans (APTrans_Struct ps) = APTrans_Struct $ RL.map extPermTrans ps @@ -1756,6 +1766,8 @@ instance TransInfo info => (globalOpenTerm "Prelude.CompM") tp_out) return $ mkTypeTrans1 tp (APTrans_LOwned ls ps_in ps_out) + [nuMP| Perm_LBorrowed lops |] -> + fmap (APTrans_LBorrowed lops) <$> translate lops [nuMP| Perm_LCurrent l |] -> return $ mkTypeTrans0 $ APTrans_LCurrent l [nuMP| Perm_LFinished |] -> @@ -2943,6 +2955,38 @@ translateSimplImpl (ps0 :: Proxy ps0) mb_simpl m = case mbMatch mb_simpl of PTrans_Conj [APTrans_LFinished]) m] + [nuMP| SImpl_IntroLBorrowed l _ |] -> + do ttrans <- translateSimplImplOutHead mb_simpl + let prx_ps_l = mbRAssignProxies $ mbSimplImplIn mb_simpl + withPermStackM + (\vars -> + let (vars0, _) = RL.split ps0 prx_ps_l vars in + vars0 :>: translateVar l) + (\pctx -> + let (pctx0, pctx_ps :>: _) = RL.split ps0 prx_ps_l pctx in + pctx0 :>: typeTransF ttrans (transTerms pctx_ps)) + m + + [nuMP| SImpl_ElimLBorrowed _ mb_lops |] -> + do ttrans <- translateSimplImplOut mb_simpl + lops_tp <- typeTransTupleType <$> translate mb_lops + let fromJustOrError (Just x) = x + fromJustOrError Nothing = error "translateSimplImpl: SImpl_ElimLBorrowed" + let f_tm = + lambdaOpenTerm "ps" lops_tp $ \x -> + applyOpenTermMulti (globalOpenTerm "Prelude.returnM") + [lops_tp, x] + withPermStackM + (\(vars0 :>: var_l) -> + let vars' = + RL.map (translateVar . getCompose) $ mbRAssign $ + fmap (fromJustOrError . lownedPermsVars) mb_lops in + RL.append vars0 vars' :>: var_l) + (\(pctx0 :>: PTrans_Conj [APTrans_LBorrowed _ pctx']) -> + RL.append pctx0 $ + typeTransF ttrans (transTerms pctx' ++ [f_tm])) + m + [nuMP| SImpl_LCurrentRefl l |] -> do ttrans <- translateSimplImplOutHead mb_simpl withPermStackM (:>: translateVar l) (:>: typeTransF ttrans []) m From 190bf49c1c0d9d33647b6cb5c4bf4b734ee9908c Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Fri, 7 Jan 2022 07:07:10 -0800 Subject: [PATCH 09/27] removed the lborrowed permission in favor of a simplified lowned permission, which has the same permissions on input and output --- .../Verifier/SAW/Heapster/IRTTranslation.hs | 10 +- .../src/Verifier/SAW/Heapster/Implication.hs | 100 +++++++++++------- .../src/Verifier/SAW/Heapster/Permissions.hs | 91 ++++++++++------ .../src/Verifier/SAW/Heapster/RustTypes.hs | 10 +- .../Verifier/SAW/Heapster/SAWTranslation.hs | 54 ++++------ 5 files changed, 148 insertions(+), 117 deletions(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/IRTTranslation.hs b/heapster-saw/src/Verifier/SAW/Heapster/IRTTranslation.hs index dc94a42a0e..3745ad295d 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/IRTTranslation.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/IRTTranslation.hs @@ -155,7 +155,7 @@ instance ContainsIRTRecName (AtomicPerm a) where containsIRTRecName n (Perm_LLVMFrame fperm) = containsIRTRecName n (map fst fperm) containsIRTRecName _ (Perm_LOwned _ _ _) = False - containsIRTRecName _ (Perm_LBorrowed _) = False + containsIRTRecName _ (Perm_LOwnedSimple _) = False containsIRTRecName _ (Perm_LCurrent _) = False containsIRTRecName _ Perm_LFinished = False containsIRTRecName n (Perm_Struct ps) = containsIRTRecName n ps @@ -416,8 +416,8 @@ instance IRTTyVars (AtomicPerm a) where [nuMP| Perm_LLVMFrame _ |] -> return ([], IRTVarsNil) [nuMP| Perm_LOwned _ _ _ |] -> throwError "lowned permission in an IRT definition!" - [nuMP| Perm_LBorrowed _ |] -> - throwError "lborrowed permission in an IRT definition!" + [nuMP| Perm_LOwnedSimple _ |] -> + throwError "lowned permission in an IRT definition!" [nuMP| Perm_LCurrent _ |] -> return ([], IRTVarsNil) [nuMP| Perm_LFinished |] -> return ([], IRTVarsNil) [nuMP| Perm_Struct ps |] -> irtTyVars ps @@ -666,8 +666,8 @@ instance IRTDescs (AtomicPerm a) where ([nuMP| Perm_LLVMFrame _ |], _) -> return [] ([nuMP| Perm_LOwned _ _ _ |], _) -> error "lowned permission made it to IRTDesc translation" - ([nuMP| Perm_LBorrowed _ |], _) -> - error "lborrowed permission made it to IRTDesc translation" + ([nuMP| Perm_LOwnedSimple _ |], _) -> + error "lowned permission made it to IRTDesc translation" ([nuMP| Perm_LCurrent _ |], _) -> return [] ([nuMP| Perm_LFinished |], _) -> return [] ([nuMP| Perm_Struct ps |], _) -> diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs index c2eaf555c6..28e512c672 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs @@ -924,19 +924,21 @@ data SimplImpl ps_in ps_out where SimplImpl (ps_in :> LifetimeType) (ps_out :> LifetimeType) - -- | Prove an @lborrowed(ps)@ permission from permissions @ps@ and an empty - -- @lowned@ permission: + -- | Prove a simple @lowned(ps)@ permission from permissions @ps@ and an empty + -- @lowned@ permission by having @l@ borrow @ps@: -- - -- > ps * l:lowned (empty -o empty) -o l:lborrowed(ps) - SImpl_IntroLBorrowed :: ExprVar LifetimeType -> LOwnedPerms ps -> - SimplImpl (ps :> LifetimeType) (RNil :> LifetimeType) + -- > ps * l:lowned(empty -o empty) -o [l]ps * l:lowned(ps) + SImpl_IntroLOwnedSimple :: + ExprVar LifetimeType -> LOwnedPerms ps -> + SimplImpl (ps :> LifetimeType) (ps :> LifetimeType) - -- | Eliminate an @l:lborrowed(ps)@ permission into the modalized version - -- @[l]ps@ of @ps@ plus the corresponding @lowned@ permission: + -- | Eliminate a simple @lowned(ps)@ permission into standard @lowned@ + -- permission @lowned([l](R)ps -o ps)@ it represents: -- - -- > l:lborrowed(ps) -o [l]ps * l:lowned ([l](R)ps -o ps) - SImpl_ElimLBorrowed :: ExprVar LifetimeType -> LOwnedPerms ps -> - SimplImpl (RNil :> LifetimeType) (ps :> LifetimeType) + -- > l:lowned(ps) -o l:lowned([l](R)ps -o ps) + SImpl_ElimLOwnedSimple :: + ExprVar LifetimeType -> LOwnedPerms ps -> + SimplImpl (RNil :> LifetimeType) (RNil :> LifetimeType) -- | Reflexivity for @lcurrent@ proofs: -- @@ -1918,13 +1920,13 @@ simplImplIn (SImpl_EndLifetime l ps_in ps_out) = DistPermsCons perms_in l $ ValPerm_LOwned [] ps_in ps_out Nothing -> error "simplImplIn: SImpl_EndLifetime: non-variables in input permissions" -simplImplIn (SImpl_IntroLBorrowed l lops) = +simplImplIn (SImpl_IntroLOwnedSimple l lops) = case lownedPermsToDistPerms lops of Just dps -> DistPermsCons dps l (ValPerm_LOwned [] MNil MNil) Nothing -> - error "simplImplIn: SImpl_IntroLBorrowed: malformed permissions list" -simplImplIn (SImpl_ElimLBorrowed l lops) = - distPerms1 l (ValPerm_LBorrowed lops) + error "simplImplIn: SImpl_IntroLOwnedSimple: malformed permissions list" +simplImplIn (SImpl_ElimLOwnedSimple l lops) = + distPerms1 l (ValPerm_LOwnedSimple lops) simplImplIn (SImpl_LCurrentRefl _) = DistPermsNil simplImplIn (SImpl_LCurrentTrans l1 l2 l3) = distPerms2 l1 (ValPerm_LCurrent $ PExpr_Var l2) l2 (ValPerm_LCurrent l3) @@ -2261,15 +2263,14 @@ simplImplOut (SImpl_EndLifetime l _ ps_out) = Just perms_out -> DistPermsCons perms_out l ValPerm_LFinished _ -> error "simplImplOut: SImpl_EndLifetime: non-variable in output permissions" -simplImplOut (SImpl_IntroLBorrowed l lops) = - distPerms1 l (ValPerm_LBorrowed lops) -simplImplOut (SImpl_ElimLBorrowed l lops) = - case lownedPermsToDistPerms lops of - Just dps -> - DistPermsCons dps l (ValPerm_LOwned - [] (lownedPermsInForBorrow (PExpr_Var l) lops) lops) +simplImplOut (SImpl_IntroLOwnedSimple l lops) = + case lownedPermsToDistPerms (modalizeLOwnedPerms + Nothing (Just (PExpr_Var l)) lops) of + Just dps -> DistPermsCons dps l $ ValPerm_LOwnedSimple lops Nothing -> - error "simplImplOut: SImpl_ElimLOwned: malformed permissions list" + error "simplImplOut: SImpl_IntroLOwnedSimple: non-variables in permission list" +simplImplOut (SImpl_ElimLOwnedSimple l lops) = + distPerms1 l (ValPerm_LOwned [] (lownedPermsSimpleIn l lops) lops) simplImplOut (SImpl_LCurrentRefl l) = distPerms1 l (ValPerm_LCurrent $ PExpr_Var l) simplImplOut (SImpl_LCurrentTrans l1 _ l3) = @@ -2821,10 +2822,10 @@ instance SubstVar PermVarSubst m => [nuMP| SImpl_EndLifetime l ps_in ps_out |] -> SImpl_EndLifetime <$> genSubst s l <*> genSubst s ps_in <*> genSubst s ps_out - [nuMP| SImpl_IntroLBorrowed l lops |] -> - SImpl_IntroLBorrowed <$> genSubst s l <*> genSubst s lops - [nuMP| SImpl_ElimLBorrowed l lops |] -> - SImpl_ElimLBorrowed <$> genSubst s l <*> genSubst s lops + [nuMP| SImpl_IntroLOwnedSimple l lops |] -> + SImpl_IntroLOwnedSimple <$> genSubst s l <*> genSubst s lops + [nuMP| SImpl_ElimLOwnedSimple l lops |] -> + SImpl_ElimLOwnedSimple <$> genSubst s l <*> genSubst s lops [nuMP| SImpl_LCurrentRefl l |] -> SImpl_LCurrentRefl <$> genSubst s l [nuMP| SImpl_LCurrentTrans l1 l2 l3 |] -> @@ -3314,6 +3315,7 @@ implFindLOwnedPerms :: ImplM vars s r ps ps [(ExprVar LifetimeType, ValuePerm LifetimeType)] implFindLOwnedPerms = mapMaybe (\case NameAndElem l p@(ValPerm_LOwned _ _ _) -> Just (l,p) + NameAndElem l p@(ValPerm_LOwnedSimple _) -> Just (l,p) _ -> Nothing) <$> NameMap.assocs <$> view varPermMap <$> getPerms @@ -4325,6 +4327,9 @@ lifetimesThatCouldProve mb_ps = VarAndPerm l (ValPerm_LOwned ls ps_in ps_out) | mbLift $ fmap (lownedPermsCouldProve ps_out) mb_ps -> ((l, Perm_LOwned ls ps_in ps_out) :) + VarAndPerm l (ValPerm_LOwnedSimple ps) + | mbLift $ fmap (lownedPermsCouldProve ps) mb_ps -> + ((l, Perm_LOwnedSimple ps) :) _ -> id) [] all_perms) @@ -5030,6 +5035,8 @@ getLifetimeCurrentPerms (PExpr_Var l) = getPerm l >>= \case ValPerm_LOwned ls ps_in ps_out -> pure $ Some $ LOwnedCurrentPerms l ls ps_in ps_out + ValPerm_LOwnedSimple ps -> + pure $ Some $ LOwnedSimpleCurrentPerms l ps ValPerm_LCurrent l' -> getLifetimeCurrentPerms l' >>= \some_cur_perms -> case some_cur_perms of @@ -5045,6 +5052,8 @@ proveLifetimeCurrent :: NuMatchingAny1 r => LifetimeCurrentPerms ps_l -> proveLifetimeCurrent AlwaysCurrentPerms = pure () proveLifetimeCurrent (LOwnedCurrentPerms l ls ps_in ps_out) = implPushM l (ValPerm_LOwned ls ps_in ps_out) +proveLifetimeCurrent (LOwnedSimpleCurrentPerms l ps) = + implPushM l (ValPerm_LOwnedSimple ps) proveLifetimeCurrent (CurrentTransPerms cur_perms l) = proveLifetimeCurrent cur_perms >>> let l' = lifetimeCurrentPermsLifetime cur_perms @@ -5100,6 +5109,12 @@ recombinePerm' x _ ValPerm_False = implElimFalseM x recombinePerm' x _ p@(ValPerm_Eq (PExpr_Var y)) | y == x = implDropM x p recombinePerm' x ValPerm_True (ValPerm_Eq e) = simplEqPerm x e >>>= \e' -> implPopM x (ValPerm_Eq e') +recombinePerm' x x_p (ValPerm_LOwnedSimple lops) = + -- If p is a simple lowned permission, eliminate it + -- FIXME: do we want to do this? If not, we need more subtle rules for proving + -- simple lowned permissions, and probably widening support for it too... + implSimplM Proxy (SImpl_ElimLOwnedSimple x lops) >>> + recombinePerm' x x_p (ValPerm_LOwned [] (lownedPermsSimpleIn x lops) lops) recombinePerm' x ValPerm_True p = implPopM x p recombinePerm' x (ValPerm_Eq (PExpr_Var y)) _ | y == x = error "recombinePerm: variable x has permission eq(x)!" @@ -5226,15 +5241,6 @@ recombinePermConj x _ (Perm_LLVMBlock bp) | PExpr_FalseShape <- llvmBlockShape bp = implElimLLVMBlock x bp >>> implElimFalseM x --- If p is an lborrowed permission, eliminate it -recombinePermConj x x_ps (Perm_LBorrowed lops) - | Just dps <- lownedPermsToDistPerms lops = - let prx = Proxy in - implSimplM prx (SImpl_ElimLBorrowed x lops) >>> - recombinePermConj x x_ps - (Perm_LOwned [] (lownedPermsInForBorrow (PExpr_Var x) lops) lops) >>> - recombinePermsPartial prx dps - -- Default case: insert p at the end of the x_ps recombinePermConj x x_ps p = implPushM x (ValPerm_Conj x_ps) >>> @@ -5279,6 +5285,8 @@ recombineLifetimeCurrentPerms :: NuMatchingAny1 r => recombineLifetimeCurrentPerms AlwaysCurrentPerms = pure () recombineLifetimeCurrentPerms (LOwnedCurrentPerms l ls ps_in ps_out) = recombinePermExpl l ValPerm_True (ValPerm_LOwned ls ps_in ps_out) +recombineLifetimeCurrentPerms (LOwnedSimpleCurrentPerms l ps) = + recombinePermExpl l ValPerm_True (ValPerm_LOwnedSimple ps) recombineLifetimeCurrentPerms (CurrentTransPerms cur_perms l) = implDropM l (ValPerm_LCurrent $ lifetimeCurrentPermsLifetime cur_perms) >>> recombineLifetimeCurrentPerms cur_perms @@ -7498,15 +7506,28 @@ proveVarAtomicImpl x ps mb_p = case mbMatch mb_p of implSimplM Proxy (SImpl_MapLifetime x [] ps_inL ps_outL ps_inR ps_outR ps1 ps2 impl_in impl_out) - [nuMP| Perm_LBorrowed mb_lops |] + [nuMP| Perm_LOwnedSimple mb_lops |] | Just mb_dps <- mbMaybe (mbMapCl $(mkClosed [| lownedPermsToDistPerms |]) mb_lops) -> + -- Pop the permissions for x, and prove the mb_lops permissions that are + -- going to be borrowed by the lifetime x implPopM x (ValPerm_Conj ps) >>> + getDistPerms >>>= \(ps0 :: DistPerms ps0) -> proveVarsImplAppendInt mb_dps >>> partialSubstForceM mb_lops "proveVarAtomicImpl" >>>= \lops -> + + -- Prove an empty lowned permission for x mbVarsM (distPerms1 x $ ValPerm_LOwned [] MNil MNil) >>>= \mb_p' -> proveVarsImplAppendInt mb_p' >>> - implSimplM Proxy (SImpl_IntroLBorrowed x lops) + + -- Coerce the lowned permission to a simple lowned permission, and then + -- recombine all the resulting permissions for mb_lops + implSimplM (Proxy :: Proxy ps0) (SImpl_IntroLOwnedSimple x lops) >>> + getDistPerms >>>= \perms -> + let (_, ps_lops_l@(ps_lops :>: p_l)) = + RL.split ps0 (RL.map (const Proxy) lops :>: Proxy) perms in + implMoveDownM ps0 ps_lops_l x MNil >>> + recombinePermsPartial (ps0 :>: p_l) ps_lops [nuMP| Perm_LCurrent mb_l' |] -> partialSubstForceM mb_l' "proveVarAtomicImpl" >>>= \l' -> @@ -8074,9 +8095,8 @@ findProvablePerm unsetVars ps = case ps of (best_rank, extDistPermsSplit best x p) --- | Find all existential lifetime variables with @lowned@ or @lborrowed@ --- permissions in an 'ExDistPerms' list, and instantiate them with fresh --- lifetimes +-- | Find all existential lifetime variables with @lowned@ permissions in an +-- 'ExDistPerms' list, and instantiate them with fresh lifetimes instantiateLifetimeVars :: NuMatchingAny1 r => ExDistPerms vars ps -> ImplM vars s r ps_in ps_in () instantiateLifetimeVars mb_ps = diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs b/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs index d86c3e87f8..6d803ca16b 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs @@ -1655,12 +1655,14 @@ data AtomicPerm (a :: CrucibleType) where LOwnedPerms ps_in -> LOwnedPerms ps_out -> AtomicPerm LifetimeType - -- | A lifetime borrow permission @l:lborrowed(ps)@ describes a set of - -- permissions @ps@ that have been borrowed by lifetime @l@. It is logically - -- equivalent to @ps * l:lowned ([l](R)ps -o ps)@, where @[l](R)ps@ represents + -- | A simplified version of @lowned@, written just @lowned(ps)@, which + -- represents a lifetime where the permissions @ps@ have been borrowed and no + -- simplifications have been done. Semantically, this is logically equivalent + -- to @lowned ([l](R)ps -o ps)@, i.e., an @lowned@ permissions where the input + -- and output permissions are the same except that the input permissions are -- the minimal possible versions of @ps@ in lifetime @l@ that could be given -- back when @l@ is ended. - Perm_LBorrowed :: LOwnedPerms ps -> AtomicPerm LifetimeType + Perm_LOwnedSimple :: LOwnedPerms ps -> AtomicPerm LifetimeType -- | Assertion that a lifetime is current during another lifetime Perm_LCurrent :: PermExpr LifetimeType -> AtomicPerm LifetimeType @@ -1803,13 +1805,6 @@ pattern ValPerm_LLVMBlockShape sh <- ValPerm_Conj [Perm_LLVMBlockShape sh] ValPerm_LLVMBlockShape sh = ValPerm_Conj [Perm_LLVMBlockShape sh] -- | A single @lowned@ permission -pattern ValPerm_LBorrowed :: () => (a ~ LifetimeType) => - LOwnedPerms ps -> ValuePerm a -pattern ValPerm_LBorrowed ps <- ValPerm_Conj [Perm_LBorrowed ps] - where - ValPerm_LBorrowed ps = ValPerm_Conj [Perm_LBorrowed ps] - --- | A single @lborrow@ permission pattern ValPerm_LOwned :: () => (a ~ LifetimeType) => [PermExpr LifetimeType] -> LOwnedPerms ps_in -> LOwnedPerms ps_out -> ValuePerm a pattern ValPerm_LOwned ls ps_in ps_out <- ValPerm_Conj [Perm_LOwned @@ -1817,6 +1812,13 @@ pattern ValPerm_LOwned ls ps_in ps_out <- ValPerm_Conj [Perm_LOwned where ValPerm_LOwned ls ps_in ps_out = ValPerm_Conj [Perm_LOwned ls ps_in ps_out] +-- | A single simple @lowned@ permission +pattern ValPerm_LOwnedSimple :: () => (a ~ LifetimeType) => + LOwnedPerms ps -> ValuePerm a +pattern ValPerm_LOwnedSimple ps <- ValPerm_Conj [Perm_LOwnedSimple ps] + where + ValPerm_LOwnedSimple ps = ValPerm_Conj [Perm_LOwnedSimple ps] + -- | A single @lcurrent@ permission pattern ValPerm_LCurrent :: () => (a ~ LifetimeType) => PermExpr LifetimeType -> ValuePerm a @@ -2825,6 +2827,9 @@ data LifetimeCurrentPerms ps_l where LOwnedCurrentPerms :: ExprVar LifetimeType -> [PermExpr LifetimeType] -> LOwnedPerms ps_in -> LOwnedPerms ps_out -> LifetimeCurrentPerms (RNil :> LifetimeType) + -- | A variable @l@ with a simple @lowned@ perm is also current + LOwnedSimpleCurrentPerms :: ExprVar LifetimeType -> LOwnedPerms ps -> + LifetimeCurrentPerms (RNil :> LifetimeType) -- | A variable @l@ that is @lcurrent@ during another lifetime @l'@ is -- current, i.e., if @ps@ ensure @l'@ is current then we need perms @@ -2838,6 +2843,7 @@ lifetimeCurrentPermsLifetime :: LifetimeCurrentPerms ps_l -> PermExpr LifetimeType lifetimeCurrentPermsLifetime AlwaysCurrentPerms = PExpr_Always lifetimeCurrentPermsLifetime (LOwnedCurrentPerms l _ _ _) = PExpr_Var l +lifetimeCurrentPermsLifetime (LOwnedSimpleCurrentPerms l _) = PExpr_Var l lifetimeCurrentPermsLifetime (CurrentTransPerms _ l) = PExpr_Var l -- | Convert a 'LifetimeCurrentPerms' to the 'DistPerms' it represent @@ -2845,6 +2851,8 @@ lifetimeCurrentPermsPerms :: LifetimeCurrentPerms ps_l -> DistPerms ps_l lifetimeCurrentPermsPerms AlwaysCurrentPerms = DistPermsNil lifetimeCurrentPermsPerms (LOwnedCurrentPerms l ls ps_in ps_out) = DistPermsCons DistPermsNil l $ ValPerm_LOwned ls ps_in ps_out +lifetimeCurrentPermsPerms (LOwnedSimpleCurrentPerms l lops) = + distPerms1 l $ ValPerm_LOwnedSimple lops lifetimeCurrentPermsPerms (CurrentTransPerms cur_ps l) = DistPermsCons (lifetimeCurrentPermsPerms cur_ps) l $ ValPerm_Conj1 $ Perm_LCurrent $ lifetimeCurrentPermsLifetime cur_ps @@ -2855,6 +2863,7 @@ mbLifetimeCurrentPermsProxies :: Mb ctx (LifetimeCurrentPerms ps_l) -> mbLifetimeCurrentPermsProxies mb_l = case mbMatch mb_l of [nuMP| AlwaysCurrentPerms |] -> MNil [nuMP| LOwnedCurrentPerms _ _ _ _ |] -> MNil :>: Proxy + [nuMP| LOwnedSimpleCurrentPerms _ _ |] -> MNil :>: Proxy [nuMP| CurrentTransPerms cur_ps _ |] -> mbLifetimeCurrentPermsProxies cur_ps :>: Proxy @@ -2996,9 +3005,9 @@ instance Eq (AtomicPerm a) where , Just Refl <- testEquality ps_out1 ps_out2 = ls1 == ls2 (Perm_LOwned _ _ _) == _ = False - (Perm_LBorrowed lops1) == (Perm_LBorrowed lops2) + (Perm_LOwnedSimple lops1) == (Perm_LOwnedSimple lops2) | Just Refl <- testEquality lops1 lops2 = True - (Perm_LBorrowed _) == _ = False + (Perm_LOwnedSimple _) == _ = False (Perm_LCurrent e1) == (Perm_LCurrent e2) = e1 == e2 (Perm_LCurrent _) == _ = False Perm_LFinished == Perm_LFinished = True @@ -3165,8 +3174,8 @@ instance PermPretty (AtomicPerm a) where _ -> ppEncList False <$> mapM permPrettyM ls return (pretty "lowned" <> ls_pp <+> parens (align $ sep [pp_in, pretty "-o", pp_out])) - permPrettyM (Perm_LBorrowed lops) = - (pretty "lborrowed" <>) <$> parens <$> permPrettyM lops + permPrettyM (Perm_LOwnedSimple lops) = + (pretty "lowned" <>) <$> parens <$> permPrettyM lops permPrettyM (Perm_LCurrent l) = (pretty "lcurrent" <+>) <$> permPrettyM l permPrettyM Perm_LFinished = return (pretty "lfinished") permPrettyM (Perm_Struct ps) = @@ -3345,7 +3354,7 @@ isLLVMBlockPerm _ = False -- | Test if an 'AtomicPerm' is a lifetime permission isLifetimePerm :: AtomicPerm a -> Maybe (a :~: LifetimeType) isLifetimePerm (Perm_LOwned _ _ _) = Just Refl -isLifetimePerm (Perm_LBorrowed _) = Just Refl +isLifetimePerm (Perm_LOwnedSimple _) = Just Refl isLifetimePerm (Perm_LCurrent _) = Just Refl isLifetimePerm Perm_LFinished = Just Refl isLifetimePerm _ = Nothing @@ -3353,7 +3362,7 @@ isLifetimePerm _ = Nothing -- | Test if an 'AtomicPerm' is a lifetime permission that gives ownership isLifetimeOwnershipPerm :: AtomicPerm a -> Maybe (a :~: LifetimeType) isLifetimeOwnershipPerm (Perm_LOwned _ _ _) = Just Refl -isLifetimeOwnershipPerm (Perm_LBorrowed _) = Just Refl +isLifetimeOwnershipPerm (Perm_LOwnedSimple _) = Just Refl isLifetimeOwnershipPerm _ = Nothing -- | Test if an 'AtomicPerm' is a struct permission @@ -5138,7 +5147,7 @@ atomicPermIsCopyable Perm_IsLLVMPtr = True atomicPermIsCopyable (Perm_LLVMBlockShape sh) = shapeIsCopyable PExpr_Write sh atomicPermIsCopyable (Perm_LLVMFrame _) = False atomicPermIsCopyable (Perm_LOwned _ _ _) = False -atomicPermIsCopyable (Perm_LBorrowed _) = False +atomicPermIsCopyable (Perm_LOwnedSimple _) = False atomicPermIsCopyable (Perm_LCurrent _) = True atomicPermIsCopyable Perm_LFinished = True atomicPermIsCopyable (Perm_Struct ps) = and $ RL.mapToList permIsCopyable ps @@ -5202,17 +5211,30 @@ lownedPermsToDistPerms MNil = Just MNil lownedPermsToDistPerms (lops :>: lop) = (:>:) <$> lownedPermsToDistPerms lops <*> lownedPermVarAndPerm lop --- | Convert an 'LOwnedPerms' list @ps@ to the input permission list @[l](R)ps@ --- used in converting an @lborrowed@ permission to an @lowned@ permission -lownedPermsInForBorrow :: PermExpr LifetimeType -> LOwnedPerms ps -> - LOwnedPerms ps -lownedPermsInForBorrow l = RL.map $ \case +-- | Optionally set the modalities of the permissions in an 'LOwnedPerms' list +modalizeLOwnedPerms ::Maybe (PermExpr RWModalityType) -> + Maybe (PermExpr LifetimeType) -> LOwnedPerms ps -> + LOwnedPerms ps +modalizeLOwnedPerms rw l = RL.map $ \case LOwnedPermField x fp -> - LOwnedPermField x $ fp { llvmFieldRW = PExpr_Read, llvmFieldLifetime = l } + LOwnedPermField x $ + fp { llvmFieldRW = fromMaybe (llvmFieldRW fp) rw, + llvmFieldLifetime = fromMaybe (llvmFieldLifetime fp) l } LOwnedPermArray x ap -> - LOwnedPermArray x $ ap { llvmArrayRW = PExpr_Read, llvmArrayLifetime = l } + LOwnedPermArray x $ + ap { llvmArrayRW = fromMaybe (llvmArrayRW ap) rw, + llvmArrayLifetime = fromMaybe (llvmArrayLifetime ap) l } LOwnedPermBlock x bp -> - LOwnedPermBlock x $ bp { llvmBlockRW = PExpr_Read, llvmBlockLifetime = l } + LOwnedPermBlock x $ + bp { llvmBlockRW = fromMaybe (llvmBlockRW bp) rw, + llvmBlockLifetime = fromMaybe (llvmBlockLifetime bp) l } + +-- | Convert an 'LOwnedPerms' list @ps@ to the input permission list @[l](R)ps@ +-- used in a simple @lowned@ permission +lownedPermsSimpleIn :: ExprVar LifetimeType -> LOwnedPerms ps -> + LOwnedPerms ps +lownedPermsSimpleIn l = + modalizeLOwnedPerms (Just PExpr_Read) (Just $ PExpr_Var l) -- | Convert the expressions of an 'LOwnedPerms' to variables, if possible lownedPermsVars :: LOwnedPerms ps -> Maybe (RAssign Name ps) @@ -5410,7 +5432,7 @@ instance FreeVars (AtomicPerm tp) where freeVars (Perm_LLVMFrame fperms) = freeVars $ map fst fperms freeVars (Perm_LOwned ls ps_in ps_out) = NameSet.unions [freeVars ls, freeVars ps_in, freeVars ps_out] - freeVars (Perm_LBorrowed lops) = freeVars lops + freeVars (Perm_LOwnedSimple lops) = freeVars lops freeVars (Perm_LCurrent l) = freeVars l freeVars Perm_LFinished = NameSet.empty freeVars (Perm_Struct ps) = NameSet.unions $ RL.mapToList freeVars ps @@ -5541,7 +5563,7 @@ instance NeededVars (AtomicPerm a) where neededVars (Perm_LLVMBlock bp) = neededVars bp neededVars (Perm_LLVMBlockShape _) = NameSet.empty neededVars p@(Perm_LOwned _ _ _) = freeVars p - neededVars (Perm_LBorrowed lops) = neededVars $ RL.map lownedPermPerm lops + neededVars (Perm_LOwnedSimple lops) = neededVars $ RL.map lownedPermPerm lops neededVars p = freeVars p instance NeededVars (LLVMFieldPerm w sz) where @@ -5816,7 +5838,7 @@ instance SubstVar s m => Substable s (AtomicPerm a) m where [nuMP| Perm_LLVMFrame fp |] -> Perm_LLVMFrame <$> genSubst s fp [nuMP| Perm_LOwned ls ps_in ps_out |] -> Perm_LOwned <$> genSubst s ls <*> genSubst s ps_in <*> genSubst s ps_out - [nuMP| Perm_LBorrowed lops |] -> Perm_LBorrowed <$> genSubst s lops + [nuMP| Perm_LOwnedSimple lops |] -> Perm_LOwnedSimple <$> genSubst s lops [nuMP| Perm_LCurrent e |] -> Perm_LCurrent <$> genSubst s e [nuMP| Perm_LFinished |] -> return Perm_LFinished [nuMP| Perm_Struct tps |] -> Perm_Struct <$> genSubst s tps @@ -5969,6 +5991,8 @@ instance SubstVar PermVarSubst m => [nuMP| LOwnedCurrentPerms l ls ps_in ps_out |] -> LOwnedCurrentPerms <$> genSubst s l <*> genSubst s ls <*> genSubst s ps_in <*> genSubst s ps_out + [nuMP| LOwnedSimpleCurrentPerms l ps |] -> + LOwnedSimpleCurrentPerms <$> genSubst s l <*> genSubst s ps [nuMP| CurrentTransPerms ps l |] -> CurrentTransPerms <$> genSubst s ps <*> genSubst s l @@ -6616,8 +6640,8 @@ instance AbstractVars (AtomicPerm a) where `clMbMbApplyM` abstractPEVars ns1 ns2 ls `clMbMbApplyM` abstractPEVars ns1 ns2 ps_in `clMbMbApplyM` abstractPEVars ns1 ns2 ps_out - abstractPEVars ns1 ns2 (Perm_LBorrowed lops) = - absVarsReturnH ns1 ns2 $(mkClosed [| Perm_LBorrowed |]) + abstractPEVars ns1 ns2 (Perm_LOwnedSimple lops) = + absVarsReturnH ns1 ns2 $(mkClosed [| Perm_LOwnedSimple |]) `clMbMbApplyM` abstractPEVars ns1 ns2 lops abstractPEVars ns1 ns2 (Perm_LCurrent e) = absVarsReturnH ns1 ns2 $(mkClosed [| Perm_LCurrent |]) @@ -6931,7 +6955,8 @@ instance AbstractNamedShape w (AtomicPerm a) where abstractNSM (Perm_LOwned ls ps_in ps_out) = mbMap3 Perm_LOwned <$> abstractNSM ls <*> abstractNSM ps_in <*> abstractNSM ps_out - abstractNSM (Perm_LBorrowed lops) = fmap Perm_LBorrowed <$> abstractNSM lops + abstractNSM (Perm_LOwnedSimple lops) = + fmap Perm_LOwnedSimple <$> abstractNSM lops abstractNSM (Perm_LCurrent e) = fmap Perm_LCurrent <$> abstractNSM e abstractNSM Perm_LFinished = pureBindingM Perm_LFinished abstractNSM (Perm_Struct ps) = fmap Perm_Struct <$> abstractNSM ps @@ -7569,7 +7594,7 @@ instance GetDetVarsClauses (AtomicPerm a) where getDetVarsClauses (Perm_LLVMFrame frame_perm) = concat <$> mapM (getDetVarsClauses . fst) frame_perm getDetVarsClauses (Perm_LOwned _ _ _) = return [] - getDetVarsClauses (Perm_LBorrowed lops) = + getDetVarsClauses (Perm_LOwnedSimple lops) = getDetVarsClauses $ RL.map lownedPermPerm lops getDetVarsClauses _ = return [] diff --git a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs index e713d73166..eb3ae84925 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs @@ -1166,7 +1166,7 @@ mbLifetimeFunPerm (LifetimeDef _ _ [] _) let mb_l_out = extMbMulti rets_prxs $ extMbMulti args_prxs $ extMbMulti ghosts_prxs $ nu id - [nuMP| (Some mb_lops_in, mb_ps_in_rem) |] <- + [nuMP| (Some mb_lops_in, _) |] <- mbMatchM $ mbMap2 lownedPermsForLifetime mb_l mb_ps_in [nuMP| (Some mb_lops_out, _) |] <- mbMatchM $ mbMap2 lownedPermsForLifetime mb_l_out mb_ps_out @@ -1177,10 +1177,10 @@ mbLifetimeFunPerm (LifetimeDef _ _ [] _) Some3FunPerm $ FunPerm (appendCruCtx (singletonCruCtx LifetimeRepr) ghosts) args gouts ret - (mbMap2 (\ps_in_rem lops_in_abs -> - assocAppend (MNil :>: ValPerm_LBorrowed lops_in_abs) - ghosts args_prxs $ distPermsToValuePerms ps_in_rem) - mb_ps_in_rem mb_lops_in_abs) + (mbMap2 (\ps_in lops_in_abs -> + assocAppend (MNil :>: ValPerm_LOwnedSimple lops_in_abs) + ghosts args_prxs $ distPermsToValuePerms ps_in) + mb_ps_in mb_lops_in_abs) (mbMap3 (\ps_out lops_out lops_in_abs -> let (ps_ghosts, ps_args, ps_rets) = rlSplit3 ghosts_prxs args_prxs rets_prxs $ diff --git a/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs b/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs index 7fb960fd49..87f547106c 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs @@ -1055,17 +1055,17 @@ data AtomicPermTrans ctx a where Mb ctx (LLVMFramePerm w) -> AtomicPermTrans ctx (LLVMFrameType w) - -- | LOwned permissions translate to a monadic function from (the translation - -- of) the input permissions to the output permissions + -- | @lowned@ permissions translate to a monadic function from (the + -- translation of) the input permissions to the output permissions APTrans_LOwned :: Mb ctx [PermExpr LifetimeType] -> Mb ctx (LOwnedPerms ps_in) -> Mb ctx (LOwnedPerms ps_out) -> OpenTerm -> AtomicPermTrans ctx LifetimeType - -- | LBorrowed permissions translate to the same thing as the permissions they - -- borrow - APTrans_LBorrowed :: Mb ctx (LOwnedPerms ps) -> PermTransCtx ctx ps -> - AtomicPermTrans ctx LifetimeType + -- | Simple @lowned@ permissions have no translation, because they represent + -- @lowned@ permissions whose translations are just the identity function + APTrans_LOwnedSimple :: Mb ctx (LOwnedPerms ps) -> + AtomicPermTrans ctx LifetimeType -- | LCurrent permissions have no computational content APTrans_LCurrent :: Mb ctx (PermExpr LifetimeType) -> @@ -1227,7 +1227,7 @@ instance IsTermTrans (AtomicPermTrans ctx a) where transTerms (APTrans_DefinedNamedConj _ _ _ ptrans) = transTerms ptrans transTerms (APTrans_LLVMFrame _) = [] transTerms (APTrans_LOwned _ _ _ t) = [t] - transTerms (APTrans_LBorrowed _ pctx) = transTerms pctx + transTerms (APTrans_LOwnedSimple _) = [] transTerms (APTrans_LCurrent _) = [] transTerms APTrans_LFinished = [] transTerms (APTrans_Struct pctx) = transTerms pctx @@ -1285,8 +1285,7 @@ atomicPermTransPerm _ (APTrans_DefinedNamedConj npn args off _) = atomicPermTransPerm _ (APTrans_LLVMFrame fp) = fmap Perm_LLVMFrame fp atomicPermTransPerm _ (APTrans_LOwned ls ps_in ps_out _) = mbMap3 Perm_LOwned ls ps_in ps_out -atomicPermTransPerm _ (APTrans_LBorrowed lops _) = - fmap Perm_LBorrowed lops +atomicPermTransPerm _ (APTrans_LOwnedSimple lops) = fmap Perm_LOwnedSimple lops atomicPermTransPerm _ (APTrans_LCurrent l) = fmap Perm_LCurrent l atomicPermTransPerm prxs APTrans_LFinished = nus prxs $ const Perm_LFinished atomicPermTransPerm prxs (APTrans_Struct ps) = @@ -1350,8 +1349,7 @@ instance ExtPermTrans AtomicPermTrans where extPermTrans (APTrans_LLVMFrame fp) = APTrans_LLVMFrame $ extMb fp extPermTrans (APTrans_LOwned ls ps_in ps_out t) = APTrans_LOwned (extMb ls) (extMb ps_in) (extMb ps_out) t - extPermTrans (APTrans_LBorrowed lops pctx) = - APTrans_LBorrowed (extMb lops) (RL.map extPermTrans pctx) + extPermTrans (APTrans_LOwnedSimple lops) = APTrans_LOwnedSimple (extMb lops) extPermTrans (APTrans_LCurrent p) = APTrans_LCurrent $ extMb p extPermTrans APTrans_LFinished = APTrans_LFinished extPermTrans (APTrans_Struct ps) = APTrans_Struct $ RL.map extPermTrans ps @@ -1766,8 +1764,8 @@ instance TransInfo info => (globalOpenTerm "Prelude.CompM") tp_out) return $ mkTypeTrans1 tp (APTrans_LOwned ls ps_in ps_out) - [nuMP| Perm_LBorrowed lops |] -> - fmap (APTrans_LBorrowed lops) <$> translate lops + [nuMP| Perm_LOwnedSimple lops |] -> + return $ mkTypeTrans0 $ APTrans_LOwnedSimple lops [nuMP| Perm_LCurrent l |] -> return $ mkTypeTrans0 $ APTrans_LCurrent l [nuMP| Perm_LFinished |] -> @@ -2955,36 +2953,24 @@ translateSimplImpl (ps0 :: Proxy ps0) mb_simpl m = case mbMatch mb_simpl of PTrans_Conj [APTrans_LFinished]) m] - [nuMP| SImpl_IntroLBorrowed l _ |] -> - do ttrans <- translateSimplImplOutHead mb_simpl - let prx_ps_l = mbRAssignProxies $ mbSimplImplIn mb_simpl - withPermStackM - (\vars -> - let (vars0, _) = RL.split ps0 prx_ps_l vars in - vars0 :>: translateVar l) + [nuMP| SImpl_IntroLOwnedSimple _ _ |] -> + do let prx_ps_l = mbRAssignProxies $ mbSimplImplIn mb_simpl + ttrans <- translateSimplImplOut mb_simpl + withPermStackM id (\pctx -> let (pctx0, pctx_ps :>: _) = RL.split ps0 prx_ps_l pctx in - pctx0 :>: typeTransF ttrans (transTerms pctx_ps)) + RL.append pctx0 $ typeTransF ttrans (transTerms pctx_ps)) m - [nuMP| SImpl_ElimLBorrowed _ mb_lops |] -> - do ttrans <- translateSimplImplOut mb_simpl + [nuMP| SImpl_ElimLOwnedSimple _ mb_lops |] -> + do ttrans <- translateSimplImplOutHead mb_simpl lops_tp <- typeTransTupleType <$> translate mb_lops - let fromJustOrError (Just x) = x - fromJustOrError Nothing = error "translateSimplImpl: SImpl_ElimLBorrowed" let f_tm = lambdaOpenTerm "ps" lops_tp $ \x -> applyOpenTermMulti (globalOpenTerm "Prelude.returnM") [lops_tp, x] - withPermStackM - (\(vars0 :>: var_l) -> - let vars' = - RL.map (translateVar . getCompose) $ mbRAssign $ - fmap (fromJustOrError . lownedPermsVars) mb_lops in - RL.append vars0 vars' :>: var_l) - (\(pctx0 :>: PTrans_Conj [APTrans_LBorrowed _ pctx']) -> - RL.append pctx0 $ - typeTransF ttrans (transTerms pctx' ++ [f_tm])) + withPermStackM id + (\(pctx0 :>: _) -> pctx0 :>: typeTransF ttrans [f_tm]) m [nuMP| SImpl_LCurrentRefl l |] -> From 714d575fbb45bfa868920ef241c880f48bd36266 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Sat, 18 Dec 2021 06:14:09 -0800 Subject: [PATCH 10/27] added a debug level 2, with more debugging info --- .../src/Verifier/SAW/Heapster/Implication.hs | 28 +++++++++----- .../Verifier/SAW/Heapster/LLVMGlobalConst.hs | 12 +++--- .../src/Verifier/SAW/Heapster/Permissions.hs | 23 +++++++---- .../Verifier/SAW/Heapster/SAWTranslation.hs | 2 +- .../Verifier/SAW/Heapster/TypedCrucible.hs | 38 +++++++++++++------ .../src/Verifier/SAW/Heapster/Widening.hs | 2 +- 6 files changed, 70 insertions(+), 35 deletions(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs index 28e512c672..6c9e108fbe 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs @@ -3395,13 +3395,24 @@ implApplyImpl1 impl1 mb_ms = f ns) -- | Emit debugging output using the current 'PPInfo' if the 'implStateDebugLevel' --- is at least 1 -implTraceM :: (PPInfo -> PP.Doc ann) -> ImplM vars s r ps ps String -implTraceM f = +-- is at least the supplied debug level +implDebugM :: DebugLevel -> (PPInfo -> PP.Doc ann) -> + ImplM vars s r ps ps String +implDebugM reqlvl f = do dlevel <- use implStateDebugLevel doc <- uses implStatePPInfo f let str = renderDoc doc - debugTrace dlevel str (return str) + debugTrace reqlvl dlevel str (return str) + +-- | Emit debugging output using the current 'PPInfo' if the 'implStateDebugLevel' +-- is at least 'traceDebugLevel' +implTraceM :: (PPInfo -> PP.Doc ann) -> ImplM vars s r ps ps String +implTraceM = implDebugM traceDebugLevel + +-- | Emit debugging output using the current 'PPInfo' if the 'implStateDebugLevel' +-- is at least 'verboseDebugLevel' +implVerbTraceM :: (PPInfo -> PP.Doc ann) -> ImplM vars s r ps ps String +implVerbTraceM = implDebugM verboseDebugLevel -- | Run an 'ImplM' computation with the debug level set to 'noDebugLevel' implWithoutTracingM :: ImplM vars s r ps_out ps_in a -> @@ -5093,11 +5104,10 @@ recombinePerm x p = getPerm x >>>= \x_p -> recombinePermExpl x x_p p recombinePermExpl :: NuMatchingAny1 r => ExprVar a -> ValuePerm a -> ValuePerm a -> ImplM vars s r as (as :> a) () recombinePermExpl x x_p p = - {- - use implStatePPInfo >>>= \info -> - tracePretty (string "recombinePerm" <+> permPretty info x - permPretty info x_p string "<-" - permPretty info p) $ -} + implVerbTraceM (\i -> + sep [pretty "recombinePerm" <+> + permPretty i x <> colon <> permPretty i x_p, + pretty "<-" <+> permPretty i p]) >>> recombinePerm' x x_p p -- | This is the implementation of 'recombinePermExpl'; see the documentation diff --git a/heapster-saw/src/Verifier/SAW/Heapster/LLVMGlobalConst.hs b/heapster-saw/src/Verifier/SAW/Heapster/LLVMGlobalConst.hs index 378cd9e75a..32f121c673 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/LLVMGlobalConst.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/LLVMGlobalConst.hs @@ -71,7 +71,7 @@ runLLVMTransM = runReaderT traceAndZeroM :: String -> LLVMTransM a traceAndZeroM msg = do dlevel <- llvmTransInfoDebugLevel <$> ask - debugTrace dlevel msg mzero + debugTraceTraceLvl dlevel msg mzero -- | Helper function to pretty-print the value of a global ppLLVMValue :: L.Value -> String @@ -224,12 +224,12 @@ translateLLVMValueTop dlevel endianness w env global = let trans_info = LLVMTransInfo { llvmTransInfoEnv = env, llvmTransInfoEndianness = endianness, llvmTransInfoDebugLevel = dlevel } in - debugTrace dlevel ("Global: " ++ sym ++ "; value =\n" ++ - maybe "None" ppLLVMValue - (L.globalValue global)) $ + debugTraceTraceLvl dlevel ("Global: " ++ sym ++ "; value =\n" ++ + maybe "None" ppLLVMValue + (L.globalValue global)) $ (\x -> case x of - Just _ -> debugTrace dlevel (sym ++ " translated") x - Nothing -> debugTrace dlevel (sym ++ " not translated") x) $ + Just _ -> debugTraceTraceLvl dlevel (sym ++ " translated") x + Nothing -> debugTraceTraceLvl dlevel (sym ++ " not translated") x) $ flip runLLVMTransM trans_info $ do val <- lift $ L.globalValue global translateLLVMValue w (L.globalType global) val diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs b/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs index 6d803ca16b..a4150bd667 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs @@ -250,15 +250,24 @@ noDebugLevel = DebugLevel 0 traceDebugLevel :: DebugLevel traceDebugLevel = DebugLevel 1 --- | Output a debug statement to @stderr@ using 'trace' if the supplied --- 'DebugLevel' is at least 'traceDebugLevel' -debugTrace :: DebugLevel -> String -> a -> a -debugTrace dlevel | dlevel >= traceDebugLevel = trace -debugTrace _ = const id +-- | The debug level to enable more verbose tracing +verboseDebugLevel :: DebugLevel +verboseDebugLevel = DebugLevel 2 + +-- | Output a debug statement to @stderr@ using 'trace' if the second +-- 'DebugLevel' is at least the first, i.e., the first is the required level for +-- emitting this trace and the second is the current level +debugTrace :: DebugLevel -> DebugLevel -> String -> a -> a +debugTrace req dlevel | dlevel >= req = trace +debugTrace _ _ = const id + +-- | Call 'debugTrace' at 'traceDebugLevel' +debugTraceTraceLvl :: DebugLevel -> String -> a -> a +debugTraceTraceLvl = debugTrace traceDebugLevel -- | Like 'debugTrace' but take in a 'Doc' instead of a 'String' -debugTracePretty :: DebugLevel -> Doc ann -> a -> a -debugTracePretty dlevel d a = debugTrace dlevel (renderDoc d) a +debugTracePretty :: DebugLevel -> DebugLevel -> Doc ann -> a -> a +debugTracePretty req dlevel d a = debugTrace req dlevel (renderDoc d) a -- | The constant string functor newtype StringF a = StringF { unStringF :: String } diff --git a/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs b/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs index 87f547106c..2181a421fd 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/SAWTranslation.hs @@ -4839,7 +4839,7 @@ tcTranslateCFGTupleFun env checks endianness dlevel cfgs_and_perms = tupleOpenTerm $ flip map (zip cfgs_and_perms funs) $ \(cfg_and_perm, _) -> case cfg_and_perm of SomeCFGAndPerm sym _ cfg fun_perm -> - debugTrace dlevel ("Type-checking " ++ show sym) $ + debugTraceTraceLvl dlevel ("Type-checking " ++ show sym) $ translateCFG env' checks $ tcCFG ?ptrWidth env' endianness dlevel fun_perm cfg diff --git a/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs b/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs index 0d839c1e8e..5acb216410 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs @@ -2269,14 +2269,24 @@ permGetPPInfo = gets stPPInfo getErrorPrefix :: PermCheckM ext cblocks blocks tops rets r ps r ps (Doc ()) getErrorPrefix = gets (fromMaybe emptyDoc . stErrPrefix) --- | Emit debugging output using the current 'PPInfo' -stmtTraceM :: (PPInfo -> Doc ()) -> - PermCheckM ext cblocks blocks tops rets r ps r ps String -stmtTraceM f = +-- | Emit debugging output at the given 'DebugLevel' +stmtDebugM :: DebugLevel -> (PPInfo -> Doc ()) -> + PermCheckM ext cblocks blocks tops ret r ps r ps String +stmtDebugM reqlvl f = do dlevel <- stDebugLevel <$> top_get doc <- f <$> permGetPPInfo let str = renderDoc doc - debugTrace dlevel str (return str) + debugTrace reqlvl dlevel str (return str) + +-- | Emit debugging output at 'traceDebugLevel' +stmtTraceM :: (PPInfo -> Doc ()) -> + PermCheckM ext cblocks blocks tops ret r ps r ps String +stmtTraceM = stmtDebugM traceDebugLevel + +-- | Emit debugging output at 'verboseDebugLevel' +stmtVerbTraceM :: (PPInfo -> Doc ()) -> + PermCheckM ext cblocks blocks tops ret r ps r ps String +stmtVerbTraceM = stmtDebugM verboseDebugLevel -- | Failure in the statement permission-checking monad stmtFailM :: (PPInfo -> Doc ()) -> PermCheckM ext cblocks blocks tops rets r1 ps1 @@ -2596,6 +2606,12 @@ emitStmt tps names loc stmt = (mbPure (cruCtxProxies tps) ()) >>>= \(ns, ()) -> setVarTypes Nothing names ns tps >>> gmodify (modifySTCurPerms (applyTypedStmt stmt ns)) >>> + gets (view distPerms . stCurPerms) >>>= \perms_out -> + stmtVerbTraceM (\i -> + pretty "Created new variables: " + <+> permPretty i ns <> line <> + pretty "Statement output permissions: " <+> + permPretty i perms_out) >>> pure ns @@ -4115,7 +4131,7 @@ widenEntry :: PermCheckExtC ext => DebugLevel -> PermEnv -> TypedEntry TCPhase ext blocks tops rets args ghosts -> Some (TypedEntry TCPhase ext blocks tops rets args) widenEntry dlevel env (TypedEntry {..}) = - debugTrace dlevel ("Widening entrypoint: " ++ show typedEntryID) $ + debugTraceTraceLvl dlevel ("Widening entrypoint: " ++ show typedEntryID) $ case foldl1' (widen dlevel env typedEntryTops typedEntryArgs) $ map (fmapF typedCallSiteArgVarPerms) typedEntryCallers of Some (ArgVarPerms ghosts perms_in) -> @@ -4144,14 +4160,14 @@ visitEntry :: visitEntry _ _ _ entry | isJust $ completeTypedEntry entry = (stDebugLevel <$> get) >>= \dlevel -> - debugTrace dlevel ("visitEntry " ++ show (typedEntryID entry) - ++ ": no change") $ + debugTraceTraceLvl dlevel ("visitEntry " ++ show (typedEntryID entry) + ++ ": no change") $ return $ Some entry -- Otherwise, visit the call sites, widen if needed, and type-check the body visitEntry names can_widen blk entry = (stDebugLevel <$> get) >>= \dlevel -> (stPermEnv <$> get) >>= \env -> - debugTracePretty dlevel + debugTracePretty traceDebugLevel dlevel (vsep [pretty ("visitEntry " ++ show (typedEntryID entry) ++ " with input perms:"), permPretty emptyPPInfo (typedEntryPermsIn entry)]) @@ -4159,8 +4175,8 @@ visitEntry names can_widen blk entry = mapM (traverseF $ visitCallSite entry) (typedEntryCallers entry) >>= \callers -> - debugTrace dlevel ("can_widen: " ++ show can_widen ++ ", any_fails: " - ++ show (any (anyF typedCallSiteImplFails) callers)) $ + debugTraceTraceLvl dlevel ("can_widen: " ++ show can_widen ++ ", any_fails: " + ++ show (any (anyF typedCallSiteImplFails) callers)) $ if can_widen && any (anyF typedCallSiteImplFails) callers then case widenEntry dlevel env entry of Some entry' -> diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Widening.hs b/heapster-saw/src/Verifier/SAW/Heapster/Widening.hs index 01c12c35a3..7c07886b64 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Widening.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Widening.hs @@ -194,7 +194,7 @@ traceM :: (PPInfo -> Doc ()) -> WideningM () traceM f = do dlevel <- view wsDebugLevel <$> get str <- renderDoc <$> f <$> view wsPPInfo <$> get - debugTrace dlevel str $ return () + debugTraceTraceLvl dlevel str $ return () ---------------------------------------------------------------------- From 83567cad4a6318f9242925046b7978073102876f Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Sat, 8 Jan 2022 06:47:37 -0800 Subject: [PATCH 11/27] changed isProvablePerm so we always prove simple lowned permissions first; also changed implLLVMFieldTryProveWordEq to not drop equality permissions --- .../src/Verifier/SAW/Heapster/Implication.hs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs index 6c9e108fbe..e5f2996626 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs @@ -3484,6 +3484,9 @@ implCatchM f p m1 m2 = implPushM :: HasCallStack => NuMatchingAny1 r => ExprVar a -> ValuePerm a -> ImplM vars s r (ps :> a) ps () implPushM x p = + implVerbTraceM (\i -> + sep [pretty "implPushM" <+> + permPretty i x <> colon <> permPretty i p]) >>> implApplyImpl1 (Impl1_Push x p) (MNil :>: Impl1Cont (const $ pure ())) -- | Call 'implPushM' for multiple @x:p@ permissions @@ -3509,6 +3512,9 @@ implPushOrReflMultiM (DistPermsCons ps x p) = implPopM :: HasCallStack => NuMatchingAny1 r => ExprVar a -> ValuePerm a -> ImplM vars s r ps (ps :> a) () implPopM x p = + implVerbTraceM (\i -> + sep [pretty "implPopM" <+> + permPretty i x <> colon <> permPretty i p]) >>> implApplyImpl1 (Impl1_Pop x p) (MNil :>: Impl1Cont (const $ pure ())) -- | Eliminate a disjunctive permission @x:(p1 \/ p2)@, building proof trees @@ -4378,7 +4384,7 @@ implLLVMFieldTryProveWordEq :: (Maybe (PermExpr (BVType sz))) implLLVMFieldTryProveWordEq x fp = implElimLLVMFieldContentsM x fp >>>= \y -> getPerm y >>>= \p -> - implPushM y p >>> elimOrsExistsNamesM y >>>= \case + implPushM y p >>> implMaybeCopyPopM y p >>> elimOrsExistsNamesM y >>>= \case ValPerm_Eq e -> substEqsWithProof e >>>= \eqp -> case someEqProofRHS eqp of @@ -8051,7 +8057,7 @@ extDistPermsSplit (DistPermsSplit prxs1 prxs2 ps12 x p) y p' = -- | The maximum priority returned by 'isProvablePerm' isProvablePermMax :: Int -isProvablePermMax = 2 +isProvablePermMax = 3 -- | Test if a permission is of a form where 'proveExVarImpl' will succeed, -- given the current set of existential variables whose values have not been @@ -8060,6 +8066,11 @@ isProvablePermMax = 2 isProvablePerm :: NameSet CrucibleType -> Maybe (ExprVar a) -> ValuePerm a -> Int +-- Simple lifetime permissions should be proved first, so get highest priority +isProvablePerm unsetVars maybe_x p@(ValPerm_Conj [Perm_LOwnedSimple _]) + | neededs <- maybe id (\x -> NameSet.insert x) maybe_x $ neededVars p + , NameSet.null $ NameSet.intersection neededs unsetVars = 3 + -- Lifetime permissions can always be proved, but we want to prove them after -- any other permissions that might depend on them, so they get priority 1 isProvablePerm _ _ (ValPerm_Conj ps) From a1cf7a45588de18eb890e12a116769fb3c1b5e5a Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Wed, 12 Jan 2022 07:11:26 -0800 Subject: [PATCH 12/27] fixed the layout for Rust enum and struct arguments: when they are laid out as pointers to values, the return permissions need to give back the memory where they were as an empty memblock permission --- .../src/Verifier/SAW/Heapster/RustTypes.hs | 82 +++++++++++++------ 1 file changed, 57 insertions(+), 25 deletions(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs index eb3ae84925..d23d3e8aa6 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs @@ -739,6 +739,33 @@ argLayoutStructPerm (ArgLayout ghosts args mb_perms) valPermExistsMulti ghosts $ fmap (ValPerm_Conj1 . Perm_Struct) mb_perms -} +-- | Like an 'ArgLayout' but with output permissions on arguments as well +data ArgLayoutIO where + ArgLayoutIO :: CtxRepr ctx -> ArgLayoutPerm ctx -> + RAssign ValuePerm (CtxToRList ctx) -> ArgLayoutIO + +-- | Append two 'ArgLayoutIO's, if possible +appendArgLayoutIO :: ArgLayoutIO -> ArgLayoutIO -> ArgLayoutIO +appendArgLayoutIO (ArgLayoutIO ctx1 p1 ps1) (ArgLayoutIO ctx2 p2 ps2) = + ArgLayoutIO (ctx1 Ctx.<++> ctx2) (appendArgLayoutPerms ctx1 ctx2 p1 p2) + (assignToRListAppend ctx1 ctx2 ps1 ps2) + +-- | Convert an 'ArgLayout' to an 'ArgLayoutIO' by adding @true@ output perms +argLayoutAddTrueOuts :: ArgLayout -> ArgLayoutIO +argLayoutAddTrueOuts (ArgLayout ctx p) = + ArgLayoutIO ctx p $ trueValuePerms $ assignToRList ctx + +-- | Construct an 'ArgLayoutIO' for 0 arguments +argLayoutIO0 :: ArgLayoutIO +argLayoutIO0 = ArgLayoutIO Ctx.empty (ALPerm MNil) MNil + +-- | Create an 'ArgLayoutIO' from a single input and output perm +argLayoutIO1 :: KnownRepr TypeRepr a => ValuePerm a -> ValuePerm a -> + ArgLayoutIO +argLayoutIO1 p_in p_out = + ArgLayoutIO (extend Ctx.empty knownRepr) (ALPerm + (MNil :>: p_in)) (MNil :>: p_out) + -- | Convert a shape to a writeable block permission with that shape, or fail if -- the length of the shape is not defined -- @@ -792,6 +819,7 @@ un3SomeFunPerm args ret (Some3FunPerm fun_perm) = -- ghost variables in the 'ArgLayout' funPerm3FromMbArgLayout :: CtxRepr ctx -> MatchedMb ghosts (ArgLayoutPerm ctx) -> + ValuePerms (CtxToRList ctx) -> CruCtx ghosts -> CtxRepr args -> ValuePerms (CtxToRList args) -> ValuePerms (CtxToRList args) -> @@ -803,8 +831,8 @@ funPerm3FromMbArgLayout :: CtxRepr ctx -> -- is, we build the function permission -- -- (ghosts). arg1:p1, ..., argn:pn -o ret:ret_perm -funPerm3FromMbArgLayout ctx [nuMP| ALPerm mb_ps_in |] - ghosts ctx1 ps1_in ps1_out ret_tp ret_perm +funPerm3FromMbArgLayout ctx [nuMP| ALPerm mb_ps_in |] ps_out + ghosts ctx1 ps1_in ps1_out ret_tp ret_perm | ctx_args <- mkCruCtx (ctx1 Ctx.<++> ctx) , ctx_all <- appendCruCtx ghosts ctx_args , ghost_perms <- trueValuePerms $ cruCtxProxies ghosts @@ -815,38 +843,38 @@ funPerm3FromMbArgLayout ctx [nuMP| ALPerm mb_ps_in |] RL.append ghost_perms (assignToRListAppend ctx1 ctx ps1_in ps_in)) mb_ps_in , ps_out_all <- - RL.append ghost_perms (assignToRListAppend ctx1 ctx ps1_out $ - trueValuePerms $ assignToRList ctx) :>: ret_perm = + RL.append ghost_perms (assignToRListAppend + ctx1 ctx ps1_out ps_out) :>: ret_perm = return $ Some3FunPerm $ FunPerm ghosts ctx_args CruCtxNil ret_tp mb_ps_in_all (nuMulti (cruCtxProxies ctx_all :>: Proxy) $ \_ -> ps_out_all) -funPerm3FromMbArgLayout ctx [nuMP| ALPerm_Exists mb_p |] - ghosts ctx1 ps1_in ps1_out ret_tp ret_perm = - funPerm3FromMbArgLayout ctx (mbMatch $ mbCombine (MNil :>: Proxy) mb_p) +funPerm3FromMbArgLayout ctx [nuMP| ALPerm_Exists mb_p |] ps_out + ghosts ctx1 ps1_in ps1_out ret_tp ret_perm = + funPerm3FromMbArgLayout ctx (mbMatch $ mbCombine (MNil :>: Proxy) mb_p) ps_out (CruCtxCons ghosts knownRepr) ctx1 ps1_in ps1_out ret_tp ret_perm -funPerm3FromMbArgLayout _ctx [nuMP| ALPerm_Or _ _ |] - _ghosts _ctx1 _ps1_in _ps1_out _ret_tp _ret_perm = +funPerm3FromMbArgLayout _ctx [nuMP| ALPerm_Or _ _ |] _ps_out + _ghosts _ctx1 _ps1_in _ps1_out _ret_tp _ret_perm = fail "Cannot (yet) handle Rust enums or other disjunctive types in functions" --- | Build a function permission from an 'ArgLayout' that describes the --- arguments and their input permissions and a return permission that describes --- the output permissions on the return value. The arguments specified by the --- 'ArgLayout' get no permissions on output. The caller also specifies --- additional arguments to be prepended to the argument list that do have output --- permissions as a struct of 0 or more fields along with input and output --- permissions on those arguments. -funPerm3FromArgLayout :: ArgLayout -> CtxRepr args -> +-- | Build a function permission from an 'ArgLayoutIO' that describes the +-- arguments and their input and output permissions and a return permission that +-- describes the output permissions on the return value. The caller also +-- specifies additional arguments to be prepended to the argument list that do +-- have output permissions as a struct of 0 or more fields along with input and +-- output permissions on those arguments. +funPerm3FromArgLayout :: ArgLayoutIO -> CtxRepr args -> ValuePerms (CtxToRList args) -> ValuePerms (CtxToRList args) -> TypeRepr ret -> ValuePerm ret -> RustConvM Some3FunPerm -funPerm3FromArgLayout (ArgLayout ctx p_in) ctx1 ps1_in ps1_out ret_tp ret_perm = - funPerm3FromMbArgLayout ctx (mbMatch $ emptyMb p_in) CruCtxNil +funPerm3FromArgLayout (ArgLayoutIO + ctx p_in ps_out) ctx1 ps1_in ps1_out ret_tp ret_perm = + funPerm3FromMbArgLayout ctx (mbMatch $ emptyMb p_in) ps_out CruCtxNil ctx1 ps1_in ps1_out ret_tp ret_perm -- | Like 'funPerm3FromArgLayout' but with no additional arguments -funPerm3FromArgLayoutNoArgs :: ArgLayout -> TypeRepr ret -> ValuePerm ret -> +funPerm3FromArgLayoutNoArgs :: ArgLayoutIO -> TypeRepr ret -> ValuePerm ret -> RustConvM Some3FunPerm funPerm3FromArgLayoutNoArgs layout ret ret_perm = funPerm3FromArgLayout layout Ctx.empty MNil MNil ret ret_perm @@ -998,13 +1026,17 @@ layoutArgShapeOrBlock abi sh = permPretty ppInfo sh] -- | Compute the layout of an argument with the given shape as 1 or more --- register arguments of a function +-- register arguments of a function. If the argument is laid out as a value, +-- then it has no output permissions, but if it is laid out as a pointer, the +-- memory occupied by that pointer is returned with an empty shape. layoutArgShape :: (1 <= w, KnownNat w) => Abi -> - PermExpr (LLVMShapeType w) -> RustConvM ArgLayout + PermExpr (LLVMShapeType w) -> RustConvM ArgLayoutIO layoutArgShape abi sh = layoutArgShapeOrBlock abi sh >>= \case - Right layout -> return layout - Left bp -> return $ argLayout1 $ ValPerm_LLVMBlock bp + Right layout -> return $ argLayoutAddTrueOuts layout + Left bp -> + return (argLayoutIO1 (ValPerm_LLVMBlock bp) + (ValPerm_LLVMBlock $ bp { llvmBlockShape = PExpr_EmptyShape })) -- | Compute the layout for the inputs and outputs of a function with the given -- shapes as arguments and return value as a function permission @@ -1013,7 +1045,7 @@ layoutFun :: (1 <= w, KnownNat w) => Abi -> RustConvM Some3FunPerm layoutFun abi arg_shs ret_sh = do args_layout <- - foldr appendArgLayout argLayout0 <$> mapM (layoutArgShape abi) arg_shs + foldr appendArgLayoutIO argLayoutIO0 <$> mapM (layoutArgShape abi) arg_shs ret_layout_eith <- layoutArgShapeOrBlock abi ret_sh case ret_layout_eith of From ef0b6a9110477f27fee4549543de248f6c054875 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Wed, 12 Jan 2022 12:46:42 -0800 Subject: [PATCH 13/27] added the mk_proj0_five_values example to test out struct types passed by value to called functions --- heapster-saw/examples/rust_data.bc | Bin 229136 -> 233424 bytes heapster-saw/examples/rust_data.rs | 17 +++++++++++++++++ heapster-saw/examples/rust_data.saw | 28 ++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+) diff --git a/heapster-saw/examples/rust_data.bc b/heapster-saw/examples/rust_data.bc index 8e1b62a49b195f96961f884407795e7d169ecd6d..9c7898dd4a9946017ec57e168b3e87a40d11c9a2 100644 GIT binary patch literal 233424 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

v`&{x>`i`}s%y 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 literal 229136 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

6uRoffoZP8BE4Tk_2=U!SHo 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 z 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 u32 { + match fvs { + FiveValues(x0,x1,x2,x3,x4) => + match i { + 0 => x0, + 1 => x1, + 2 => x2, + 3 => x3, + _ => x4 + } + } +} + +pub fn mk_proj0_five_values (x1:u32,x2:u32,x3:u32,x4:u32,x5:u32) -> u32 { + proj_five_values (0, mk_five_values (x1,x2,x3,x4,x5)) +} + /* Test if a Result is Ok or Err */ pub fn test_result <'a> (r:&'a Result) -> bool { diff --git a/heapster-saw/examples/rust_data.saw b/heapster-saw/examples/rust_data.saw index 69555b9df9..7d8d6d2b7d 100644 --- a/heapster-saw/examples/rust_data.saw +++ b/heapster-saw/examples/rust_data.saw @@ -71,6 +71,11 @@ heapster_define_rust_type env "pub enum List { Nil, Cons (X,Box>) }"; // instead just make Void an opaque type heapster_define_opaque_llvmshape env "Void" 64 "" "64" "#()"; + // Location type from std::panic +heapster_define_llvmshape env "panic::Location" 64 "" + "exsh len:bv 64.ptrsh(arraysh())); \ + \ fieldsh(eq(llvmword(len))); u32<>; u32<>"; + // List64 type heapster_define_rust_type env "pub enum List64 { Nil64, Cons64 (u64,Box) }"; @@ -251,6 +256,12 @@ to_string_str <- heapster_find_symbol env heapster_assume_fun_rename_prim env to_string_str "to_string_str" "<'a> fn (&'a str) -> String"; +// core::panicking::panic +panicking_panic_sym <- heapster_find_symbol env "9panicking5panic"; +heapster_assume_fun_rename_prim env panicking_panic_sym "panicking_panic" + "<'a, 'b> fn (&'a str, &'b panic::Location) -> !"; +// FIXME: the above should use the 'static lifetime, which needs Heapster support + // NOTE: this is the more incorrect version, with no lifetime argument and no shapes //heapster_assume_fun_rename env to_string_str "to_string_str" // "(len:bv 64). arg0:memblock(W,0,24,emptysh), @@ -420,10 +431,27 @@ mk_two_values_sym <- heapster_find_symbol env "13mk_two_values"; heapster_typecheck_fun_rename env mk_two_values_sym "mk_two_values" "<> fn (u32,u32) -> TwoValues"; */ +// mk_five_values +mk_five_values_sym <- heapster_find_symbol env "14mk_five_values"; +heapster_typecheck_fun_rename env mk_five_values_sym "mk_five_values" + "<> fn (x1:u32,x2:u32,x3:u32,x4:u32,x5:u32) -> FiveValues"; + +// proj_five_values +proj_five_values_sym <- heapster_find_symbol env "16proj_five_values"; +heapster_typecheck_fun_rename env proj_five_values_sym "proj_five_values" + "<> fn (i:u64, fvs:FiveValues) -> u32"; + +// mk_proj0_five_values +mk_proj0_five_values_sym <- heapster_find_symbol env "20mk_proj0_five_values"; +heapster_typecheck_fun_rename env mk_proj0_five_values_sym "mk_proj0_five_values" + "<> fn (x1:u32,x2:u32,x3:u32,x4:u32,x5:u32) -> u32"; + // ref_sum +//heapster_set_debug_level env 1; ref_sum_sym <- heapster_find_symbol env "7ref_sum"; heapster_typecheck_fun_rename env ref_sum_sym "ref_sum" "<'a,'b> fn (x:&'a u64, y:&'a u64) -> u64"; +//heapster_set_debug_level env 0; // double_dup_ref double_dup_ref_sym <- heapster_find_symbol env "14double_dup_ref"; From fd32ec5a796d69fc22b43ef7b6d46e108d10ab20 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Thu, 13 Jan 2022 16:25:46 -0600 Subject: [PATCH 14/27] Skeleton of decider for option-like Rust types --- heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs index d23d3e8aa6..695b615dd3 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs @@ -362,6 +362,14 @@ isNamedParams :: PathParameters a -> Bool isNamedParams (AngleBracketed _ tys _ _) = all isNamedType tys isNamedParams _ = error "Parenthesized types not supported" +-- | Decide whether a Rust type definition is polymorphic and "Option-like"; +-- that is, it contains only one data-bearing variant, and the data is of the +-- polymorphic type +isOptionLike :: Item Span -> Bool +isOptionLike (Enum _ _ _ variants (Generics _ [TyParam _ t _ _ _] _ _) _) = + error "Not yet implemented" +isOptionLike _ = False + -- | Get all of the 'RustName's of path parameters, if they're angle-bracketed pParamNames :: PathParameters a -> [RustName] pParamNames (AngleBracketed _ tys _ _) = mapMaybe tyName tys From 9728a248e9e56f35b8717dd576cef713f934e6e1 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Thu, 13 Jan 2022 16:54:01 -0600 Subject: [PATCH 15/27] Find a variant that carries data of type given by the type parameter; stop deciding option-like-ness if no such element is found --- heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs index 695b615dd3..3adefcf9a2 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs @@ -367,7 +367,15 @@ isNamedParams _ = error "Parenthesized types not supported" -- polymorphic type isOptionLike :: Item Span -> Bool isOptionLike (Enum _ _ _ variants (Generics _ [TyParam _ t _ _ _] _ _) _) = - error "Not yet implemented" + -- Short-circuit if no variant carries the type parameter. Otherwise check + -- that all other variants carry nothing + case find containsT variants of + Nothing -> False + Just v -> error "Not yet implemented" + where + containsT (Variant _ _ (TupleD [StructField _ _ (PathTy _ (Path _ [PathSegment t' _ _] _) _) _ _] _) _ _) = + name t == name t' + containsT _ = False isOptionLike _ = False -- | Get all of the 'RustName's of path parameters, if they're angle-bracketed From bfc399902d6f37f70b670bd1cab3dca7d8bc56ac Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Thu, 13 Jan 2022 17:00:21 -0600 Subject: [PATCH 16/27] Better name for function, finish implementation by confirming all other variants carry no data --- heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs index 3adefcf9a2..a3cd3412e8 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs @@ -365,18 +365,21 @@ isNamedParams _ = error "Parenthesized types not supported" -- | Decide whether a Rust type definition is polymorphic and "Option-like"; -- that is, it contains only one data-bearing variant, and the data is of the -- polymorphic type -isOptionLike :: Item Span -> Bool -isOptionLike (Enum _ _ _ variants (Generics _ [TyParam _ t _ _ _] _ _) _) = +isPolyOptionLike :: Item Span -> Bool +isPolyOptionLike (Enum _ _ _ variants (Generics _ [TyParam _ t _ _ _] _ _) _) = -- Short-circuit if no variant carries the type parameter. Otherwise check -- that all other variants carry nothing case find containsT variants of Nothing -> False - Just v -> error "Not yet implemented" + Just v -> all isUnitVariant (delete v variants) where containsT (Variant _ _ (TupleD [StructField _ _ (PathTy _ (Path _ [PathSegment t' _ _] _) _) _ _] _) _ _) = name t == name t' containsT _ = False -isOptionLike _ = False + + isUnitVariant (Variant _ _ (UnitD _) _ _) = True + isUnitVariant _ = False +isPolyOptionLike _ = False -- | Get all of the 'RustName's of path parameters, if they're angle-bracketed pParamNames :: PathParameters a -> [RustName] From 0c8e6e2dc0e17190113f61753deb5388842c29c8 Mon Sep 17 00:00:00 2001 From: Chris Phifer Date: Fri, 14 Jan 2022 09:42:42 -0600 Subject: [PATCH 17/27] Cover struct-style fields for option-like enums --- heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs index a3cd3412e8..2c94c2e1a9 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs @@ -375,6 +375,8 @@ isPolyOptionLike (Enum _ _ _ variants (Generics _ [TyParam _ t _ _ _] _ _) _) = where containsT (Variant _ _ (TupleD [StructField _ _ (PathTy _ (Path _ [PathSegment t' _ _] _) _) _ _] _) _ _) = name t == name t' + containsT (Variant _ _ (StructD [StructField _ _ (PathTy _ (Path _ [PathSegment t' _ _] _) _) _ _] _) _ _) = + name t == name t' containsT _ = False isUnitVariant (Variant _ _ (UnitD _) _ _) = True From f423d62786d35e444af63745e5354cdee77917e9 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Mon, 7 Feb 2022 16:56:51 -0800 Subject: [PATCH 18/27] If proving a tagged union shape where we know none of the tags match, fail right away --- heapster-saw/src/Verifier/SAW/Heapster/Implication.hs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs index e5f2996626..f6342e60c6 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs @@ -7024,12 +7024,17 @@ proveVarLLVMBlocks2 x ps psubst mb_bp _ mb_bps getTopDistPerm x >>>= \p' -> recombinePerm x p' >>> - -- Find the disjunct corresponding to e_tag, if there is one; otherwise, we - -- don't know which disjunct to use, so return each of them in turn, - -- combining them with implCatchM + -- Find the disjunct corresponding to e_tag, if there is one; if e_tag is + -- known to be different from all possible tags, we can fail right away; + -- otherwise, we don't know which disjunct to use, so return each of them in + -- turn, combining them with implCatchM (getEqualsExpr e_tag >>>= \case (bvMatchConst -> Just tag_bv) | Just i <- mbFindTaggedUnionIndex tag_bv mb_tag_u -> return i + (bvMatchConst -> Just tag_bv) -> + implFailVarM + "proveVarLLVMBlock (tag does not match any in disjuctive shape)" + x (ValPerm_Conj ps) (mbValPerm_LLVMBlock mb_bp) _ -> let len = mbLift $ mbMapCl $(mkClosed [| length . From bd704b5b8c0b6250071deed04ecdb9449b2db912 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Mon, 7 Feb 2022 16:57:16 -0800 Subject: [PATCH 19/27] whoops, typo in error message --- heapster-saw/src/Verifier/SAW/Heapster/Implication.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs index f6342e60c6..de1abbf9ee 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs @@ -3180,7 +3180,7 @@ partialSubstForceM mb_e caller = case partialSubst psubst mb_e of Just e -> pure e Nothing -> - implTraceM (\i -> sep [pretty ("Incomplete susbtitution in " ++ caller + implTraceM (\i -> sep [pretty ("Incomplete substitution in " ++ caller ++ " for:"), permPretty i mb_e]) >>= implFailM From 51ccc15bbb1a001a6f7dd41fcd2490f48bfde47b Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Mon, 7 Feb 2022 17:56:15 -0800 Subject: [PATCH 20/27] added a special case to proveVarLLVMBlocks2 for proving a sequence shape with an unneeded empty shape --- .../src/Verifier/SAW/Heapster/Implication.hs | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs index de1abbf9ee..b54b06bf0e 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs @@ -6975,8 +6975,40 @@ proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps llvmArrayPermToBlock ap) ps' 0 --- If proving a sequence shape, prove the two shapes and combine them; this --- requires the first shape to have a well-defined length +-- If proving a sequence shape with an unneeded empty shape, i.e., of the form +-- sh1;emptysh where the length of sh1 equals the entire length of the required +-- memblock permission, then prove sh1 by itself and then add the empty shape +proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps + | [nuMP| PExpr_SeqShape _ PExpr_EmptyShape |] <- mb_sh + , mbLift $ mbMapCl $(mkClosed + [| \bp -> + let PExpr_SeqShape sh1 _ = llvmBlockShape bp in + bvEq (llvmBlockLen bp) (fromJust $ + llvmShapeLength sh1) |]) mb_bp = + -- Recursively call proveVarLLVMBlocks with sh1 in place of sh1;emptysh + let mb_bp' = mbMapCl $(mkClosed + [| \bp -> + let PExpr_SeqShape sh1 _ = llvmBlockShape bp in + bp { llvmBlockShape = sh1 } |]) mb_bp in + proveVarLLVMBlocks x ps psubst (mb_bp':mb_bps) >>> + + -- Extract the sh1 permission from the top of the stack and sequence an + -- empty shape onto the end of it + getTopDistPerm x >>>= \(ValPerm_Conj ps') -> + implExtractSwapConjM x ps' 0 >>> + let Perm_LLVMBlock bp = head ps' + sh1 = llvmBlockShape bp in + implSimplM Proxy (SImpl_IntroLLVMBlockSeqEmpty x bp) >>> + + -- Finally, put the new sh1;emptysh permission back in place + implSwapInsertConjM x (Perm_LLVMBlock + (bp { llvmBlockShape = + PExpr_SeqShape sh1 PExpr_EmptyShape })) + (tail ps') 0 + + +-- If proving a sequence shape otherwise, prove the two shapes and combine them; +-- this requires the first shape to have a well-defined length proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps | [nuMP| PExpr_SeqShape mb_sh1 _ |] <- mb_sh , mbLift $ mbMapCl $(mkClosed [| isJust . llvmShapeLength |]) mb_sh1 = From 60824b351a02f1301fcf1a044df30455b705b616 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Mon, 7 Feb 2022 18:04:30 -0800 Subject: [PATCH 21/27] removed an unused variable warning; added a FIXME for proveVarLLVMBlocks2 --- .../src/Verifier/SAW/Heapster/Implication.hs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs index b54b06bf0e..f070d8b3a5 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Implication.hs @@ -6937,6 +6937,14 @@ proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps -- If proving a field shape, prove the remaining blocks and then prove the -- corresponding field permission +-- +-- FIXME: instead of proving the field for this field shape after the remaining +-- shapes, proveVarLLVMBlocks should collect all field and array shapes that +-- need to be proved and bottom out with a call to proveVarConjImpl, so that +-- each of these shapes is proved in the proper order to make sure all variables +-- get determined. The current approach just happens to work because the only +-- undetermined variables in shapes coming from Rust types most of the time are +-- the lengths of slices, which are stored after the array. proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps | [nuMP| PExpr_FieldShape (LLVMFieldShape mb_p) |] <- mb_sh , sz <- mbExprLLVMTypeWidth mb_p @@ -6958,6 +6966,8 @@ proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps -- If proving a field shape, prove the remaining blocks and then prove the -- corresponding array permission +-- +-- FIXME: see above FIXME on proving field shapes proveVarLLVMBlocks2 x ps psubst mb_bp mb_sh mb_bps | [nuMP| PExpr_ArrayShape _ _ _ |] <- mb_sh = -- Recursively prove the remaining block permissions @@ -7063,7 +7073,7 @@ proveVarLLVMBlocks2 x ps psubst mb_bp _ mb_bps (getEqualsExpr e_tag >>>= \case (bvMatchConst -> Just tag_bv) | Just i <- mbFindTaggedUnionIndex tag_bv mb_tag_u -> return i - (bvMatchConst -> Just tag_bv) -> + (bvMatchConst -> Just _) -> implFailVarM "proveVarLLVMBlock (tag does not match any in disjuctive shape)" x (ValPerm_Conj ps) (mbValPerm_LLVMBlock mb_bp) From fe8c3f564e06ae0cef0b3d5e61a1794556db69bc Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Tue, 8 Feb 2022 12:47:03 -0800 Subject: [PATCH 22/27] whoops, got the endianness wrong in bvSplit --- heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs b/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs index a4150bd667..5d990a9b35 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs @@ -1430,13 +1430,13 @@ bvConcat LittleEndian bv1 bv2 -- to determine which is the first versus second part of the split bvSplit :: KnownNat sz1 => KnownNat sz2 => EndianForm -> NatRepr sz1 -> BV.BV sz2 -> Maybe (BV.BV sz1, BV.BV (sz2 - sz1)) -bvSplit BigEndian sz1 bv2 +bvSplit LittleEndian sz1 bv2 | n0 <- knownNat @0 , sz2 <- natRepr bv2 , Left LeqProof <- decideLeq (addNat n0 sz1) sz2 , Left LeqProof <- decideLeq (addNat sz1 (subNat sz2 sz1)) sz2 = Just (BV.select n0 sz1 bv2, BV.select sz1 (subNat sz2 sz1) bv2) -bvSplit LittleEndian sz1 bv2 +bvSplit BigEndian sz1 bv2 | n0 <- knownNat @0 , sz2 <- natRepr bv2 , Left LeqProof <- decideLeq sz1 sz2 From 54e361398306afe5a25e05f33521e9d2d98fdf31 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Tue, 8 Feb 2022 13:56:21 -0800 Subject: [PATCH 23/27] bug fix: simplify1PermForDetVars also needs to end a lifetime when its lowned permission contains undetermined vars, not just when the lifetime itself is not determined --- heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs b/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs index 5acb216410..ab631cdc99 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/TypedCrucible.hs @@ -3714,9 +3714,11 @@ simplify1PermForDetVars det_vars x (ValPerm_Conj ps) getPerm x >>>= \new_p -> simplify1PermForDetVars det_vars x new_p --- For permission l:lowned(ps_in -o ps_out) where l is not determined, end l -simplify1PermForDetVars det_vars l (ValPerm_LOwned _ _ _) - | not (NameSet.member l det_vars) +-- For permission l:lowned[ls](ps_in -o ps_out) where l or some free variable in +-- ps_in or ps_out is not determined, end l +simplify1PermForDetVars det_vars l (ValPerm_LOwned _ ps_in ps_out) + | vars <- NameSet.insert l $ freeVars (ps_in,ps_out) + , not $ NameSet.nameSetIsSubsetOf vars det_vars = implEndLifetimeRecM l -- For lowned permission l:lowned[ls](ps_in -o ps_out), end any lifetimes in ls From 3fb946777141e5975d84b73d1c2869a871c8b532 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Tue, 8 Feb 2022 13:57:32 -0800 Subject: [PATCH 24/27] added is_little_endian test case to c_data --- heapster-saw/examples/c_data.bc | Bin 5024 -> 6896 bytes heapster-saw/examples/c_data.c | 12 ++++++++++++ heapster-saw/examples/c_data.saw | 4 ++++ 3 files changed, 16 insertions(+) diff --git a/heapster-saw/examples/c_data.bc b/heapster-saw/examples/c_data.bc index 08e4e2186088fd1584d6aa5a6dd8f6fdb87eb4f2..aa54b529b294a503a896d0df3749943676ba566b 100644 GIT binary patch delta 3771 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 delta 2049 zcmZ`)Z)_V?5}&ubS+AY-X6-n19XH&@c3St(iM7)ftLce#8q-2u;q=1)l&+n&5E>w@ z;o1Vi8{3WCC`C?O=~60?3*j!k77?ffhEGmgLO!&R>RQMLbc6#0LV#L{`*1?K+&qVt zKc^dc-g`6eH?uRp_w;;qZE3mmkIIr-Kyjg(^&?V_|;J}!q`VL{nq z3vC;D#*^NbQ&t967J|=Cc8{p<&0x%76+po`N7^W8WRSsgcR?!28dZS zt!?SXX7RAF05S6x@uc|(fJzfqC2uz0&AD|Dt~PPcz7 zvbW#YD&8NlcfmA)R$v=+#BH$Xd@Z9^I_$=Zo~vXh4TJi%6=XLZ=S$SOAdgLnBorqa zu2Zmc-emd_VqO`avP=+)h%Hgj{#R~_?W3mF$!@^uF|gr?nP>IHWZ#|}R!5@Jx66dm z;@;-OY;|vQHEzuxmGFaZ74X!wJ?u5UU$*S)H=rN+S-Q29Q}P4!S0-QZrIPeb<^IPF z+c(BYc7282Fvo6~*=%G&$(}QNQoYakPW7xx1$%1Sj(c96D}V6gz6A9**SDqIr#vk) z+p6XrzE!DLJS}0icv0S;&fN)c4V$Fgc{j}zIwj81X#n&--m`DVQ|s33=zntGj^x27 zcO5uTolcGW#IHffw%6H!=p8Hs!Hn9kV)SVez!5wg)U9(c1xuyeQO>RxvP>NV%AbY( zh9zN)A$9fK-;SwW5<*)Yne@@Z*;t3KWnAmi1&$0WOF_sCe0JeKc<19k(u@CZ9O_#6 zXpr9z;NvZjF^uq==)7%~f^<5Z8;&G2-1ZBhp1AU96X^V74~w=}-eo~qrw*F1TeM~0 zVWD(l#GU_0z6OjS`n{El{7rkx$dVL|JO$3~l=l8;1iJG?cB_84vL(dD9BHOlK6adnQ@tDNk?B%d#(W9Z zYtTx{Dpu0*04+s(4l0x|iteBX889o`;qpO!ui_f!V*yYc3B*uDKE7;xNOrNAMhLBusdYKQGJp3H^w- zm9J66#X7n!DlWsgo|^DSwo|<07x)s^r*McS!T;fMuex{{Lz3*x!6$rR@@bPhy!hPj z5&>>ShMertN&0NjbBGs@DV}r;T@6$EKQ#pX@tgaSuNbUmo z0fx{=lr|C1l_QFt80@3Ez(jB1dI{=!)SG_t(+^PD c{&PF8(RPZTxZ}m!8-GW%;_k-nH2rVozxUA>vH$=8 diff --git a/heapster-saw/examples/c_data.c b/heapster-saw/examples/c_data.c index 2c6b683f12..627db7f6c6 100644 --- a/heapster-saw/examples/c_data.c +++ b/heapster-saw/examples/c_data.c @@ -1,5 +1,6 @@ #include #include +#include /* Increment the first byte pointed to by a 64-bit word pointer */ void incr_u64_ptr_byte (uint64_t *x) { @@ -31,3 +32,14 @@ void padded_struct_incr_all (padded_struct *p) { p->padded3++; p->padded4++; } + +/* Test endianness by reading the first byte of a word */ +int64_t is_little_endian () { + int64_t x = 1; + int8_t is_le = *(int8_t*)(&x); + return is_le; +} + +int main (int argc, char **argv) { + printf ("Little endian test: %lli\n", is_little_endian()); +} diff --git a/heapster-saw/examples/c_data.saw b/heapster-saw/examples/c_data.saw index fd21846443..468e7c76ae 100644 --- a/heapster-saw/examples/c_data.saw +++ b/heapster-saw/examples/c_data.saw @@ -46,6 +46,10 @@ heapster_typecheck_fun env "alloc_padded_struct" heapster_typecheck_fun env "padded_struct_incr_all" "(). arg0:memblock(W,0,32,padded_struct<>) -o arg0:memblock(W,0,32,padded_struct<>)"; +// is_little_endian +heapster_typecheck_fun env "is_little_endian" + "(). empty -o ret:int64<>"; + /*** *** Export to Coq ***/ From e48cba6d8bd7242465e0c423419079e33ead0766 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Tue, 8 Feb 2022 13:59:02 -0800 Subject: [PATCH 25/27] added more rust_data examples --- heapster-saw/examples/rust_data.bc | Bin 233424 -> 312704 bytes heapster-saw/examples/rust_data.rs | 38 ++++++++++++++++++++++++++++ heapster-saw/examples/rust_data.saw | 16 +++++++++--- 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/heapster-saw/examples/rust_data.bc b/heapster-saw/examples/rust_data.bc index 9c7898dd4a9946017ec57e168b3e87a40d11c9a2..1affdcf4f18f52745d6d0e095696985de84ca242 100644 GIT binary patch literal 312704 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ξ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 Fj_rRKyeRX~=q( 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 literal 233424 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

v`&{x>`i`}s%y zgp-s1Z=TEV`~JV=xs>1hd(-drS9vb)8J>sr{Leg>fB&aE5BKRG_>;dOY#;W2zsa9c zzp%0VA^%*Sh0p(}fBuipp8si{|3f^Z=#TyY|Ji!@`?vi2e}bRGdJ_NqpP4=X^Zxmd zXU{+L&tAM1t$+T_?D-G=`R~l0|7D)b zx|F^8&+=bi|6lX(|CQPM|CN9K@6Vq94PVcHG^^+D`1k+&+55le-~S(H@BiUH<-X(J z<#{*{f671qd$Z@i<)8ok+4ICdM}3;q^XL6@#J?D>D}pa1sk`G3xH zSyz9N=i$2g>;Cz7v*-Vve||T6{oFnj)I{PVv(dmj1c|Lg4epYzZEkJgHzO zs4Vk;>*K>=qx?S#|99#B*8XMff3IWvJaw<7?ybzdl&R`&f47O1sdjDMe=eZ2sbwp`DbY1$Fec{{> zJ@>B?1{J|W?dZaG?Q|d^`t+7Q_{;G+RJnCw#+N4Q~ zCjCVEq+Fj|ZTEbX4NGZz_jq%&+5CKe_j7(2D-Js73N-t>AI#xlv-$L}zm@lbdLHj~ zzj~x^-`c;&N__9qjw1A`VukC>q_Ii6D9zh{FnZPIrs6FT>U2zCv~PcC-2D?yana{Ne4r+3s2~E! ztE#qjl^h>hrJDWCjcFcs`@3WMsye<(Zmat^{TV-fS>4MA{FhmGzvRDfq)NTJJM!(R zF>lJKPF0;(S)1z4PF6yV<$ZOxYrfyzeaFdUzT4ex?E^{_byDauGIB`)HYq)sXVglI*skDxXp6%HM(1t>`zVo_?@kW ze^O1_7?T&J$r{rYZCXp8-l3YRh@!S?v#zdHUDd_AR#U0Sq$-W-JdL_8f5&QC9jB^F zTh>gK$E~X-JzX*WOse;X!~XSV^K$=-*LS9s*(o0O+r9jQDQaq+S8Ry7E^}R%Zl-fv z8|Qhr0)2fv9SL5Sx_iGc@=~ngr{)V7y0G!^acWRi}%=BU(b zMrgM6+Xr)$q3NP9Cd-qgjnlMK%Z18jfB$yNakA%7zNzl-W#=)9BI3J6ZK7Hg$0mMa z;WDnWu8N|fNXy(U=acT9X*sPlr5n?lC`!8At-jTT>!Lz($;&)bby?d}C0$!sM`^1$ z!MiAKv#gDtG-e&?8Zk{ZswnGREzdSxxqr*-syvDFrY_i~wMv?Cf)dVO{gPw%^ETdd zFukf&l|{Nux}+|%JaxNA29z|n_sK5~E$8hU-b>|wDlT*GYR&c-`aZt5yOWkPQ8`<|<-E=-x|sBO!XJKv1+;NEfdq>+xJE~l|F>w@9RJK65`{^poPc9YA` zc1KFDHyeJv+0bwMsN1^(z-=`-o%uDrOjN8A!>aGfGD?iS-|c4%YIg_HQte+=hlgEt z^U1HKZRk{XYHWT*15uUaB?4O8wGlgQ+)zOS?nJrJz}Zp6H*z-=CeGWI<0Y+>nop5t zs@bW$ruocyR&yN{WzM3Xd^vr~1!!L@ORdT#k4>%&ue+PZE(E!WqK^*WJ>HtThhHjx z!9|^_BGsC{;w5iG@iWB71QU`nS*4(P- z&Y1SNZ4Y}{>1?B<;@a1VVt#b6zj-%3zOLjYg;Wr+|Kl`ElPn8*5WJLS5u#^W#YL6s zIu7b$N~HivFocZ1ob7QAFsRp)imH9D&s?)C9| z%1aN`_i`7Sq^wHhtSVNiZrW<{lICN6XXN|UMo!EoF(vE2n@w1LF!wjy2Qm*jD{B*} ztZd?_G48VNI~KfGrpN_dQN>Ns@)3ebWu2)Q73Fu#VgIdsXS-dtk9W;0(|m8`l{BiF zwrCq9I`m&BFT0I%QaEwlmlLGRGtR1{tK%l<7A0aeJp~_?mSZSGpt+GTHE~;3O;)3I zXGs$t$V-Kjcv2WCBhTZmD%-AZ<0$wDONHH@QR=XNsE`wGOed3XlD16Jt}41XYs>Kb zxl{+;zY9c-CPOYSwdqnc>fq*-&37^bz8~@HgA+HlP84f99W_~2sut0;X;%$qm_~yP zA2(ITOd`ltPA0TVLwbQvl5djDpX5u@Uo4Ye7bJVSEBsl@#8=V z%tg0|qAagDBgaL5u`5F@w~se`mNHGF1dY2vBFS?Toc9-NnNO-g0;@RJOxZcF~>vf^2VV2Rdp1crd_Mt?yaWq0Ci@#s+7iHjqmfYv-h>x~N1}LCQ(>wayexmm**_ z1>Hxi4Q}Mc+7Yvg25F**k~m4SYhShL;v~{32GcC-ba|~aChwY-lR;%^T+~G%IW2aE zYpAH3s>qE_bn7h@_GFXSOA!$k)HkHcHd3aEjEa$rrVH&%Ar!?r#U@gADoc_)5Th=% zls9P7h#p1Ovari_Emd)f-d*N#Rz*#o&A!K(?p3DDP)bq#i?&UZ=~sy(Yt`I}fpB}M zUSl;nJjj`@8-#Bp6@>AIFBF^-3@T0*rqAo~DoJzpMv^3*X|$U5@lruV6x4K7?yN29 zw4Cm%O9dP5UzMw_LK1BFY4Xu77DQn#+ZvIsmcrV_hMS|d>;tPK$> zXlXJR{Y!;vDw53LTUo@B z$X3Ctk!lRN%XMi^lB5#JKTGl=4%CCNUrm=`Z>ZR(b!xaeCv|COlvdfy@O~;DE6%Q} zW1(`wL{&chFzc(yD{Q}QRB;TNBF+NwhCZLGCT*&tEIx%)l`GA@Mu$)H>4AH#a8^Wl z%@JZaez=04)-ozO%Sf};be5vrt(wHX+t_=!aofDe6Fz&gu5e~O}!H5km!4MwTXx|-ootfS5 zD~jiJrnps`EREv%4RpPDfymvkWYI}P$ebSTIj6BqaWc~~Uwr)43w~t{VAfAKHx8ru zU@gIBh~N@6v-4+tttS$$Nw8*>b&aPOnKhs8uGRI%9MD*$?PY#qn$9x}|Hx)}rP`_p ztpH5K>L$GXzm2iH#Yn*zLq#T;EX>uF4F`6f8cZfdrMtp3MKoQgtEm>K9r|hdDp)3Q;WT=`pangE@MgxO=IPJFYTSgaTB=C62tw z1QxxUQfZ7X6Tk53&64O0#hL4+QEAOrdH0&|3}a!(9uRX*CgweA$}w!zSVj~!8VsG& z+wQ{XdM{&M%B9S~naAvg>1`raBAT2#tE=?O2&gX$%-UGD`Csv9Z08Y z*o7VhHK6epIihR?Hl&JHPr+D2gY7_bilJMJ$iMn?6fI7+8|RNwE#~p2O>j)$U+bpQ zIG&`tqdNy@YQLO=_Lsp)INCOx-6^Xo4rnyy0$l-FY%nCgKPNf**>uhEXc~U=v<4X>m8l!%bRUPtGAR6FqR;9gx9v`}5Y9huq zDDnVS6RhCDVsr?IK6ZmKD%dt%*HoKnw%tE6EPV-78UpZiP^UI-pWijN$tXWy?pL_&Rk) zYD6yVGn`?KLHr7A;`a4R?mmHpY&J5MC1;#1&U~b0#~p$@Nnz2h^r#Zr7qpv-(z&-E zHHSM6JcMDCp1efu!EGB10FQXA9`8^jn^yv%n|!(km4WMp{oWOc=|;UZ6~BIF-TEq; zNmDYZn~ih)KOCyv184&ISM{(53h=rAX)-`p#NrM-RN!kt49MrSFcdN4CwC8Mi{jl$ zT4tC-HrH7)UK0O5bSb?9`9+^{78OR(6o)puBM>@mpR}8VqMw7Jp8^ni=HB@$JA>3J zZgkTC849iqTSHN`)jjieRGC01K7K0`^SPT8i_dBKdIDZ(K`og!8&`w_%juiy?H)r! zB$oVbb+h|UoZDH2y{p1Q7UvOW!SUl>Dul7W=$g0y+$MU$xRNG?^cSwd_`YhlI6wL( z#hQ!dGR5Mr(67gXZn1P`&yz`?+pbA*cHq5J6^69&Vq2`Bp!rrz;NnCy?G_gr<1Tet zrco5 zzAsakaf&yReT-Kk@R==@Nu{%l6GI4Qwbfo)rNnX6#e7N=ml@u`i(f(yC`()i2xurw8euOq*Df`t zafq5qc4>zt0_1M2VvKlMV6a^(7D`i9R3`w6R0B8&rFxXujiQe zKvlI}7O2j?qy?!?Y|tQW(xk+XhuK<;e&ecebryC<4pwV#u`#tOILBf@miPby(W-+p>Mq1jhmrsDmq8S$5Sh?bReJ zuw`wx1`h@PnK&>JuBv5Jd~n*t8Hy9@SwQx|Zm~nk7ZFBQX4u`e<_)5S{PiVvoc?y4 zY@FE_FKr>ecmQx>X#~F2iOZxMwFJGt7iXr*eqsL}R=A4x-*5Mat+_eMQJb^6b;>%A z>P+JV8tbn&>z`_96VD_PE8rcbItDAVzReCldRiA+ zfq%pbIZA3=ZpTO9bLH3eZ?`;u^5PRYyVdC@QYq#gU{)xvtT+$071{fV^)L)D%BVO^ zn&FZi%_L8(r^Zz!wj#|T8#jT}`^0*h2H+<^KM?W_+J5j&F3eB7|DGj;Hg8(6zfp!` z91z#|QLYv>D77UA2MCQA-`aRjUFtm+Y}q%oEI^Z(00@N?4)|&m&n^|ui5J+KgNU&z z)}@Xc5Zx6&2F{h0<=Lwlnq2`@4@6nuDPLJ07a$r(!FEW2TI*4GTUov>8K5uS)QY0urt_4uE>J<1N~cm9l&<+zUmSZtjMuS7mO?5B zMveVikQ5?lamL54r5s~$lEsCG3Rk_nnzzMaOGkw0Q(dmh)xPgE54A* z8dYMiGcmC~9w_E<%L}noCxLEOm5`gPk7J8iyTG2rwAQfz?c#l(`jC0Rux3qE)SwDV zdw{=BeMyu96-ZNXz?gv?u=;)K14ffactY@L;fQu1_V=oRPkn{p zwW};IvB}^mv!}s|`aZvV*o&m{t$bVieX&7`w@nFR+yJTPR)`QMSN890eINmIao@MZ z^Wea>d-Z+#hsUD?M~4Jh0qd*m>GMAInF4DLe)5uSjM(DF>s&II_Q%V^+fRKg=rD!F z!@)U#nZ_JruY|<`X)_Jm+)iU*F}<^xF&{CuE_e^0Ow-gYCYKV=j|0g$0|6zJ3_}mUoo~2`r#>E(#}8_%?{;RdE>0iwthj8eU~*EecG802{FJ z=$^paM!ocyD4= zv2*Vdo{El8Xq}mjKiYYuF$71FQJ)@qkS|$MP$G&{x8OFhpPgt8u{->Gdvs zz1m0$YAR6;&L3_r?LrLQF8P2X;RFM&h;kv4Jx9Xok%;^-UKUXVda5ZpmO_euCRnSN z`-F+wUxer@;TP1~2slg|VZ24h( z4g>=t56lb^?#0%DPFC!;b<@&f>PNIFjlt2R9sYeqNko@%)b6(uw%=A-L)?Ysu! zT%B^+O3)_A1HxhLZLM7hxfN^Rt?|SV?pCs{5YK$$&=xM9cXuS(%JP@^_+60Z1cJs$ zi8wtwr{rkoqVyH}zdpO!*OiM^pVaGr{gF6Dzc!s!@cdfMa7GiAPvk1X6UY@=PVZZ{ zn|JmR0iodKfajkx9@}@PtbKkuxq|iBYShzl%cmbGh-T+I__d$JF%S!II0a#fh4Wt8ra zCxa9l=?*coslWg_SLfO`0+?58h!zm80{)VnfZ@l54**x>)NZmODJx>jHtxZ6*OY?Kt9L_ z`j93JCD3JH#H!GMeZ-dj5G`noz`LV>;EIg+N!2v~vCt=+??g{bJgX<^+;>2Ihc&21 zAr?PV=gvFV#2Km|tD-S!!k1=U@uGaq6e^i0bpnqtH6$v;4st5tSu}3lhOBARZ=#Z~ zi9>Hajhp*x>Dx(TMYBEFmzg!yXpPqaml3e9!bRcf57bOMHj`nV2I~Ul0#QWRZS5Ht zHsde_@VZPf1*c2Qf*X*`VRt&%J6c5+`+@_|BH3UZA|xe->84YFy-w%tgS7;%1FFNQ zEE!sk{qsYP$=NczyOnEDbfmT+78Ji?99ygWY(Z=BL~p*EuE}fhu@XWW1-Ba%i`?G11J_Q$`o1% z*qoq9ldtr_S{Y9tbUG~-2E5;pW;we=?nK1?_!ZF1iUlsHA@B=w57-}M-jKQM&umy| zwK|+^NbrRJd#GgYWG>f`TQr-^*QfA@(`mc5n-qEoDlhyb8Y85;ou99@f|vw==n3v8 zv>>OqJzr}rTsR%y4B53Krq7yDp070_KE$A^iNM1k=p13s*IEblN8S*=1T4HvGkah> zV{53C2Iim|upvi>m7zamYqKK?t3XTeGdMkfzln=Ld&cI#YQmfco0&k3iD9xQ$OqhU zv(afRp?DCZ3=|6i+g8YU#?cijsUvt54O(JSme#)foXzDJ;{kh>Ky3*9f9}a-fe@gL z0)R6hZXBBW8Ak{65K(@h{UYK4j58BIXLIP>M6y9Z7Zsp$pL^f6#HE6B$uyu=u&C}T zeZGx=Ybk+tAp_;*u**9p0PP}F6cvziGa~3nHLzGUM;dr zjjb4I0iOmpdG-3Ggdq*Ct~2+zXmh8^9X!HBDZ$}{KS~^y_V}78kG+0-&MJ0-LJ@vj z3W;PQ|MgfDSl>Wk5$q6))v2;VzDFo~(UIYZi^dM=m&S8Ydtb?u28C*bu?Daz;1ZUI zJw}R&sc)^acNQnjz$SR;M4-$i#6kr6NF=7rqi@m)Uh=1f=xsJ&^fsIA)a$bp^oPHijC;9uR)i&)YD7jvV7=R>1oNe%hWB zr8_5rhWo2TZ0#3rlBaAZEY7T}9F$7c0QR<`s&CkCr-6ulvk8dUH=9LT_0!L9i(8}h zm*!h*uoNp92O}z5+`>8%LA3vz^Kk;<6t@8<~4!?3#LsKR}bdKe-T$Y^X9k6Tvue=slB%o~an(e3xDDr8pU*u)ar3m711JfQcJ(Z;Aus+MN z$lBx(keC~yiiH9di-f};Jh7ImNB|+>Y%wpQ%cfA)S_S1px50J7PzZ|Vz)6h5%T3!T zZ{=)~&mbow$OqsXQHP{~yWa{p!Ry=sD*N~mo?;siXx9YMxDw4>S4V*t5iLkHniLth z;G2j%8E`~cP47xI7YUbeTEWR_8JYo##qP`)R!*|iEl({1)t~TI3$HQEgbu=br6+0c z)rtXa5l(`CQIoRB-4d4@9sE@-{t#l22*%=SEu5$4O0$AdgD{KPqpzShSQo561l%>V zH$quc7z?|&Bpw5%aDa#Qc)i?fDeN4D5Cn;-8zroTF3dR!XWb@b`KEci5ipr&Kp)Fl#O67@F#?Di+k}wziAV zGMPw_DXs=2r>204WTEkEwOrk)pnTzc5wm&0ZgMQw*L#}6le}#n4mU$Wj3R-kzDApl zESr%#f2SX3p|9{rTEsCQN#13JB=GffFp?qx8kgMZ@~f!710c4(Tv=7L0%E zW)_AQ>19Yd46Ou!8U!C$T~S_^7WBff=M`P;FGyDc)>GlECiKynv#!s|)0+_=G&m!| zgt(HNB7eOZ(OO$3MUoE@$iJ73&aun{6IB4&I}uDv`(|NYa^dm;rVK3t8wyqdL8)4h zyN-WNxN+ZsbkmM3R`E_MeIjUr~fTIA~0kDn}p>x4(S0_G| zL<& z)6YES10&f`7Zv!DNfZK0=aP`IP@FT>QNz@b@8IAe-wOCk$YEA}dx`6%_|=64C9q)p zu+$5Uj6+df{U-T%NwSv6?FG*m_asp{>rUVR8VOfCaU@(jq+=pL-C1O=Eylk5)zOs^ zsCGbB6)HJ^h;CSOSsp;#6sMD+Lwj0og>pEatiM#(X3S} zfkO-92+JzhZZFW4gxPQd6KB{GYvwo=rmHk89NQ>r%aP=+FjAEP?h@JzAh?dB=6q=a z7xET!f7wdss#O0FQ z_VO**Q#&17Ouk#0R6*{KwF{v_#r(3)fGRk5>DfW1GDCb&Vrns32!A6=0g(u&UCOxfk;TEALa0kLIi&eS5<+(~eG|vJf0a}MJ3%v(`GnM1 zV5>C#b}Y5i_nGT%dnCP(jekJ1D$qeW07#}deNmRAP`jZ0phR-}y`)>&{!raK+RQeHA>?zE%!CjY z;Io-_DUK%Z+w89gk%9o(U@olytr6~yI5;h)^w`FhInTsPbWv|w1=^p78o1SxW5&Ny+~{aZ?T$BVji?I3`}zh2*){SF))2zJQ)X; zo|GAztHdV_yP3$y?4#M7xN+?`frd|pNs4eob6UkA6^5Txd z@e3^1A{&Al<E3F`?a9Uol7(Fk2Q5z5KQsj)OT zdzMV9LymzI{uP-i;E+uVY*Z<9{_~|$Fd7GC2nR%NZ7kN%=@2DN>blv0luUsPKbQi{ zh6*&BWCP=R^ET9RD&rn_sq>e?6E08~2Xz z0jL*R1g{(p4aAo28Wssj8fQ(F&}5;&*hG;r(hB+m%x35SSQ_UOQWJS6(h;rQ7-0Dv zO+wua0|Ue(lAdgKxTtvcII0tS5L@C4J`i3EOPGpat^6 zjtk**?Vb%@13U{kNd5*iI}zIT6Lrk&d(dvdu_AL zDkV4d~{(~{c4351z*+y|A)bRcS+IEoj817YUITo3;hbRrP1+Zpz(H!G?Gw6t!M#PKm-}FCR~fF zfdF|~Sr{GKazKZ~k*(MM+u597?JWT!OIHk025X(DrB+dXS|IV+p(!pZaLCB;O) zC(!*j_tCBxYU5dR|JFU5|3Vb~>2LZbB^0#$bbr9+0;B*?m8>jl6F9Kf#9>?#)&LDO zw-f}tP>9Q9y9^K%wfU1BLS^6`abO9%sJ@W&ouyZscrU@3v;vCJ|C@SJ5Fz=vyX_9BxZVPnBS2x4jZyxT! zNB8^ck;JX1TaIPx&+nl9Awl=KQ}Ki_AjR#9ZxEdwR(^0w!-&Vt>wenu4cR`HqZ_vz z=A-i-79h=|ew3J;dNlnpT4pf$wKpldIK} zVfi*Z-_=n4z~llcm}fQV4`jX)^v0MO$+f|L>;T!=sdHQV!f;O(2igW9oTR%V=b}RN zk!s{(%CRLh=6J-Tytn4f9NZKMjtR~oRUy21^5WF!%f)MP6bO9KaU$pS-KMt?0$9%j zyr6hu9kKDWv{IikfxCJq_bJ513q#gq&?HC>9%?L|1W25AVNyvsd=T3Kl1XCrMj7U8 zTrv}@kvxXJkKQg)F{1%?act5&DZOoS;;owaA&%g(cg+AxNk{|FX@;GE%%9-S+@ak~-XVN#pnFe6tUh#GtSpD*K-P{d3*fDjpo{vkz-T^n+S%>FDu>vrZw%+HZ(GH@A^W&&?h zkTpZvTrN9e?~&(`MQTXth?j4}r0ob(6)Q{z$__5lgDL=Cc zu!(alZFTx%a%kO{AKzBZ{`f{kn|$L$J+bs}uzPe+%)I(>^WEbn+Oi;sZw(18E{2ZS z6~5WncfLV1gGtuhS%khs#k|Bu=WY&K zvdD07(J2+i$HR-X+4RhGo6S5I-sxF;613yGW$SSqd7I5FRjZ9IpnH8hkED#ldkF{= zUp~g4e?YoLJW~TofJ6@*ajd9w-8whQ6V>L@R9%>I|1ta7B32Wa6-IFK4JkPPZMPDq zv@KAV;@{hBKDx6M2KmF=d(>{((=i%a!oiKi3rADyYvFc)F>DO?v0DCGC@juCT-LCT ziG&JgmFw6<6H+R`=gZMulLH#DmP-z!m83RdK~9yYNs(B6Ro(5Hud27=@s#y$Q&f4I zBQ{a!dN~&HDX3f`>*Nr27pL1aC!d5fNaC0{d1O&~K^4fgWHmq`Bl-)k)w|XMwI)OW z;3+V@2r2A4*8^*v;AP+rP9y8^ez$Sq;3L@v-nE1r+Hs5WB=tCXc(QW**)u1QWrjjh z#)d0_R0QAvkQ{1pxk+`-?lF^7e1$v(xCEodo*RarWX?-&WcQr)KlFeD7A4pA@F z;mmG*ru9htk{Z@;;jqK+@~%~Kp0r!r2l@%=4jGQ{NlV;5`lG8@$1r}vhzk0P3tgt_q!b+Cq^IR{5&81QrF^7KJkxwV$Z|*;h4{nu`n1yI zzRNlgMg>M{2^f4zX`~&BH>9l*wyNAO!?isJ5&-{yl%t-D+0>mftH+JE1*sjg3noA^ zz9CvarRT7;Vo||X4uKR(*O@t|Gxx&62_O+K8Qyg^uJC$}Z6zGa`Xy)a=WVvb5(;F8?Flc${Qbt974G#%ng%hL0piuK` zMnq~R5(BUYI>@c?8cqA)t6$XFZS`MO2SK-f;sQ2jmW|j#wn$75-xMIF4p>|z2^hms z`WD==HM4DmEu0-kY`v?nw&r*X@M_{vI+-QSe7j_WnAnJ@wmofhRG>TLzTwAnV9M@(Y))3Lcqf;*6DR|}vC3%G`90V@Kw`M3_}R1vm-1xgU@jgn=?FA*Mg}eT zih<7v&q+8zw(<+sFni-qDj$}mj0KlGiZCduB-28SFUG2{`m&$?qve(SK|F7WunmEV z_(qXq$*vNVz#1xkP6Iuwj~QW4Nq%?OBS~VYMQ0tV=jHVH+NP-?-zJe*B@Cyi@EGNm z-@^2RkeZTR6uw^Q1()CAs}V@Xu~jOVcEkg@)FPIlQs?C2VXx>`%#2HK8FI;j?(Rq) zR1@7Cepu{dKt^_`lw{dBQNp@3d(}r-l9man6J|>G1Ed|(_dqMbl1YjK z0Zc(tF8uU_WugN63tcXbgl2;m!M@=ofuOSiACU-NYG_%Uj4@ix?|=&XR=&B*R{MC@ zyfTC0y9h@8mmZ2Z2!ti;@9M4xpHxfX8Xr)~9#BSJt<8`$tzl!`& z&>zXbh*LevAW9d^;S;ODcFeqzLL28_(KJXdIAg=RKpdTC$26Z=gR~~hLfCPD8wu`x zU3bQMj*o;{AlN{11C=I8A6kv0WNkee4&Qrm!jPp?Kz~$)rYKHq{vx&!_UzSF_2$xX z-QX7j^H>pu2c8+r-aA$0CR~$H7(ir~unYiAh378nM$vIvSRdf0cfYuUX;55&tQ>nr zH4sH%zy>8sj=EanL5DfUBm(*r?vya(DZ&IPnRyBE1Uo+wf0o}bBPbt8oJIUd0UGC8 z{ai0N7-29$p@mX7Jed~jCyoSB6tD)IhJ@0F7r^5CB#VLU9=2itd5KZsnp%Dz!!|<@ z7<>z#z}5a|xYa??l3RqNImG8&8!u-EX<|xb8pNSgk|kZ9f3k&xhk|dNAs`2bm(ODV z5y{}@FM$LSdjbscTK(9w6M-~v1Z3nny4oMoDUgQ(t^vTWAUDG^bg@6&QP|u`-$`;o z4gcV*Kcz?#3+f+YC@H)E8^VBYv-nPC=}akc4W`&v$UaC|g4mGPl*$R&Y!Okw0kh7_ z`H0T6Rl(}cod&X$=%zfIf0uKm$gU_^L^&;i8w&+;*uyxo#!^QhPm~XE>BECuT;$Zj zRLiUjsu7sbtXQ%ziQXWfk`%xn^r_?x0fIQ|W_+O}k_`Gjs(VI=Cwx%r+ibX@70$8> z$+6+5CzM3*##4a+2;LCO+xn7ihQjYsepGp+XP-V!mnPOnDR)&)s!7a^1(GZQSF=X5 zrOE9j3SdhK7+ge(5{CwWgURq=^Klfgp`!C+Q5%yhT_C zWMFjz$u;osGc8ISCRtxGcft&k2?>3;&ia0#xRKVTL^%P$4I$6;tsw?nK8&)>H2CRVe3*7$|8Pg@#Yyi|b z7C-oZB zSV`C|frIPIJH7;oSpY51oyKJdZ`6~^=VXiJ;%zc0r%x`ZOY`UX8j#c*Rf&I^wbw0fAxZ2S@WHv@R-@4(V8&7V39<^0TeSklGayyA{7Irl~5VdB~*yH z`E0ALuJ|HXNDk7L2tZ&1L^2f&(A*wyvveb)ib0mur;F()TUyx*f&ITjLvoroRB9tyeF>Z*DVXHE`_Ea506+X^!O z>hk>!*n#bO1tJ z!33c>)zHsHNm&0;iWcwQ4Q2z82OuASiIorXW8mJjbB2#lN2dMMfmWP5d6+94loRf#oFT z3zI*L9J4k3q@GG7us_b^3?i_hXfm?3pm_vc#p8W0S0ThqsfY?#Uof+Wi_)Pn$c~~^ zkR8Pd+m_1Yd-GP*S^V+DAEH@ml1Y*8W^8w?A^Vvn43!hqW;$4?1rq^55U@c&(;D~a z1+liDuLX`AciTiH-Q;4;&>RS0vJgq{ogNC8kAMk?Xt8iFWHJmr9BK_zYM@4EUB2XH z6ujPMBg2{c8J(fqHYeAggk{5|0IMKMurQtUTiw2)-E??(9+5f}futiN+a$?q(2{T) zhehzq$LjG81(bZM5+WVmJ;3saE|c94fgqg7K|ui+WENjQRM9j;rp)YS;}8ga@+$e) zj3Y2~TDc-8B&P!|#=6Vy9)t-BS5gA)G+8PjGt83U=CGtHzrTIzX>vhr5tQRfxt>tPK} z+R_ect>XKt6|8OFsF;Z{h7uk{e0&jZ>&4=ZZg0|U!kI{ff)$3W9@yl9UA9<5K?hnf zu#4-`z*1oo-w^mw5=$57L?noN_wp#vIfeCa?8aoL6j&+9$5nw*29zpsU;VCJ>X83r z(A|lTyCn#jc@#M6nnHCM6L2i474Uq79=fHLQtKHc-~}r~-dGVa_9!_7 zgxGLc^Q*d-SvA%jO_DQBwgVBu1eLW&J&3?%c&x0c(&v>&BW5c>6@w-V8C$qe*VNK8 zoV6{hT#_-70)zZt;htVo&8TYO8G@h#m`{vf1pMcGqI}+j;X4K*#o3Gn;qsn+_X$Hf zU{g$%Aj?R62}&f;D74EXrm|TYHWlr^7nUV+bCgd47#|z9!vCbZ43te_K`DrNvaXWXh1#NRK}vlXO1Flw9!0%I^A z;$(`r8OrcJIakSm!Qu8{?8Mceg-n#Xb0stT1(oqj2z>Tty39)K!BVlaR-+QZqK6we&`6)yBjTlzt;F~asv7pt zckWR`=sXD*aDjl;g0N&=MX?QZ#t>jy5X+M9MuRSUN?Ax%*mxCQ2VC!n4(rNd6BnZi z>sTN!F>xHQOateL17YmaOy)vuK)|1D1WCdPStJs_u&0C@;lei!Dq!ov&Z7uy%-}=_ zee^4PfU^-5h0u50PiXbQZLqR}4w?ku8ALxqP-AnJ_NNfGjf2Z3lMvEm!`)Q8y}gxF z__*UDWCF<4D*KpJ803a&VEs^evT6q;0Vw^u?j- zr7VzdXpFHt2D^Hxcq+w#?V4ZpvHG&@~~O>?$dLFMTkU*$h!zr zE6Pi3$}o9g`(hZRN-~6CtqT>8v;Fszr&B?Eb9syShE`C=q^1sxIZNd;8NamuICKCS zH9)~FnYLl!YS=CC@WQJ$-$=yNTJ^u8Nvw|(_)bF8tXoCY zmOkt(Vi^l%C##`jDY|>)eJVsQ0&YtR&Vra!;9Yhq->1SPBG?&LCy>inlRP5)eJTXc zlSlYj@SEZJ_89#4s<1%C$VC(f%*OxUd&q?#&B>8cV%I^5S^bqizkAq=g88j{Vf&Ra zXbK)v3ECa{C?YXH_6f@u7sZMppREv}B5~P(iiuIeTkJOO`&5WKr3B%JoG9e#l5OEV zduWJw2MyA}$ebb9_#r!w&!wI6^6>UkOk0y_EQAVNv`VHD)>1IYkhVi+(6HxSM;(*Z zEFR8B!--xsNjVk-Lhzk@bRsSvcx#}4!s&{0)170^enRBr!PDXl3Y~9i9?KW%aFmiY z5XSbAsTN)}LhyhI8JnG1X4%%25R$CoUmBlPkAgF0pEW5M6~cu;_1jb$m&zt{5_Tx# zF%xNx?Gcn=e{!8`I(OzQhv~DbvD}#*H$?`&0Xe~7S@rwuOch>n2aDS3f{+E!LE!)W z`F5tvs9%HHN2HFTD2{GgosJSw)0dqN9Jz*g6wNhMH~LUrJ6nC@L)A~SFBVi5BPy@MFwD8&6( z)nM0ZA$P_ya?*@1Dp4MA7j=*>W|`rt@%z!%CVP*IlNi(nlG6-+hf>UFleU(M=eD>Q z;|8z;AA`6<#5W+fTyKQihEuUnNzvEA#1NPZ8ouP5Ae|GI&9LYyLlT3L{f-z<)(lQ^ zB3v4h1$zXVp9otMezfL$J-i<|v?!ojVih?}PFlwGC)4(ngKB1M3J)yM^TMmkRFn7z zuVc`h=6u78q1`Ea&g}|4FPM5zn1rK42^r4Rv;x`t)F@MeLc*Jvm=Iw&DT6k1`GhiY z%C6^apQoy8DzpjI7!q!Rn-6!uP$c`hdObN_PmV~5CWYD;&oT@#VC$9|F2h=U>Qho@ zagY!zwLgfz0b6%XfOLjv1Cgh~w7S1$al;|R&25>;EABzYW<1GSR zXH4uu$AU=l0ELV8@)tx)kZ449>vtpoW-UP5z+$zgPGDWj3v+QTq|M{uUReB-{xV4p04?%6v&ZguW^RP94vGjXvv9gi!$6EP&M0s5a3KJek z>^ZH?*S2o0CLmUrCc-6vJG1K{b`h%IwI43^(+qJg{)Gr5keK5pQpUv(X3Jk)RwQu| z#~PGE&~KmsKB;%tYj3NhfI`&ZhDHWm{ax4f9RLWtCfFzuQHG50REY zWYRvMF@^HX#d){kz4nlUlZ=2^qMV>mBAM{&xea8#n$#?uTqLcipi@fRJ^nPlN2d{- zPYV1HXHxfXE*!0T1bKGfBlije_xx<>V$sHX86D1Bp^Ol z@?H3w{Cz8TUzQz3$SVLoFhZ(?N}_V=%=^|J%ADLycpTAX2&V^JWcP%2>fPrSF*H%R z1Z%R{^!S@~i9*Rfj4KibE;42!&AaRP!!|)04V-A))Nv~b$=&Mvuub5fB6dXLmx0ys z_cKfsP)jVKgbONcu`r&7P51?91-r+V#A1tQ@W+NAC0ECiLyva!33dxLz{%OZg z9=XDE=YF2}qHD&liV(<=LLrg+I*sS`|wso|3$6p|AP=cVy0DZ^lgVpEZoN_$38n3xEniJ|`K6p*upsrz6}fhK7< zVo2TBkpogWn2Qc)?>(Aw)(`I$WgCei1xqD>!Gg>@&cy#rZDIXZEfH!YoFvJs_mSof zWBb%&C)iF)nbFZlAipL7A=E{1COgZnZ|dX#@~2CWvp%=j7Y-q?y5v71Nd-1WqORSS z`e4nB2N9Z|7JCF-(hj=|`}vwHh@Ai_PvQ;2zyN;Q z^WyoMBQpbxxoM49+YyuKtS-;joG?XVkJZEvVoCJgwdZTDgYqPAh`9o^UXp|2nI}`y zf0K)cv{?~;ZjWjGkfWQOjMxua;<>>Jf<{h!?A$Z92W%9IL8#sY08QA{2cOQ__%t?D z9Fq}T#fBhsCwM&L_(+gZljB-LL5-nX(j_A3JZF34@PWH4Ey4D{Z1C*!$toe@9PI#q z0?DbIEb@%wgMEnzMev3Z0Sm@kn4hyfG;;#*Am}5jaO(BjXKb$}wiZlHMy@uDIjO%} zKj2L?+YdOY5@;pJDg%bS^a1qGI6gt@Kq>;S7+LlJ-97hyKqrH9)tCr;f0FewgwrZT z>aVdfBS2uW7P-wlk<&40xJS;RP>^fj(fv~Vn+<{U!yv`HF z*R!~7hBm=xCxWalAypzINy13&RQfiZI3|B?t3yM8o#bKIY_}HIbUL#6i#`0w>TWp9 z?7xu!F&-mn5{*E}E&1C0FrAbRQ}kvNkWX(mPG1CxIS7epnq*x!C5M1ZHC)J^HfkGq?8oL9KV zcX|o@}O@K5AO-vb+7|4?m70!wgjP^*pg|SXhObhb!XO9)cuxLduVY2_!?!1$a zdcg)%0x*vWkpdMd@6=5A!cij<5IF(7_^GvaY01R>Pas5!B0R=3~WvKRZB(ctivsq^e++5dhr$yW@1e z|a(I@V3UYkofc zh?1Y`(H>(yBOo-xRhIRr9t};m;8LKZzzgLw4O}UM zoZLV+NVHKUnNOVGb1btq=?2+c3<1%?5R2Wy^Nl{Snya3FVJB^|MxyPK zD9|OG8`Pu8K7v2LiAX^L<%LrPuhesqSPG{XRHc^E8Z4S*bHx^Mr9#iaB4#K!3WWq3 zhQ`h*H&=?LqEIjnh(?i2$U{mNl#BqnHO&rUa*H#C_$Y$KxNZyYD7wRe)@9z6&!x94kxBU#sToz6D_nqm5YH3$~W02EX3d6jteN^KiHsn7s?q9m05sx+~ zCc>Avsl3jAeMyLV+cGaU)${RYFT0+jnn@W39{EXKS9?vG38=+k#1+R1PkgF@P>0f&k3ph3I^+-SyJ4 z&M7VFwrUax5)@Lv>$q~hd-jH?qHqOsBeW%GGArj$yTp{VPRJBAqwG#lI$-V`PU>pk zwcDPQC$m#W9#x?3&{vUIeciN6EU_fSK(vBh2tN^UN8p|i-#n@O)fEO~vY-jE^$SIg z2Wnj%T|TDmWKoe+4Qe&6Phy2up2-0a6Q+IQTDXhIe?@$~H{)Ep&iV?j4zP?s)dS?J z(BVN^th{{+!RGgi7kM6XEI0`PX~B8B?gNx0cC8K3)4$>yLQMt96If-kd5{ih=|YLs zqWNW#k$7rJ z(6a&P*=JyV?o~t@@aC13K`4y34TVfN>p|kec)!q{g~FX97A33;hbz&yRVo2ZOJfNO zE7x+*o?H_7!{tmoB&l>!)~+-i+xTzG1?BEG62*Zc6Cx0xzn+0-y57Ua3F5O>cj1z< z3B+lrtz7X&ZIA(1>7{4ZAoXUhJLq;U`1UJ52! zz#Z|Jjkhwh5<1SG?wTOghVWKD)%;y+#6Xi z3*5ck^3W0mumC|QlR2$vi7jWvJLm7T;gc$8{Nj2mpm9WAXHycPD1egx!(oF9}|!TR=4V<`76jLjd{1n!#}q z$akYKkuppPY(((I<5^nTG{RTucZpCWLU%x}5a`ul401DIlVnRm+gwPP_EzB|s1gJN z?hVa?CLVnDCee2Ln=Pw^E(qB$G!mp7AmkA~pV_PU?ftuCW7tWE1vzC%NCuEgp70*%5-Y2?Id**?lNODU;?AJueRX2||cMzfqDK;fhB+Lu=fo8pmqe%gq zocAEI5_ldguN62s0``#`XXTV0TiJ5Z|0OwkAv7o%W{t6uz3q9;$Iivcyv*2~A(YRg z$drVB#n3O#o6Dq|uS97bM#kzRO0E%RZc@7U=l3vsoIKMaV`JRXIH#nOShNvt=8Y9$ zOT*}7Bjpl|hlY-6!z%@2d)aBJvB@01^e7_X83!-n?EbPD3agaPcKgS}I6Qc=;L0LB zwnE1zh3u@8v6_|`o6`8$$z4wo=m=R@vw|uQ+8G9?IT?f&9*i1j!d{3O`bUt`*g02d zY_Jl?H@t2lQ?sw;6XV9V<6Ig(9kwkZBaxe+A|Z}oJ{xXqV~MdTmI=AkbXJJd7LjQ_ zHZ4nW+l@t8m748d7UW5VEgN#q#T_8UqFFhN3^3ajT$ivoz?d^{OOa;mL89M)7}5-| z2EZwVKc?hDfxmP1dK`W8XruFm=IS)uTD;KamgBS28mTlhj$6s+1z*s~@*NAQtS>dTn1S(yoEGnN0yL_IQTWhbI-6Aj6G}KHb@~XAwH30kQ5jU9zK8s zqM*Uf=gbS4Lrny|c}bB^D6zUL!eNQ{iXhyGH)VbVspMwI3EG=#=tzy1HO9!nY_d>% z=Bu&qrG5VuAb#Gh;4Fpml~WyE2spre;vQJW5>`?FRuHbaR3UwQr$DGE<+>5r9m{lY--2A{%@$7xXH10Sq7E!IR>CBtZvZ~_9PMi}JL~TIQs)%#02v+b&_i~?*@03V2Hv%6YHB8%P^960dX)`W~ z(}jFC+73i7IC@So?7<{+bsIKwaVkL*D>kgn^(*iS_OI+c+ zQES4>xHO3Mw@VD`MOzL4l{m6B+kZQo_N%=mgk%+qY0F>(6vfsl+fNIHK07?cB?d$q zv7gM-2xXsaZ*G3L-8>=)ZN#p=>2rr}pjmUjGjDM8J#2Pr81*;?H+~k5DATAtEyf&% zEy?I?z3?7jMA+O%yJD=6ht2(4_weL5VltThs-J9Gqvfaj12!CR4S>94nOXC~fxRd0 z>XHBqxU;#$AS;G}-Ojp8szF(s_u7GV24WS5*|00@3(3CvGh+H=0nU=8`|UxP2PZsk zT;ljj`?r+s_8XVLh+p_Tv&A)1i@)|zBl)3R6k_N`QOxo<)O4m}HGl)^1B$xiLZ zo-pcckpoOj5yw`=0|H5^(57 z7AEO@3(J!(@2B7Qvz+W`o;+p4$N!ag}1&h>A0K@@OElQ$Lt zkvo&n;<0z)cM**?@x0GnwY#zQT5^0sK7}JE!Q_oG-uF+C*vF%ZH}@PQx5w}64fZvA za5*3<;{3`!;R_}-81gJU<@nlU#@tn4$LcA>q-M|aWFM;nuCNw?*1gn+u!6sc!M!xC z2Dk#h(X1|CvF8Ho+wpW?V-o`z2h?cyRU`LMe_HdwAce+^NhTAvXb1Gi&7s@w7e;-u zQqWU~MkUP{IWQGMlC4K>t{k&OV~$7M+Iwq2%>i|hmzu~T@_14yaRc275Z_X>p}KWg>U=PA*;Oo)?C#Np4E0A0*zGQVHx>=)|O! za`-Z~3nci&z>Z4Ip}A;{RwGvq-5>pIB+*8N?BduUGnKvRbK)io9T)KtAo;FwJ_1@! z8tzNP3pm-p4U3{?w^#G<@M~^bZC9*p`01VJQ}DPQ3SBd~<#5)KvygOWPD~gsyYVve zg`6UbTq;KsvIX%=7kq+-qW%FZQ2(|`}ec{^-SKz zU9uq^on$y5GYQ1&9SPgEz$QJ@40Uc2H#h|i8^-MCcBm`wdql`k|6ZOCKaKAV_2+$kW&c^q{&!_xu#|UJ u&E?R|qOXK>A${{j-xQSR!!t_wLGMnCfZ`~LuS4Fewl diff --git a/heapster-saw/examples/rust_data.rs b/heapster-saw/examples/rust_data.rs index d21c896716..479e45be2a 100644 --- a/heapster-saw/examples/rust_data.rs +++ b/heapster-saw/examples/rust_data.rs @@ -47,6 +47,10 @@ pub extern fn mk_two_values_extern (x1:u32,x2:u32) -> TwoValues { TwoValues(x1,x2) } +pub fn mk_two_values_opt (x1:u32,x2:u32) -> Option { + Some(TwoValues(x1,x2)) +} + pub fn two_values_proj1 (x:TwoValues) -> u32 { match x { TwoValues(x1,_) => x1 @@ -122,6 +126,10 @@ pub extern fn mk_five_values_extern (x1:u32,x2:u32,x3:u32,x4:u32,x5:u32) FiveValues(x1,x2,x3,x4,x5) } +pub fn mk_five_values_opt (x1:u32,x2:u32,x3:u32,x4:u32,x5:u32) -> Option { + Some(FiveValues(x1,x2,x3,x4,x5)) +} + pub fn proj_five_values (i:u64, fvs:FiveValues) -> u32 { match fvs { FiveValues(x0,x1,x2,x3,x4) => @@ -363,6 +371,36 @@ pub fn list64_is_empty (l: &List64) -> bool { } } +/* Sum the elements of a List64 */ +pub fn list64_sum(l:&List64) -> u64 { + match l { + List64::Nil64 => 0, + List64::Cons64 (x,rest) => x + list64_sum (rest), + } +} + +/* Build a HashMap with a String key already mapped to a list */ +pub fn hash_map_for_string_and_list64 (str:String, + l:List64) -> HashMap { + let mut map = HashMap::new(); + map.insert (str, l); + return map; +} + +pub fn opt_hash_map_for_string_and_list64 (str:String, + l:List64) -> Option> { + Some(hash_map_for_string_and_list64 (str,l)) +} + +/* Sum the List64s in a HashMap */ +pub fn sum_hash_map_string_list64 (map:&HashMap) -> u64 { + let mut ret:u64 = 0; + for (_,l) in map.iter() { + ret += list64_sum (l); + } + return ret; +} + /* Insert a mapping into m from the greatest of x and y to the other */ pub fn hash_map_insert_gt_to_le (m: &mut HashMap, x:u64, y:u64) -> () { if x > y { diff --git a/heapster-saw/examples/rust_data.saw b/heapster-saw/examples/rust_data.saw index 7d8d6d2b7d..f46daeec13 100644 --- a/heapster-saw/examples/rust_data.saw +++ b/heapster-saw/examples/rust_data.saw @@ -302,8 +302,11 @@ heapster_assume_fun_rename_prim env panicking_panic_sym "panicking_panic" // HashMap::insert // FIXME: we currently pretend this always returns None -hashmap_u64_u64_insert_sym <- heapster_find_symbol env - "std11collections4hash3map24HashMap$LT$K$C$V$C$S$GT$6insert"; +hashmap_u64_u64_insert_sym <- heapster_find_symbol_with_type env + "std11collections4hash3map24HashMap$LT$K$C$V$C$S$GT$6insert" + "{ i64,\ +\ i64 }(%\"std::collections::hash::map::HashMap\"*,\ +\ i64, i64)"; heapster_assume_fun_rename_prim env hashmap_u64_u64_insert_sym "hashmap_u64_u64_insert" "<'a> fn (&'a mut HashMap,u64,u64) -> Option"; //heapster_assume_fun_rename env hashmap_u64_u64_insert_sym "hashmap_u64_u64_insert" @@ -317,6 +320,13 @@ heapster_assume_fun_rename_prim env hashmap_u64_u64_insert_sym "hashmap_u64_u64_ // \ (Cons (Vec 64 Bool * Vec 64 Bool) (k,v) h, ())), \ // \ Left #() (Vec 64 Bool) (), ())"; +hashmap_String_List64_insert_sym <- heapster_find_symbol_with_type env + "std11collections4hash3map24HashMap$LT$K$C$V$C$S$GT$6insert" + "void(%\"core::option::Option\"*,\ +\ %\"std::collections::hash::map::HashMap\"*,\ +\ %\"alloc::string::String\"*, %List64*)"; +// FIXME: assume hashmap_String_List64_insert_sym + // String::deref string_deref <- heapster_find_trait_method_symbol env "core::ops::deref::Deref::deref"; @@ -447,11 +457,9 @@ heapster_typecheck_fun_rename env mk_proj0_five_values_sym "mk_proj0_five_values "<> fn (x1:u32,x2:u32,x3:u32,x4:u32,x5:u32) -> u32"; // ref_sum -//heapster_set_debug_level env 1; ref_sum_sym <- heapster_find_symbol env "7ref_sum"; heapster_typecheck_fun_rename env ref_sum_sym "ref_sum" "<'a,'b> fn (x:&'a u64, y:&'a u64) -> u64"; -//heapster_set_debug_level env 0; // double_dup_ref double_dup_ref_sym <- heapster_find_symbol env "14double_dup_ref"; From f8feab940d097cbc231696a2f15222fa013f0458 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Tue, 8 Feb 2022 16:39:38 -0800 Subject: [PATCH 26/27] fixes for the rust_data example: fixed the definition of the List20 type; and added an assumption for the clone method for Box> --- heapster-saw/examples/rust_data.saw | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/heapster-saw/examples/rust_data.saw b/heapster-saw/examples/rust_data.saw index f46daeec13..cdc8b4a48d 100644 --- a/heapster-saw/examples/rust_data.saw +++ b/heapster-saw/examples/rust_data.saw @@ -137,7 +137,7 @@ heapster_define_rust_type env // List20 type heapster_define_rust_type env "pub enum List20 { \ - \ List20_Head(X,Box>), List20_0(X,Box>), \ + \ List20Head(X), List20_0(X,Box>), \ \ List20_1(X,Box>), List20_2(X,Box>), \ \ List20_3(X,Box>), List20_4(X,Box>), \ \ List20_5(X,Box>), List20_6(X,Box>), \ @@ -250,6 +250,13 @@ heapster_assume_fun env "llvm.memcpy.p0i8.p0i8.i64" \ arg0:[l1]memblock(W,0,len,eqsh(len,b)), arg1:[l2]memblock(rw,0,len,eqsh(len,b))" "\\ (X:sort 0) (len:Vec 64 Bool) (x:X) (_:#()) -> returnM (#() * #()) ((),())"; +// Box>::clone +box_list20_u64_clone_sym <- heapster_find_symbol_with_type env + "alloc..boxed..Box$LT$T$GT$$u20$as$u20$core..clone..Clone$GT$5clone" + "%\"List20\"*(%\"List20\"**)"; +heapster_assume_fun_rename_prim env box_list20_u64_clone_sym "box_list20_u64_clone" + "<'a> fn(x:&'a Box>) -> Box>"; + // ::to_string to_string_str <- heapster_find_symbol env "$LT$str$u20$as$u20$alloc..string..ToString$GT$9to_string"; From b85e5f88934d3818aaf8c1c307cc750ad814aa86 Mon Sep 17 00:00:00 2001 From: Eddy Westbrook Date: Wed, 9 Feb 2022 10:05:36 -0800 Subject: [PATCH 27/27] whoops, somehow these changes did not get committed in that last merge --- .../src/Verifier/SAW/Heapster/Permissions.hs | 12 ++++++++++++ heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs | 10 +++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs b/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs index 12866e32e7..2ea9321b8b 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/Permissions.hs @@ -354,6 +354,15 @@ data AtomicPerm (a :: CrucibleType) where LOwnedPerms ps_in -> LOwnedPerms ps_out -> AtomicPerm LifetimeType + -- | A simplified version of @lowned@, written just @lowned(ps)@, which + -- represents a lifetime where the permissions @ps@ have been borrowed and no + -- simplifications have been done. Semantically, this is logically equivalent + -- to @lowned ([l](R)ps -o ps)@, i.e., an @lowned@ permissions where the input + -- and output permissions are the same except that the input permissions are + -- the minimal possible versions of @ps@ in lifetime @l@ that could be given + -- back when @l@ is ended. + Perm_LOwnedSimple :: LOwnedPerms ps -> AtomicPerm LifetimeType + -- | Assertion that a lifetime is current during another lifetime Perm_LCurrent :: PermExpr LifetimeType -> AtomicPerm LifetimeType @@ -689,6 +698,9 @@ data LifetimeCurrentPerms ps_l where LOwnedCurrentPerms :: ExprVar LifetimeType -> [PermExpr LifetimeType] -> LOwnedPerms ps_in -> LOwnedPerms ps_out -> LifetimeCurrentPerms (RNil :> LifetimeType) + -- | A variable @l@ with a simple @lowned@ perm is also current + LOwnedSimpleCurrentPerms :: ExprVar LifetimeType -> LOwnedPerms ps -> + LifetimeCurrentPerms (RNil :> LifetimeType) -- | A variable @l@ that is @lcurrent@ during another lifetime @l'@ is -- current, i.e., if @ps@ ensure @l'@ is current then we need perms diff --git a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs index cd638cfff8..44d355b727 100644 --- a/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs +++ b/heapster-saw/src/Verifier/SAW/Heapster/RustTypes.hs @@ -97,6 +97,11 @@ data ArgLayoutPerm ctx where data ArgLayout where ArgLayout :: CtxRepr ctx -> ArgLayoutPerm ctx -> ArgLayout +-- | Like an 'ArgLayout' but with output permissions on arguments as well +data ArgLayoutIO where + ArgLayoutIO :: CtxRepr ctx -> ArgLayoutPerm ctx -> + RAssign ValuePerm (CtxToRList ctx) -> ArgLayoutIO + -- | Function permission that is existential over all types (note that there -- used to be 3 type variables instead of 4 for 'FunPerm', thus the name) data Some3FunPerm = @@ -783,11 +788,6 @@ argLayoutStructPerm (ArgLayout ghosts args mb_perms) valPermExistsMulti ghosts $ fmap (ValPerm_Conj1 . Perm_Struct) mb_perms -} --- | Like an 'ArgLayout' but with output permissions on arguments as well -data ArgLayoutIO where - ArgLayoutIO :: CtxRepr ctx -> ArgLayoutPerm ctx -> - RAssign ValuePerm (CtxToRList ctx) -> ArgLayoutIO - -- | Append two 'ArgLayoutIO's, if possible appendArgLayoutIO :: ArgLayoutIO -> ArgLayoutIO -> ArgLayoutIO appendArgLayoutIO (ArgLayoutIO ctx1 p1 ps1) (ArgLayoutIO ctx2 p2 ps2) =