using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Threading; using System.IO; using Microsoft.Boogie; using Graphing; using AI = Microsoft.AbstractInterpretationFramework; using System.Diagnostics.Contracts; using Microsoft.Basetypes; using Microsoft.Boogie.VCExprAST; namespace VC { internal class DoomErrorHandler : ProverInterface.ErrorHandler { protected Hashtable label2Absy; protected VerifierCallback callback; private List m_CurrentTrace = new List(); [ContractInvariantMethod] void ObjectInvariant() { Contract.Invariant(label2Absy != null); Contract.Invariant(callback != null); Contract.Invariant(cce.NonNullElements(m_CurrentTrace)); } public DoomErrorHandler(Hashtable label2Absy, VerifierCallback callback) { Contract.Requires(label2Absy != null); Contract.Requires(callback != null); this.label2Absy = label2Absy; this.callback = callback; } public override Absy Label2Absy(string label) { //Contract.Requires(label != null); Contract.Ensures(Contract.Result() != null); int id = int.Parse(label); return cce.NonNull((Absy)label2Absy[id]); } public override void OnProverWarning(string msg) { //Contract.Requires(msg != null); this.callback.OnWarning(msg); } public List/*!>!*/ TraceNodes { get { Contract.Ensures(cce.NonNullElements(Contract.Result>())); return m_CurrentTrace; } } public override void OnModel(IList/*!>!*/ labels, Model model) { // TODO: it would be better to check which reachability variables are actually set to one! List traceNodes = new List(); List assertNodes = new List(); foreach (string s in labels) { Contract.Assert(s != null); Absy node = Label2Absy(s); if (node is Block) { Block b = (Block)node; traceNodes.Add(b); //Console.Write("{0}, ", b.Label); } } m_CurrentTrace.AddRange(traceNodes); } } }