public void ReturnFragmentType_MethodWithAnnotatedReturn_ReturnsNull()
        {
            Method sample         = TestHelper.GetSample <FragmentUtilitySample> ("ReturnFragment");
            var    returnFragment = FragmentUtility.ReturnFragmentType(sample);

            Assert.That(returnFragment, Is.EqualTo(Fragment.CreateNamed("ReturnFragmentType")));
        }
        public void ReturnFragmentType_ExplicitlyImplementedInterfaceMethod_ReturnsFragment()
        {
            Method sample         = TestHelper.GetSample <ClassWithExplicitlyDeclaredMethodReturningFragment> ("InjectionCop.IntegrationTests.Utilities.InterfaceWithReturnFragment.MethodWithReturnFragment");
            var    returnFragment = FragmentUtility.ReturnFragmentType(sample);

            Assert.That(returnFragment, Is.EqualTo(Fragment.CreateNamed("ReturnFragmentType")));
        }
        public void ReturnFragmentType_ImplementedInterfaceMethod_ReturnsFragment()
        {
            Method sample         = TestHelper.GetSample <ClassWithMethodReturningFragment> ("MethodWithReturnFragment");
            var    returnFragment = FragmentUtility.ReturnFragmentType(sample);

            Assert.That(returnFragment, Is.EqualTo(Fragment.CreateNamed("ReturnFragmentType")));
        }
示例#4
0
        public bool IsAssignableTo(string symbolName, Fragment fragmentType)
        {
            ArgumentUtility.CheckNotNull("symbolName", symbolName);
            ArgumentUtility.CheckNotNull("fragmentType", fragmentType);

            return(FragmentUtility.FragmentTypesAssignable(GetFragmentType(symbolName), fragmentType));
        }
        public void ReturnFragmentType_NonAnnotatedMethod_ReturnsEmptyFragment()
        {
            Method sample         = TestHelper.GetSample <FragmentUtilitySample> ("NoReturnFragment");
            var    returnFragment = FragmentUtility.ReturnFragmentType(sample);

            Assert.That(returnFragment, Is.EqualTo(Fragment.CreateEmpty()));
        }
        public void ContainsFragment_ContainsStronglyTypedSqlFragmentParameter_True()
        {
            TypeNode stringTypeNode = IntrospectionUtility.TypeNodeFactory <string>();
            Method   sample         = TestHelper.GetSample <FragmentUtilitySample>("ContainsStronglyTypedSqlFragmentParameter", stringTypeNode);
            bool     isResult       = FragmentUtility.ContainsFragment(sample.Parameters[0].Attributes);

            Assert.That(isResult, Is.True);
        }
        public void GetFragmentType_ContainsStronglyTypedSqlFragmentParameter_True()
        {
            TypeNode stringTypeNode = IntrospectionUtility.TypeNodeFactory <string>();
            Method   sample         = TestHelper.GetSample <FragmentUtilitySample>("ContainsStronglyTypedSqlFragmentParameter", stringTypeNode);
            var      fragmentType   = FragmentUtility.GetFragmentType(sample.Parameters[0].Attributes);

            Assert.That(fragmentType, Is.EqualTo(Fragment.CreateNamed("SqlFragment")));
        }
        public void GetFragmentType_ContainsNonFragmentParameter_ThrowsException()
        {
            TypeNode stringTypeNode   = IntrospectionUtility.TypeNodeFactory <string>();
            Method   sample           = TestHelper.GetSample <FragmentUtilitySample>("ContainsNonFragmentParameter", stringTypeNode);
            var      returnedFragment = FragmentUtility.GetFragmentType(sample.Parameters[0].Attributes);

            Assert.That(returnedFragment, Is.EqualTo(Fragment.CreateEmpty()));
        }
        public void IsFragment_ContainsNonFragmentParameter_False()
        {
            TypeNode stringTypeNode = IntrospectionUtility.TypeNodeFactory <string>();
            Method   sample         = TestHelper.GetSample <FragmentUtilitySample>("ContainsNonFragmentParameter", stringTypeNode);
            bool     isResult       = FragmentUtility.IsFragment(sample.Parameters[0].Attributes[0]);

            Assert.That(isResult, Is.False);
        }
示例#10
0
        private void CheckParameter(Expression operand, Fragment expectedFragment)
        {
            Fragment operandFragmentType = _symbolTable.InferFragmentType(operand);

            if (!FragmentUtility.FragmentTypesAssignable(operandFragmentType, expectedFragment))
            {
                ProblemMetadata problemMetadata = new ProblemMetadata(operand.UniqueKey, operand.SourceContext, expectedFragment, operandFragmentType);
                PassProblem(operand, problemMetadata);
            }
        }
