/// <summary> /// Entry point to check a method. /// </summary> /// <param name="t"></param> /// <param name="method"></param> public static void Check(TypeSystem t, Method method, Analyzer analyzer) { if (method == null) { return; } if (method.HasCompilerGeneratedSignature) { return; // REVIEW: this means we don't check default ctors, among other things. } ExposureChecker checker = new ExposureChecker(t, method); Analyzer.WriteLine(""); ControlFlowGraph cfg = analyzer.GetCFG(method); if (cfg != null) { checker.Run(cfg, new ExposureState(t)); } }
public ExposureInstructionVisitor(ExposureChecker c) { ExposureChecker = c; ts = c.typeSystem; reportedErrors = new Hashtable(); }
/// <summary> /// Put general analysis targeting to general IL properties. /// </summary> /// <param name="method"></param> protected void GeneralAnalysis(Method method) { nonNullInfo = null; if (!this.CodeIsWellFormed) { return; } if (debug) { ControlFlowGraph cfg = GetCFG(method); if (cfg != null) { cfg.Display(Console.Out); } } if (!method.Name.Name.StartsWith("Microsoft.Contracts")) { // Definite assignment checking //System.Console.WriteLine("--------------- Analyzing Method: {0}", method.Name); if (this.DefiniteAssignmentChecking) { // For every statement, three things are returned from this pre- stage analysis // 1) which program vars (that represent NN arrays) are created but not committed // 2) which program vars (that represent NN arrays) are created and committed between // the creation and commitment of current array. // 3) if the statement is a commitment call for an NN array, whether it // is ok to lift the array to be non-delayed. PreDAStatus preAnalysisResult = MethodReachingDefNNArrayChecker.Check(typeSystem, method, this); if (preAnalysisResult != null) { delayInfo = MethodDefiniteAssignmentChecker.Check(typeSystem, method, this, preAnalysisResult); } } if (Analyzer.Debug) { if (delayInfo != null) { System.Console.WriteLine("----- delay info count: {0}", delayInfo.Count()); } } if (this.ExposureChecking) { ExposureChecker.Check(typeSystem, method, this); } // NonNull checking if (this.NonNullChecking) { nonNullInfo = NonNullChecker.Check(typeSystem, method, this); } //System.Console.WriteLine("---------------- Finished Analyzing Method:{0}", method.Name); } }