Exemple #1
0
 public static void CreateProver(string z3exe)
 {
     CommandLineOptions.Clo.Z3ExecutablePath = z3exe;
     CommandLineOptions.Clo.ApplyDefaultOptions();
     CommandLineOptions.Clo.StratifiedInlining = 1;
     prover = ProverInterface.CreateProver(new Program(), "log", CommandLineOptions.Clo.SimplifyLogFileAppend, -1);
 }
Exemple #2
0
 public static void InitializeVCGen(Program prog)
 {
     //create VC.vcgen/VC.proverInterface
     VC.vcgen = new VCGen(prog, CommandLineOptions.Clo.SimplifyLogFilePath,
                          CommandLineOptions.Clo.SimplifyLogFileAppend, new List <Checker>());
     VC.proverInterface = ProverInterface.CreateProver(prog, CommandLineOptions.Clo.SimplifyLogFilePath, CommandLineOptions.Clo.SimplifyLogFileAppend, CommandLineOptions.Clo.ProverKillTime);
     VC.translator      = VC.proverInterface.Context.BoogieExprTranslator;
     VC.exprGen         = VC.proverInterface.Context.ExprGen;
     VC.collector       = new ConditionGeneration.CounterexampleCollector();
 }
Exemple #3
0
    public StratifiedVCGenBase(Program program, string /*?*/ logFilePath, bool appendLogFile, List<Checker> checkers,
      Action<Implementation> PassiveImplInstrumentation)
      : base(program, logFilePath, appendLogFile, checkers)
    {
      implName2StratifiedInliningInfo = new Dictionary<string, StratifiedInliningInfo>();
      prover = ProverInterface.CreateProver(program, logFilePath, appendLogFile, CommandLineOptions.Clo.TimeLimit);
      foreach (var impl in program.Implementations)
      {
        implName2StratifiedInliningInfo[impl.Name] = new StratifiedInliningInfo(impl, this, PassiveImplInstrumentation);
      }

      GenerateRecordFunctions();
    }
Exemple #4
0
        public AbstractHoudini(Program program)
        {
            this.program              = program;
            this.impl2VC              = new Dictionary <string, VCExpr>();
            this.impl2EndStateVars    = new Dictionary <string, List <VCExpr> >();
            this.impl2CalleeSummaries = new Dictionary <string, List <Tuple <string, VCExprNAry> > >();
            this.impl2Summary         = new Dictionary <string, ISummaryElement>();
            this.name2Impl            = BoogieUtil.nameImplMapping(program);

            this.vcgen    = new VCGen(program, CommandLineOptions.Clo.ProverLogFilePath, CommandLineOptions.Clo.ProverLogFileAppend, new List <Checker>());
            this.prover   = ProverInterface.CreateProver(program, CommandLineOptions.Clo.ProverLogFilePath, CommandLineOptions.Clo.ProverLogFileAppend, CommandLineOptions.Clo.TimeLimit);
            this.reporter = new AbstractHoudiniErrorReporter();

            var impls = new List <Implementation>(
                program.TopLevelDeclarations.OfType <Implementation>());

            // Create all VCs
            impls
            .Iter(attachEnsures);

            impls
            .Iter(GenVC);
        }
Exemple #5
0
        public ConcurrentHoudini(int id, Program program, HoudiniSession.HoudiniStatistics stats, string cexTraceFile = "houdiniCexTrace.bpl")
        {
            Contract.Assert(id >= 0);

            this.id           = id;
            this.program      = program;
            this.cexTraceFile = cexTraceFile;

            if (CommandLineOptions.Clo.Trace)
            {
                Console.WriteLine("Collecting existential constants...");
            }
            this.houdiniConstants = CollectExistentialConstants();

            if (CommandLineOptions.Clo.Trace)
            {
                Console.WriteLine("Building call graph...");
            }
            this.callGraph = Program.BuildCallGraph(program);
            if (CommandLineOptions.Clo.Trace)
            {
                Console.WriteLine("Number of implementations = {0}", callGraph.Nodes.Count);
            }

            if (CommandLineOptions.Clo.HoudiniUseCrossDependencies)
            {
                if (CommandLineOptions.Clo.Trace)
                {
                    Console.WriteLine("Computing procedure cross dependencies ...");
                }
                this.crossDependencies = new CrossDependencies(this.houdiniConstants);
                this.crossDependencies.Visit(program);
            }

            Inline();

            this.vcgen           = new VCGen(program, CommandLineOptions.Clo.SimplifyLogFilePath, CommandLineOptions.Clo.SimplifyLogFileAppend, new List <Checker>());
            this.proverInterface = ProverInterface.CreateProver(program, CommandLineOptions.Clo.SimplifyLogFilePath, CommandLineOptions.Clo.SimplifyLogFileAppend, CommandLineOptions.Clo.ProverKillTime, id);

            vcgenFailures = new HashSet <Implementation>();
            Dictionary <Implementation, HoudiniSession> houdiniSessions = new Dictionary <Implementation, HoudiniSession>();

            if (CommandLineOptions.Clo.Trace)
            {
                Console.WriteLine("Beginning VC generation for Houdini...");
            }
            foreach (Implementation impl in callGraph.Nodes)
            {
                try {
                    if (CommandLineOptions.Clo.Trace)
                    {
                        Console.WriteLine("Generating VC for {0}", impl.Name);
                    }
                    HoudiniSession session = new HoudiniSession(this, vcgen, proverInterface, program, impl, stats, taskID: id);
                    houdiniSessions.Add(impl, session);
                }
                catch (VCGenException) {
                    if (CommandLineOptions.Clo.Trace)
                    {
                        Console.WriteLine("VC generation failed");
                    }
                    vcgenFailures.Add(impl);
                }
            }
            this.houdiniSessions = new ReadOnlyDictionary <Implementation, HoudiniSession>(houdiniSessions);

            if (CommandLineOptions.Clo.ExplainHoudini)
            {
                // Print results of ExplainHoudini to a dotty file
                explainHoudiniDottyFile = new StreamWriter("explainHoudini.dot");
                explainHoudiniDottyFile.WriteLine("digraph explainHoudini {");
                foreach (var constant in houdiniConstants)
                {
                    explainHoudiniDottyFile.WriteLine("{0} [ label = \"{0}\" color=black ];", constant.Name);
                }
                explainHoudiniDottyFile.WriteLine("TimeOut [label = \"TimeOut\" color=red ];");
            }
        }