Пример #1
0
        public CciAssembly Rewrite(CciAssembly assembly)
        {
            ISourceLocationProvider sourceLocationProvider = GetPdbReader(assembly.Module);
            var trans     = new ContractRewriter(host, assembly.ContractProvider, sourceLocationProvider);
            var newModule = trans.Rewrite(assembly.Module) as Module;

            return(new CciAssembly(newModule, assembly.ContractProvider));
        }
Пример #2
0
        protected static IAssembly GenerateStrengthenedAssembly(Epa epa, CciAssembly assembly)
        {
            Contract.Requires(epa != null);
            Contract.Requires(assembly != null);

            System.Console.WriteLine("Generating strengthened output assembly");
            var instrumenter = new Instrumenter.Instrumenter();

            return(instrumenter.InstrumentType(assembly, epa));
        }
Пример #3
0
        public CorralAnalyzerFactory(string defaultArgs, DirectoryInfo workingDir, CciQueryGenerator queryGenerator, CciAssembly inputAssembly,
                                     string inputFileName, ITypeDefinition typeToAnalyze, CancellationToken token)
        {
            this.defaultArgs    = defaultArgs;
            this.workingDir     = workingDir;
            this.queryGenerator = queryGenerator;
            this.inputAssembly  = inputAssembly;
            this.inputFileName  = inputFileName;
            this.typeToAnalyze  = typeToAnalyze;
            this.token          = token;

            generatedQueriesCount = 0;
            unprovenQueriesCount  = 0;
        }
Пример #4
0
        public CodeContractsAnalyzer(DirectoryInfo workingDir, string ccCheckDefaultArgs, string libPaths, CciQueryGenerator queryGenerator,
                                     CciAssembly inputAssembly, string inputFileName, ITypeDefinition typeToAnalyze, CancellationToken token)
        {
            this.workingDir         = workingDir;
            this.ccCheckDefaultArgs = ccCheckDefaultArgs;
            this.libPaths           = libPaths;
            this.queryGenerator     = queryGenerator;
            this.inputAssembly      = inputAssembly;
            this.typeToAnalyze      = typeToAnalyze;
            this.inputFileName      = inputFileName;
            this.token = token;

            generatedQueriesCount = 0;
            unprovenQueriesCount  = 0;
        }
Пример #5
0
        protected static TypeAnalysisResult GenerateEpa(CciAssembly inputAssembly, ITypeDefinition typeToAnalyze, Options options)
        {
            System.Console.WriteLine("Starting analysis for type {0}", typeToAnalyze);

            var cancellationSource = new CancellationTokenSource();

            var workingDir = CreateOrCleanupWorkingDirectory();

            var queryGenerator = new CciQueryGenerator();

            IAnalyzerFactory analyzerFactory;

            switch (options.Backend)
            {
            case "CodeContracts":
                var codeContracts = Environment.GetEnvironmentVariable("CodeContractsInstallDir");
                if (string.IsNullOrEmpty(codeContracts))
                {
                    var msg = new StringBuilder();
                    msg.AppendLine("The environment variable %CodeContractsInstallDir% does not exist.");
                    msg.AppendLine("Please make sure that Code Contracts is installed correctly.");
                    msg.AppendLine("This might be because the system was not restarted after Code Contracts installation.");

                    throw new DirectoryNotFoundException(msg.ToString());
                }
                var cccheckArgs = ConfigurationManager.AppSettings["CccheckArgs"];
                Contract.Assert(cccheckArgs != null);
                var cccheck = new FileInfo(ConfigurationManager.AppSettings["CccheckFullName"]);
                Contract.Assert(cccheck.Exists);
                analyzerFactory = new CodeContractsAnalyzerFactory(workingDir, cccheckArgs, string.Empty, queryGenerator, inputAssembly,
                                                                   options.InputAssembly,
                                                                   typeToAnalyze, cancellationSource.Token);
                break;

            case "Corral":
                var corralDefaultArgs = ConfigurationManager.AppSettings["CorralDefaultArgs"];
                Contract.Assert(corralDefaultArgs != null);
                analyzerFactory = new CorralAnalyzerFactory(corralDefaultArgs, workingDir, queryGenerator, inputAssembly,
                                                            options.InputAssembly, typeToAnalyze, cancellationSource.Token);
                break;

            default:
                throw new NotSupportedException();
            }

            var generator = new EpaGenerator(analyzerFactory, options.Cutter);

            var epaBuilder = new EpaBuilder(typeToAnalyze);

            var epaBuilderObservable = new ObservableEpaBuilder(epaBuilder);

            epaBuilderObservable.TransitionAdded += OnTransitionAdded;
            TypeAnalysisResult analysisResult;

            if (!options.Methods.Equals("All"))
            {
                var selectedMethods = options.Methods.Split(';');
                analysisResult = generator.GenerateEpa(typeToAnalyze, selectedMethods, epaBuilderObservable).Result;
            }
            else
            {
                analysisResult = generator.GenerateEpa(typeToAnalyze, epaBuilderObservable).Result;
            }

            return(analysisResult);
        }
