Example #1
0
        private void GenVC(Implementation impl)
        {
            ModelViewInfo          mvInfo;
            Dictionary <int, Absy> label2absy;

            vcgen.ConvertCFG2DAG(impl);
            vcgen.PassifyImpl(impl, out mvInfo);

            var gen    = prover.VCExprGen;
            var vcexpr = vcgen.GenerateVC(impl, null, out label2absy, prover.Context);

            // Create a macro so that the VC can sit with the theorem prover
            Macro macro = new Macro(Token.NoToken, impl.Name + "Macro", new List <Variable>(), new Formal(Token.NoToken, new TypedIdent(Token.NoToken, "", Bpl.Type.Bool), false));

            prover.DefineMacro(macro, vcexpr);

            // Store VC
            impl2VC.Add(impl.Name, gen.Function(macro));

            //Console.WriteLine("VC of {0}: {1}", impl.Name, vcexpr);

            // Find the assert
            impl2EndStateVars.Add(impl.Name, new List <VCExpr>());
            var found = false;

            foreach (var blk in impl.Blocks)
            {
                foreach (var cmd in blk.Cmds.OfType <AssertCmd>())
                {
                    if (BoogieUtil.isAssertTrue(cmd))
                    {
                        continue;
                    }
                    var nary = cmd.Expr as NAryExpr;
                    if (nary == null)
                    {
                        continue;
                    }
                    var pred = nary.Fun as FunctionCall;
                    if (pred == null || pred.FunctionName != (impl.Name + (AbstractHoudini.summaryPredSuffix)))
                    {
                        continue;
                    }

                    Debug.Assert(!found);
                    found = true;
                    nary.Args.OfType <Expr>()
                    .Iter(expr => impl2EndStateVars[impl.Name].Add(prover.Context.BoogieExprTranslator.Translate(expr)));
                }
            }
            Debug.Assert(found);

            // Grab summary predicates
            var visitor = new FindSummaryPred(prover.VCExprGen);

            visitor.Mutate(vcexpr, true);

            impl2CalleeSummaries.Add(impl.Name, new List <Tuple <string, VCExprNAry> >());
            visitor.summaryPreds.Iter(tup => impl2CalleeSummaries[impl.Name].Add(tup));
        }
Example #2
0
        public HoudiniSession(Houdini houdini, VCGen vcgen, ProverInterface proverInterface, Program program, Implementation impl, HoudiniStatistics stats, int taskID = -1)
        {
            this.descriptiveName = impl.Name;
            this.stats           = stats;
            collector            = new ConditionGeneration.CounterexampleCollector();
            collector.OnProgress("HdnVCGen", 0, 0, 0.0);

            vcgen.ConvertCFG2DAG(impl, taskID: taskID);
            ModelViewInfo mvInfo;
            var           gotoCmdOrigins = vcgen.PassifyImpl(impl, out mvInfo);

            ExistentialConstantCollector ecollector;

            ExistentialConstantCollector.CollectHoudiniConstants(houdini, impl, out ecollector);
            this.houdiniAssertConstants   = ecollector.houdiniAssertConstants;
            this.houdiniAssumeConstants   = ecollector.houdiniAssumeConstants;
            this.explainConstantsNegative = ecollector.explainNegative;
            this.explainConstantsPositive = ecollector.explainPositive;
            this.constantToControl        = ecollector.constToControl;

            houdiniConstants = new HashSet <Variable>();
            houdiniConstants.UnionWith(houdiniAssertConstants);
            houdiniConstants.UnionWith(houdiniAssumeConstants);

            var    exprGen = proverInterface.Context.ExprGen;
            VCExpr controlFlowVariableExpr = CommandLineOptions.Clo.UseLabels ? null : exprGen.Integer(BigNum.ZERO);

            Dictionary <int, Absy> label2absy;

            conjecture = vcgen.GenerateVC(impl, controlFlowVariableExpr, out label2absy, proverInterface.Context);
            if (!CommandLineOptions.Clo.UseLabels)
            {
                VCExpr controlFlowFunctionAppl = exprGen.ControlFlowFunctionApplication(exprGen.Integer(BigNum.ZERO), exprGen.Integer(BigNum.ZERO));
                VCExpr eqExpr = exprGen.Eq(controlFlowFunctionAppl, exprGen.Integer(BigNum.FromInt(impl.Blocks[0].UniqueId)));
                conjecture = exprGen.Implies(eqExpr, conjecture);
            }

            Macro macro = new Macro(Token.NoToken, descriptiveName, new List <Variable>(), new Formal(Token.NoToken, new TypedIdent(Token.NoToken, "", Type.Bool), false));

            proverInterface.DefineMacro(macro, conjecture);
            conjecture = exprGen.Function(macro);

            if (CommandLineOptions.Clo.vcVariety == CommandLineOptions.VCVariety.Local)
            {
                handler = new VCGen.ErrorReporterLocal(gotoCmdOrigins, label2absy, impl.Blocks, vcgen.incarnationOriginMap, collector, mvInfo, proverInterface.Context, program);
            }
            else
            {
                handler = new VCGen.ErrorReporter(gotoCmdOrigins, label2absy, impl.Blocks, vcgen.incarnationOriginMap, collector, mvInfo, proverInterface.Context, program);
            }
        }
