Esempio n. 1
0
        private BoogieAxiom GenerateKeccakAxiom()
        {
            var qVar1     = QVarGenerator.NewQVar(0, 0);
            var qVar2     = QVarGenerator.NewQVar(0, 1);
            var eqVar12   = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.EQ, qVar1, qVar2);
            var qVar1Func = new BoogieFuncCallExpr("keccak256", new List <BoogieExpr>()
            {
                qVar1
            });
            var qVar2Func = new BoogieFuncCallExpr("keccak256", new List <BoogieExpr>()
            {
                qVar2
            });
            var eqFunc12 = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.NEQ, qVar1Func, qVar2Func);
            var bodyExpr = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.OR, eqVar12, eqFunc12);
            var triggers = new List <BoogieExpr>()
            {
                qVar1Func, qVar2Func
            };

            // forall q1:int, q2:int :: q1 == q2 || keccak256(q1) != keccak256(q2)
            var qExpr = new BoogieQuantifiedExpr(true, new List <BoogieIdentifierExpr>()
            {
                qVar1, qVar2
            }, new List <BoogieType>()
            {
                BoogieType.Int, BoogieType.Int
            }, bodyExpr, triggers);

            return(new BoogieAxiom(qExpr));
        }
Esempio n. 2
0
        private BoogieAxiom GenerateAbiEncodePackedAxiomOneArgRef()
        {
            var qVar1     = QVarGenerator.NewQVar(0, 0);
            var qVar2     = QVarGenerator.NewQVar(0, 1);
            var eqVar12   = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.EQ, qVar1, qVar2);
            var qVar1Func = new BoogieFuncCallExpr("abiEncodePacked1R", new List <BoogieExpr>()
            {
                qVar1
            });
            var qVar2Func = new BoogieFuncCallExpr("abiEncodePacked1R", new List <BoogieExpr>()
            {
                qVar2
            });
            var eqFunc12 = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.NEQ, qVar1Func, qVar2Func);
            var bodyExpr = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.OR, eqVar12, eqFunc12);
            var triggers = new List <BoogieExpr>()
            {
                qVar1Func, qVar2Func
            };

            // forall q1:int, q2:int :: q1 == q2 || abiEncodePacked(q1) != abiEncodePacked(q2)
            var qExpr = new BoogieQuantifiedExpr(true, new List <BoogieIdentifierExpr>()
            {
                qVar1, qVar2
            }, new List <BoogieType>()
            {
                BoogieType.Ref, BoogieType.Ref
            }, bodyExpr, triggers);

            return(new BoogieAxiom(qExpr));
        }
Esempio n. 3
0
        private void GenerateGlobalProcedureAllocMany()
        {
            if (context.TranslateFlags.LazyNestedAlloc)
            {
                return;
            }

            // generate the internal one without base constructors
            string procName = "HavocAllocMany";
            List <BoogieVariable>  inParams   = new List <BoogieVariable>();
            List <BoogieVariable>  outParams  = new List <BoogieVariable>();
            List <BoogieAttribute> attributes = new List <BoogieAttribute>();

            if (context.TranslateFlags.GenerateInlineAttributes)
            {
                attributes.Add(new BoogieAttribute("inline", 1));
            }
            ;
            BoogieProcedure procedure = new BoogieProcedure(procName, inParams, outParams, attributes);

            context.Program.AddDeclaration(procedure);

            var oldAlloc = new BoogieLocalVariable(new BoogieTypedIdent("oldAlloc", new BoogieMapType(BoogieType.Ref, BoogieType.Bool)));
            List <BoogieVariable> localVars = new List <BoogieVariable>()
            {
                oldAlloc
            };
            BoogieStmtList       procBody          = new BoogieStmtList();
            BoogieIdentifierExpr oldAllocIdentExpr = new BoogieIdentifierExpr("oldAlloc");
            BoogieIdentifierExpr allocIdentExpr    = new BoogieIdentifierExpr("Alloc");

            // oldAlloc = Alloc
            procBody.AddStatement(new BoogieAssignCmd(oldAllocIdentExpr, allocIdentExpr));
            // havoc Alloc
            procBody.AddStatement(new BoogieHavocCmd(allocIdentExpr));
            // assume forall i:ref oldAlloc[i] ==> alloc[i]
            var             qVar              = QVarGenerator.NewQVar(0, 0);
            BoogieMapSelect allocMapSelect    = new BoogieMapSelect(allocIdentExpr, qVar);
            BoogieMapSelect oldAllocMapSelect = new BoogieMapSelect(oldAllocIdentExpr, qVar);
            BoogieExpr      allocAssumeExpr   = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.IMP, oldAllocMapSelect, allocMapSelect);

            procBody.AddStatement(new BoogieAssumeCmd(new BoogieQuantifiedExpr(true, new List <BoogieIdentifierExpr>()
            {
                qVar
            }, new List <BoogieType>()
            {
                BoogieType.Ref
            }, allocAssumeExpr)));

            BoogieImplementation implementation = new BoogieImplementation(procName, inParams, outParams, localVars, procBody);

            context.Program.AddDeclaration(implementation);
        }