Пример #6
0
        public IAssembly InstrumentType(CciAssembly assembly, Epa epa)
        {
            Contract.Requires(assembly != null);
            Contract.Requires(epa != null);
            Contract.Requires(assembly.Types().Contains(epa.Type));

            // Clone assembly
            var host   = CciHostEnvironment.GetInstance();
            var module = new CodeAndContractDeepCopier(host).Copy(assembly.Module);

            var contractExtractor = host.GetContractExtractor(module.UnitIdentity);
            var contractProvider  = new AggregatingContractProvider(contractExtractor);

            var preconditions = new Dictionary <string, List <IPrecondition> >();

            var actions = new List <Action>(from transition in epa.Transitions.GroupBy(t => t.Action) select transition.Key);

            Contract.Assert(actions.Any());

            foreach (var action in actions)
            {
                // TODO (lleraromero): Es necesario? NullObject Pattern?
                var mc = action.Contract as MethodContract;
                if (mc == null)
                {
                    continue;
                }

                preconditions.Add(action.Name, action.Contract.Preconditions.ToList());
            }

            var typeDefinition    = epa.Type;
            var cciTypeDefinition =
                module.AllTypes.First(
                    t => TypeHelper.GetTypeName(t, NameFormattingOptions.UseGenericTypeNameSuffix).Equals(typeDefinition.Name)) as NamedTypeDefinition;

            Contract.Assert(cciTypeDefinition != null);

            var typeContract = RemoveInvariantMethods(typeDefinition, cciTypeDefinition);

            // Add a field to represent the state
            var field = CreateStateField(cciTypeDefinition, typeContract);

            cciTypeDefinition.Fields.Add(field);

            // Associate type contract to the contract provider
            contractProvider.AssociateTypeWithContract(cciTypeDefinition, typeContract);

            // Create Ids
            var stateNumberMap = new Dictionary <State, int>();

            foreach (var state in epa.States)
            {
                stateNumberMap.Add(state, stateNumberMap.Keys.Count);
            }

            foreach (var action in actions)
            {
                // voy a agrupar las transiciones que usan esta accion por sourceState.Id
                // transitions = Dicc<int, List<int>> o sea: "Dicc<from, List<to>>"
                var transitionsUsingAction = new List <Transition>(from t in epa.Transitions where t.Action.Equals(action) select t);
                var transitionsSourceIds   = new HashSet <int>(from t in transitionsUsingAction select stateNumberMap[t.SourceState]).Distinct();

                var transitions = new Dictionary <int, List <int> >();
                foreach (var t in transitionsUsingAction)
                {
                    var sourceStateId = stateNumberMap[t.SourceState];
                    if (!transitions.ContainsKey(sourceStateId))
                    {
                        transitions.Add(sourceStateId, new List <int>());
                    }

                    var targetStateId = stateNumberMap[t.TargetState];
                    transitions[sourceStateId].Add(targetStateId);
                }

                var methodContract   = action.Contract as MethodContract ?? new MethodContract();
                var methodDefinition = cciTypeDefinition.Methods.First(m => m.GetUniqueName().Equals(action.Method.GetUniqueName()));

                BlockStatement actionBodyBlock = null;
                if (methodDefinition.Body is SourceMethodBody)
                {
                    var actionBody = (SourceMethodBody)methodDefinition.Body;
                    actionBodyBlock = actionBody.Block as BlockStatement;
                }
                else if (methodDefinition.Body is Microsoft.Cci.MutableCodeModel.SourceMethodBody)
                {
                    var actionBody = (Microsoft.Cci.MutableCodeModel.SourceMethodBody)methodDefinition.Body;
                    actionBodyBlock = actionBody.Block as BlockStatement;
                }
                Contract.Assert(actionBodyBlock != null);

                //Por tratarse de un constructor insertamos en 1 porque en 0 esta base..ctor()
                var insertAtIndex = methodDefinition.IsConstructor ? 1 : 0;

                // CodeContracts no permite utilizar 'this' en los requires de los constructores
                if (!methodDefinition.IsConstructor)
                {
                    var pre = new PreconditionGenerator().GeneratePrecondition(field, transitions.Keys.ToList());
                    methodContract.Preconditions.Add(pre);
                }

                var posts = new PostconditionGenerator(stateNumberMap[epa.Initial]).GeneratePostconditions(field, transitions);
                methodContract.Postconditions.AddRange(posts);

                // Associate contract
                contractProvider.AssociateMethodWithContract(methodDefinition, methodContract);

                var stmt = new SwitchGenerator(epa, stateNumberMap).GenerateSwitch(field, transitions);

                // Se actualiza el $state en un finally porque los if de adentro del switch tienen que ser ejecutados despues del cuerpo de este metodo
                var stmtsCount = actionBodyBlock.Statements.Count - insertAtIndex;
                var tryBlock   = new BlockStatement();
                var bodyStmts  = new List <IStatement>(actionBodyBlock.Statements.GetRange(insertAtIndex, stmtsCount));
                tryBlock.Statements.AddRange(bodyStmts);

                var finallyBlock = new BlockStatement();
                finallyBlock.Statements.Add(stmt);

                var tryStmt = new TryCatchFinallyStatement
                {
                    TryBody     = tryBlock,
                    FinallyBody = finallyBlock
                };

                actionBodyBlock.Statements.RemoveRange(insertAtIndex, stmtsCount);
                actionBodyBlock.Statements.Insert(insertAtIndex, tryStmt);
            }

            return(new CciAssembly(module, contractProvider));
        }