public bool AddPreCondition(BoxedExpression boxedExpression, APC apc, Provenance provenance) { if (!this.CanAddRequires()) { this.AddEntryAssume(boxedExpression, provenance); // record it as assume instead return(false); } var pre = new BoxedExpression.AssumeExpression(boxedExpression, "requires", apc, provenance, boxedExpression.ToString <Type>(type => OutputPrettyCS.TypeHelper.TypeFullName(this.AnalysisDriver.MetaDataDecoder, type))); this.inferredPreconditions.Add(pre); return(true); }
public void InstallEntryAssumes(ICFG cfg, IEnumerable <Pair <BoxedExpression, Method> > inferredAssumes, Method method) { Contract.Requires(inferredAssumes != null); foreach (var inferredAssume in inferredAssumes) { var assume = inferredAssume.One; var dummyAPC = cfg.Entry; // TODO: do something better here! we don't know the APC yet, so we just pick some legitimate APC to avoid null ptr deref when looking up src context Provenance provenance = null; var be = new BoxedExpression.AssumeExpression(assume, "assume", dummyAPC, provenance, assume.ToString <Type>(type => OutputPrettyCS.TypeHelper.TypeFullName(this.MetaDataDecoder, type))); var pc = new BoxedExpression.PC(be, 0); this.MethodCache.AddEntryAssume(cfg, method, pc, ClousotExpressionCodeProvider <Local, Parameter, Method, Field, Type> .Decoder); } }
public bool AddCalleeAssume(BoxedExpression assumeExpression, object callee, APC apc, Provenance provenance) { Contract.Assume(callee != null); if (!this.CanAddAssumes()) { return(false); } // TODO: collect context info var assume = new BoxedExpression.AssumeExpression(assumeExpression, "assume", apc, provenance, assumeExpression.ToString()); //var assumePostCond = new BoxedExpression.AssumeAsPostConditionExpression(assumeExpression, null, callee, calleeName, "assume", apc, provenance); //var assume = new BoxedExpression.AssumeExpression(boxedExpression, "assume", apc, provenance); this.inferredCalleeAssumes.Add(Pair.For(assume, (Method)callee)); return(true); }
/// <summary> /// Responsibility to make sure the assume can be properly decoded lies with the serializer/deserializer. /// The SER/DES should have enough detail and checks to make sure a deserialized expression can be decoded without /// failing due to stack mismatch or failed type assumptions. /// </summary> public void InstallCalleeAssumes(ICFG cfg, IEnumerable <Pair <BoxedExpression, Method> > inferredAssumes, Method method) { Contract.Requires(inferredAssumes != null); #if false if (!inferredAssumes.Any()) { return; } //this.Output.WriteLine("Trying to install {0} inferred assumes.", inferredAssumes.Count); // We lookup by name var locs = this.MetaDataDecoder.Locals(method).Enumerate().Select(local => this.MetaDataDecoder.Name(local)); var paramz = this.MetaDataDecoder.Parameters(method).Enumerate().Select(parameter => this.MetaDataDecoder.Name(parameter)); var fields = this.MetaDataDecoder.Fields(this.MetaDataDecoder.DeclaringType(method)).Select(m => this.MetaDataDecoder.Name(method)); #endif // TODO: can the name / expr matching get mixed up during deserialization? foreach (var inferredAssume in inferredAssumes) { var assume = inferredAssume.One; //this.Output.WriteLine("Installing assume " + assume); #if false #region Ensure that all var's in the assume expression still exist in the new version of the function // Check that the variables appearing in the assume to install exists in the scope. // We use the name of the variables to make sure they are the same variable var foundAllVariables = assume.Variables().TrueForAll(v => { var vToString = v.ToString(); // check for var in locs var found = locs.Any(loc => vToString == loc); // check for var in params found = found || paramz.Any(param => vToString == param); //string paramStr = this.MetaDataDecoder.ParameterType(paramz[j]) + " " + v.ToString(); // create str with same format as parameter string; hacky, but needed // check for var in fields found = found || fields.Any(fName => { return(vToString == fName || // "normal" case vToString == String.Format("this.{0}", fName)); // case where field prefixed with "this" }); return(found); }); if (!foundAllVariables) { continue; } #endregion // found all locals, going to try to install this assume #endif var dummyAPC = cfg.Entry; // TODO: do something better here! we don't know the APC yet, so we just pick some legitimate APC to avoid null ptr deref when looking up src context Provenance provenance = null; var be = new BoxedExpression.AssumeExpression(assume, "assume", dummyAPC, provenance, assume.ToString <Type>(type => OutputPrettyCS.TypeHelper.TypeFullName(this.MetaDataDecoder, type))); var pc = new BoxedExpression.PC(be, 0); var calleeName = inferredAssume.Two; this.MethodCache.AddCalleeAssumeAsPostCondition(cfg, method, calleeName, pc, ClousotExpressionCodeProvider <Local, Parameter, Method, Field, Type> .Decoder); } }