示例#11
0
        private void AnalyzeFields()
        {
            IEnumerable <Field> fields = IntrospectionUtility.FilterFields(_method.DeclaringType);

            foreach (Field field in fields)
            {
                if (field.Attributes != null && FragmentUtility.ContainsFragment(field.Attributes))
                {
                    _result.MakeUnsafe(field.Name.Name);
                }
            }
        }
        private ISymbolTable GetDelegatesEnvironment(DelegateNode sourceDelegateType)
        {
            ISymbolTable environment = new SymbolTable(_blockParserContext.BlacklistManager);

            foreach (Parameter parameter in sourceDelegateType.Parameters)
            {
                if (parameter.Attributes != null)
                {
                    environment.MakeSafe(parameter.Name.Name, FragmentUtility.GetFragmentType(parameter.Attributes));
                }
            }
            return(environment);
        }
        private void HandleVoidReturn(ReturnNode returnNode, HandleContext context)
        {
            foreach (var returnCondition in _blockParserContext.ReturnConditions)
            {
                Fragment blockInternalFragmentType = context.SymbolTable.GetFragmentType(returnCondition.Symbol);

                if (!FragmentUtility.FragmentTypesAssignable(blockInternalFragmentType, returnCondition.Fragment))
                {
                    ProcessBlockInternalPreConditionViolation(
                        returnNode, returnCondition, blockInternalFragmentType, context);
                }
            }
        }
示例#14
0
        private void PassReturnFragmentTypeToContext(Expression operand, Parameter parameter)
        {
            string   symbol       = IntrospectionUtility.GetVariableName(operand);
            Fragment fragmentType = FragmentUtility.GetFragmentType(parameter.Attributes);

            if (FragmentUtility.ContainsFragment(parameter.Attributes))
            {
                _symbolTable.MakeSafe(symbol, fragmentType);
            }
            else
            {
                _symbolTable.MakeUnsafe(symbol);
            }
        }
        private Fragment GetDelegateTypesReturnFragment(DelegateNode sourceDelegateType)
        {
            var returnFragment = Fragment.CreateEmpty();

            foreach (Member member in sourceDelegateType.Members)
            {
                if (member.Name.Name == "Invoke")
                {
                    Method invoke = (Method)member;
                    returnFragment = FragmentUtility.ReturnFragmentType(invoke);
                }
            }
            return(returnFragment);
        }
示例#16
0
 private void SetSymbolFragmentType(string name, AttributeNodeCollection attributes)
 {
     if (!_result.Contains(name))
     {
         if (FragmentUtility.ContainsFragment(attributes))
         {
             Fragment fragmentType = FragmentUtility.GetFragmentType(attributes);
             _result.MakeSafe(name, fragmentType);
         }
         else
         {
             _result.MakeUnsafe(name);
         }
     }
 }
示例#17
0
        private Fragment InferMethodCallReturnFragmentType(MethodCall methodCall)
        {
            Fragment returnFragment;
            Method   calleeMethod = IntrospectionUtility.ExtractMethod(methodCall);

            if (_customInferenceController.Infers(calleeMethod))
            {
                returnFragment = _customInferenceController.InferFragmentType(methodCall, this);
            }
            else
            {
                returnFragment = FragmentUtility.InferReturnFragmentType(calleeMethod);
            }

            return(returnFragment);
        }
示例#18
0
        private void ValidateAssignmentOnField(AssignmentStatement assignmentStatement, HandleContext context)
        {
            Field    targetField        = IntrospectionUtility.GetField(assignmentStatement.Target);
            Fragment targetFragmentType = FragmentUtility.GetFragmentType(targetField.Attributes);
            Fragment givenFragmentType  = context.SymbolTable.InferFragmentType(assignmentStatement.Source);

            if (!FragmentUtility.FragmentTypesAssignable(givenFragmentType, targetFragmentType))
            {
                ProblemMetadata problemMetadata = new ProblemMetadata(
                    targetField.UniqueKey,
                    targetField.SourceContext,
                    targetFragmentType,
                    givenFragmentType);
                _blockParserContext.ProblemPipe.AddProblem(problemMetadata);
            }
        }