Esempio n. 4
0
        private BoogieAxiom GenerateAbiEncodePackedAxiomTwoArgsOneRef()
        {
            var qVar11    = QVarGenerator.NewQVar(0, 0);
            var qVar12    = QVarGenerator.NewQVar(0, 1);
            var qVar21    = QVarGenerator.NewQVar(1, 0);
            var qVar22    = QVarGenerator.NewQVar(1, 1);
            var eqVar1    = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.EQ, qVar11, qVar12);
            var eqVar2    = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.EQ, qVar21, qVar22);
            var qVar1Func = new BoogieFuncCallExpr("abiEncodePacked2R", new List <BoogieExpr>()
            {
                qVar11, qVar21
            });
            var qVar2Func = new BoogieFuncCallExpr("abiEncodePacked2R", new List <BoogieExpr>()
            {
                qVar12, qVar22
            });
            var triggers = new List <BoogieExpr>()
            {
                qVar1Func, qVar2Func
            };

            var eqFunc12 = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.NEQ, qVar1Func, qVar2Func);
            var eqArgs   = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.AND, eqVar1, eqVar2);
            var bodyExpr = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.OR, eqArgs, eqFunc12);

            // forall q1:int, q2:int, q1', q2' :: (q1 == q1' && q2 == q2') || abiEncodePacked(q1, q2) != abiEncodePacked(q1', q2')
            var qExpr = new BoogieQuantifiedExpr(true, new List <BoogieIdentifierExpr>()
            {
                qVar11, qVar12, qVar21, qVar22
            },
                                                 new List <BoogieType>()
            {
                BoogieType.Ref, BoogieType.Ref, BoogieType.Int, BoogieType.Int
            }, bodyExpr, triggers);

            return(new BoogieAxiom(qExpr));
        }
Esempio n. 5
0
        private List <BoogieAxiom> GenerateVeriSolSumAxioms()
        {
            // axiom(forall m:[Ref]int :: (exists _a: Ref::m[_a] != 0) || _SumMapping_VeriSol(m) == 0);
            var qVar1        = QVarGenerator.NewQVar(0, 0);
            var qVar2        = QVarGenerator.NewQVar(0, 1);
            var ma           = new BoogieMapSelect(qVar1, qVar2);
            var maEq0        = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.NEQ, ma, new BoogieLiteralExpr(System.Numerics.BigInteger.Zero));
            var existsMaNeq0 = new BoogieQuantifiedExpr(false,
                                                        new List <BoogieIdentifierExpr>()
            {
                qVar2
            },
                                                        new List <BoogieType>()
            {
                BoogieType.Ref
            },
                                                        maEq0,
                                                        null);

            var sumM = new BoogieFuncCallExpr("_SumMapping_VeriSol", new List <BoogieExpr>()
            {
                qVar1
            });
            var sumMEq0     = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.EQ, sumM, new BoogieLiteralExpr(System.Numerics.BigInteger.Zero));
            var maEq0SumEq0 = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.OR, existsMaNeq0, sumMEq0);
            var axiom1      = new BoogieQuantifiedExpr(true,
                                                       new List <BoogieIdentifierExpr>()
            {
                qVar1
            },
                                                       new List <BoogieType>()
            {
                new BoogieMapType(BoogieType.Ref, BoogieType.Int)
            },
                                                       maEq0SumEq0,
                                                       null);


            // axiom(forall m:[Ref]int, _a: Ref, _b: int :: _SumMapping_VeriSol(m[_a:= _b]) == _SumMapping_VeriSol(m) - m[_a] + _b);
            var qVar3      = QVarGenerator.NewQVar(0, 2);
            var subExpr    = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.SUB, sumM, ma);
            var addExpr    = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.ADD, subExpr, qVar3);
            var updExpr    = new BoogieMapUpdate(qVar1, qVar2, qVar3);
            var sumUpdExpr = new BoogieFuncCallExpr("_SumMapping_VeriSol", new List <BoogieExpr>()
            {
                updExpr
            });
            var sumUpdEqExpr = new BoogieBinaryOperation(BoogieBinaryOperation.Opcode.EQ, sumUpdExpr, addExpr);
            var axiom2       = new BoogieQuantifiedExpr(true,
                                                        new List <BoogieIdentifierExpr>()
            {
                qVar1, qVar2, qVar3
            },
                                                        new List <BoogieType>()
            {
                new BoogieMapType(BoogieType.Ref, BoogieType.Int), BoogieType.Ref, BoogieType.Int
            },
                                                        sumUpdEqExpr,
                                                        null);

            return(new List <BoogieAxiom>()
            {
                new BoogieAxiom(axiom1), new BoogieAxiom(axiom2)
            });
        }