Example #3
0
        public HoudiniSession(Houdini houdini, VCGen vcgen, ProverInterface proverInterface, Program program, Implementation impl, HoudiniStatistics stats, int taskID = -1)
        {
            this.descriptiveName = impl.Name;
              this.stats = stats;
              collector = new ConditionGeneration.CounterexampleCollector();
              collector.OnProgress("HdnVCGen", 0, 0, 0.0);

              vcgen.ConvertCFG2DAG(impl, taskID: taskID);
              ModelViewInfo mvInfo;
              var gotoCmdOrigins = vcgen.PassifyImpl(impl, out mvInfo);

              ExistentialConstantCollector ecollector;
              ExistentialConstantCollector.CollectHoudiniConstants(houdini, impl, out ecollector);
              this.houdiniAssertConstants = ecollector.houdiniAssertConstants;
              this.houdiniAssumeConstants = ecollector.houdiniAssumeConstants;
              this.explainConstantsNegative = ecollector.explainNegative;
              this.explainConstantsPositive = ecollector.explainPositive;
              this.constantToControl = ecollector.constToControl;

              houdiniConstants = new HashSet<Variable>();
              houdiniConstants.UnionWith(houdiniAssertConstants);
              houdiniConstants.UnionWith(houdiniAssumeConstants);

              var exprGen = proverInterface.Context.ExprGen;
              VCExpr controlFlowVariableExpr = CommandLineOptions.Clo.UseLabels ? null : exprGen.Integer(BigNum.ZERO);

              Dictionary<int, Absy> label2absy;
              conjecture = vcgen.GenerateVC(impl, controlFlowVariableExpr, out label2absy, proverInterface.Context);
              if (!CommandLineOptions.Clo.UseLabels) {
            VCExpr controlFlowFunctionAppl = exprGen.ControlFlowFunctionApplication(exprGen.Integer(BigNum.ZERO), exprGen.Integer(BigNum.ZERO));
            VCExpr eqExpr = exprGen.Eq(controlFlowFunctionAppl, exprGen.Integer(BigNum.FromInt(impl.Blocks[0].UniqueId)));
            conjecture = exprGen.Implies(eqExpr, conjecture);
              }

              Macro macro = new Macro(Token.NoToken, descriptiveName, new List<Variable>(), new Formal(Token.NoToken, new TypedIdent(Token.NoToken, "", Type.Bool), false));
              proverInterface.DefineMacro(macro, conjecture);
              conjecture = exprGen.Function(macro);

              if (CommandLineOptions.Clo.vcVariety == CommandLineOptions.VCVariety.Local) {
            handler = new VCGen.ErrorReporterLocal(gotoCmdOrigins, label2absy, impl.Blocks, vcgen.incarnationOriginMap, collector, mvInfo, proverInterface.Context, program);
              }
              else {
            handler = new VCGen.ErrorReporter(gotoCmdOrigins, label2absy, impl.Blocks, vcgen.incarnationOriginMap, collector, mvInfo, proverInterface.Context, program);
              }
        }