示例#19
0
        private Fragment[] GetParameterFragmentTypes(Method calleeMethod)
        {
            List <string> parameterTypes = IntrospectionUtility.GetParameterTypes(calleeMethod);
            string        assemblyName   = calleeMethod.ContainingAssembly().Name;

            FragmentSignature signature = _blacklistManager.GetFragmentTypes(assemblyName, calleeMethod.DeclaringType.FullName, calleeMethod.Name.Name, parameterTypes);

            Fragment[] parameterFragmentTypes;
            if (signature == null)
            {
                parameterFragmentTypes = FragmentUtility.GetAnnotatedParameterFragmentTypes(calleeMethod);
            }
            else
            {
                parameterFragmentTypes = signature.ParameterFragmentTypes.Select(name => name != null ? Fragment.CreateNamed(name) : Fragment.CreateEmpty()).ToArray();
            }
            return(parameterFragmentTypes);
        }
        protected void MatchFragments(Method baseMethod, Method overridingMethod)
        {
            foreach (var parameter in baseMethod.Parameters)
            {
                var fragmentType = FragmentUtility.GetFragmentType(parameter.Attributes);

                if (fragmentType != Fragment.CreateEmpty())
                {
                    var overriddenParameter    = overridingMethod.Parameters[parameter.ParameterListIndex];
                    var overriddenFragmentType = FragmentUtility.GetFragmentType(overriddenParameter.Attributes);

                    if (overriddenFragmentType != fragmentType && overriddenFragmentType != Fragment.CreateEmpty())
                    {
                        AddProblem(new ProblemMetadata(overridingMethod.UniqueKey, overridingMethod.SourceContext, fragmentType, overriddenFragmentType));
                    }
                }
            }
        }
        public void Analyze(MethodCall methodCall, ISymbolTable context, List <IPreCondition> preConditions)
        {
            Method method = IntrospectionUtility.ExtractMethod(methodCall);

            if (Analyzes(method) && methodCall.Callee is MemberBinding)
            {
                MemberBinding memberBinding = (MemberBinding)methodCall.Callee;

                if (IsFragmentParameterInferenceMethod(method))
                {
                    string variableName;
                    if (IntrospectionUtility.IsVariable(memberBinding.TargetObject, out variableName))
                    {
                        Fragment parameterFragment    = ParameterFragmentUtility.ParameterFragmentIntersection(methodCall, context);
                        Fragment targetObjectFragment = context.GetFragmentType(variableName);
                        if (targetObjectFragment == Fragment.CreateLiteral() || targetObjectFragment.Undefined)
                        {
                            context.MakeSafe(variableName, parameterFragment);
                        }
                        else
                        {
                            if (targetObjectFragment == Fragment.CreateEmpty() && parameterFragment != Fragment.CreateLiteral()) // && parameterFragment != Fragment.CreateEmpty()
                            {
                                ProblemMetadata problemMetadata = new ProblemMetadata(methodCall.UniqueKey, methodCall.SourceContext, parameterFragment, targetObjectFragment);
                                IPreCondition   precondition    = new CustomInferencePreCondition(variableName, parameterFragment, problemMetadata);
                                preConditions.Add(precondition);
                            }
                            else if (!FragmentUtility.FragmentTypesAssignable(parameterFragment, targetObjectFragment))
                            {
                                context.MakeUnsafe(variableName);
                            }
                        }
                    }
                }
                else if (!IsSafeMethod(method))
                {
                    string variableName;
                    if (IntrospectionUtility.IsVariable(memberBinding.TargetObject, out variableName))
                    {
                        context.MakeUnsafe(variableName);
                    }
                }
            }
        }
示例#22
0
        public Fragment InferFragmentType(Expression expression)
        {
            ArgumentUtility.CheckNotNull("expression", expression);

            var fragmentType = Fragment.CreateEmpty();

            if (expression is Literal)
            {
                fragmentType = Fragment.CreateLiteral();
            }
            else if (expression is Local)
            {
                Local local = (Local)expression;
                fragmentType = Lookup(local.Name.Name);
            }
            else if (expression is Parameter)
            {
                Parameter parameter = (Parameter)expression;
                fragmentType = Lookup(parameter.Name.Name);
            }
            else if (expression is MemberBinding)
            {
                MemberBinding memberBinding = (MemberBinding)expression;
                fragmentType = FragmentUtility.GetMemberBindingFragmentType(memberBinding);
            }
            else if (expression is MethodCall)
            {
                MethodCall methodCall = (MethodCall)expression;
                fragmentType = InferMethodCallReturnFragmentType(methodCall);
            }
            else if (expression is UnaryExpression)
            {
                UnaryExpression unaryExpression = (UnaryExpression)expression;
                fragmentType = InferFragmentType(unaryExpression.Operand);
            }
            else if (expression is Indexer)
            {
                Indexer indexer = (Indexer)expression;
                fragmentType = InferFragmentType(indexer.Object);
            }

            return(fragmentType);
        }
示例#23
0
        private List <ReturnCondition> ReferenceAndOutConditions(Method method)
        {
            List <ReturnCondition> referenceAndOutConditions = new List <ReturnCondition>();

            foreach (var parameter in method.Parameters)
            {
                if (parameter.Type is Reference && parameter.Attributes != null)
                {
                    Fragment parameterFragmentType = FragmentUtility.GetFragmentType(parameter.Attributes);
                    if (parameterFragmentType != null)
                    {
                        string          parameterName   = IntrospectionUtility.GetVariableName(parameter);
                        ReturnCondition returnCondition = new ReturnCondition(parameterName, parameterFragmentType);
                        referenceAndOutConditions.Add(returnCondition);
                    }
                }
            }
            return(referenceAndOutConditions);
        }
示例#24
0
        public MethodGraphBuilder(Method method, IBlacklistManager blacklistManager, IProblemPipe problemPipe)
        {
            ArgumentUtility.CheckNotNull("method", method);
            _blacklistManager = ArgumentUtility.CheckNotNull("blacklistManager", blacklistManager);
            _problemPipe      = ArgumentUtility.CheckNotNull("problemPipe", problemPipe);
            bool isInterfaceMethod = method.Body.Statements == null;

            if (!isInterfaceMethod)
            {
                _methodBody = method.Body;
                _referenceAndOutConditions = ReferenceAndOutConditions(method);
                _result = null;
            }
            else
            {
                _result = new MethodGraph(-1, new Dictionary <int, BasicBlock>());
            }
            _returnFragment = FragmentUtility.ReturnFragmentType(method);
        }
示例#25
0
        private void AddAssignmentPreCondition(AssignmentStatement assignmentStatement, HandleContext context)
        {
            Field    targetField        = IntrospectionUtility.GetField(assignmentStatement.Target);
            Fragment targetFragmentType = FragmentUtility.GetFragmentType(targetField.Attributes);

            if (targetFragmentType != Fragment.CreateEmpty())
            {
                ProblemMetadata problemMetadata = new ProblemMetadata(
                    assignmentStatement.UniqueKey,
                    assignmentStatement.SourceContext,
                    targetFragmentType,
                    Fragment.CreateNamed("??"));
                string sourceSymbol = IntrospectionUtility.GetVariableName(assignmentStatement.Source);
                if (sourceSymbol != null)
                {
                    AssignabilityPreCondition preCondition = new AssignabilityPreCondition(sourceSymbol, targetFragmentType, problemMetadata);
                    context.PreConditions.Add(preCondition);
                }
            }
        }
示例#26
0
        private void CheckMembers(TypeNode type)
        {
            foreach (Member member in type.Members)
            {
                if (member is Method)
                {
                    var method            = (Method)member;
                    var fragmentSignature = GetFragmentSignatureFromConfiguration(type, method);

                    if (!FragmentUtility.IsFragmentGenerator(method) &&
                        (fragmentSignature == null || !fragmentSignature.IsGenerator))
                    {
                        Stopwatch stopwatch = new Stopwatch();
                        stopwatch.Start();
                        Parse(method);
                        stopwatch.Stop();
                        _methodProfilingResults.Add(method.FullName, stopwatch.Elapsed);
                    }
                }
            }
        }
        protected override bool ViolationCheckStrategy(ISymbolTable context)
        {
            Fragment givenFragment = context.GetFragmentType(_symbol);

            return(!FragmentUtility.FragmentTypesAssignable(givenFragment, _fragment));
        }
        public void IsFragmentGenerator_CustomFragmentGenerator_True()
        {
            Method sampleMethod = TestHelper.GetSample <FragmentUtilitySample>("CustomFragmentGenerator");

            Assert.That(FragmentUtility.IsFragmentGenerator(sampleMethod), Is.True);
        }
        public void IsFragmentGenerator_ReturnFragment_False()
        {
            Method sampleMethod = TestHelper.GetSample <FragmentUtilitySample>("ReturnFragment");

            Assert.That(FragmentUtility.IsFragmentGenerator(sampleMethod), Is.False);
        }
 public void NamedFragmentAssignableToUndefinedFragment()
 {
     FragmentUtility.FragmentTypesAssignable(Fragment.CreateNamed("dummy"), Fragment.CreateUndefined());
 }