Example #1
0
        public static bool TryMatchPattern(
            ISyntaxFacts syntaxFacts,
            IConditionalOperation ifOperation,
            out ISimpleAssignmentOperation trueAssignment,
            out ISimpleAssignmentOperation falseAssignment)
        {
            trueAssignment  = null;
            falseAssignment = null;

            var trueStatement  = ifOperation.WhenTrue;
            var falseStatement = ifOperation.WhenFalse;

            trueStatement  = UseConditionalExpressionHelpers.UnwrapSingleStatementBlock(trueStatement);
            falseStatement = UseConditionalExpressionHelpers.UnwrapSingleStatementBlock(falseStatement);

            if (!TryGetAssignment(trueStatement, out trueAssignment) ||
                !TryGetAssignment(falseStatement, out falseAssignment))
            {
                return(false);
            }

            // The left side of both assignment statements has to be syntactically identical (modulo
            // trivia differences).
            if (!syntaxFacts.AreEquivalent(trueAssignment.Target.Syntax, falseAssignment.Target.Syntax))
            {
                return(false);
            }

            return(UseConditionalExpressionHelpers.CanConvert(
                       syntaxFacts, ifOperation, trueAssignment, falseAssignment));
        }
Example #2
0
        private bool TryConvertWhenAssignmentToLocalDeclaredImmediateAbove(
            ISyntaxFactsService syntaxFacts, SyntaxEditor editor, IConditionalOperation ifOperation,
            ISimpleAssignmentOperation trueAssignment, ISimpleAssignmentOperation falseAssignment,
            TExpressionSyntax conditionalExpression)
        {
            if (!TryFindMatchingLocalDeclarationImmediatelyAbove(
                    ifOperation, trueAssignment, falseAssignment,
                    out var localDeclarationOperation, out var declarator))
            {
                return(false);
            }

            // We found a valid local declaration right above the if-statement.
            var localDeclaration = localDeclarationOperation.Syntax;
            var variable         = GetDeclaratorSyntax(declarator);

            // Initialize that variable with the conditional expression.
            var updatedVariable = WithInitializer(variable, conditionalExpression);

            // Because we merged the initialization and the variable, the variable may now be able
            // to use 'var' (c#), or elide its type (vb).  Add the simplification annotation
            // appropriately so that can happen later down the line.
            var updatedLocalDeclaration = localDeclaration.ReplaceNode(variable, updatedVariable);

            updatedLocalDeclaration = AddSimplificationToType(
                (TLocalDeclarationStatementSyntax)updatedLocalDeclaration);

            editor.ReplaceNode(localDeclaration, updatedLocalDeclaration);
            editor.RemoveNode(ifOperation.Syntax, GetRemoveOptions(syntaxFacts, ifOperation.Syntax));
            return(true);
        }
Example #3
0
        public override void VisitSimpleAssignment(ISimpleAssignmentOperation operation)
        {
            Assert.Equal(OperationKind.SimpleAssignment, operation.Kind);
            bool isRef = operation.IsRef;

            VisitAssignment(operation);
        }
        public static void RegisterMemberAccess(this AnalysisContext context, Action <InvocationAnalysisContext> action)
        {
            var operationKinds = new[]
            {
                OperationKind.Invocation,
                OperationKind.SimpleAssignment,
                OperationKind.VariableDeclaration,
                OperationKind.ObjectCreation,
                OperationKind.FieldInitializer,
                OperationKind.FieldReference,
            };

            context.RegisterOperationAction(ctx =>
            {
                ISymbol?symbol = ctx.Operation switch
                {
                    IInvocationOperation invocation => invocation.TargetMethod,
                    IPropertyReferenceOperation property => property.Property.Type,
                    IObjectCreationOperation creation => creation.Type,
                    ISimpleAssignmentOperation assignment => assignment.Type,
                    IFieldInitializerOperation fieldInitializer => fieldInitializer.Type,
                    IFieldReferenceOperation fieldRef => fieldRef.Type,
                    IVariableDeclarationOperation variableDeclaration => variableDeclaration.Type,
                    _ => null,
                };

                if (symbol is null)
                {
                    return;
                }

                var location = ctx.Operation.Syntax.GetLocation();
                var newCtx   = new InvocationAnalysisContext(symbol, location, ctx.Compilation, ctx.Options, ctx.ReportDiagnostic, ctx.CancellationToken);

                action(newCtx);
            }, operationKinds);

            context.RegisterSymbolAction(ctx =>
            {
                var symbol = ctx.Symbol switch
                {
                    IPropertySymbol property => property.Type,
                    IParameterSymbol parameter => parameter.Type,
                    IMethodSymbol method => method.ReturnsVoid ? null : method.ReturnType,
                    IFieldSymbol field => field.Type,
                    _ => null,
                };

                if (symbol is null)
                {
                    return;
                }

                var location = ctx.Symbol.Locations[0];
                var newCtx   = new InvocationAnalysisContext(symbol, location, ctx.Compilation, ctx.Options, ctx.ReportDiagnostic, ctx.CancellationToken);

                action(newCtx);
            }, SymbolKind.Property, SymbolKind.Method, SymbolKind.Parameter, SymbolKind.Field);
        }
Example #5
0
                public override void VisitSimpleAssignment([NotNull] ISimpleAssignmentOperation operation)
                {
                    base.VisitSimpleAssignment(operation);

                    if (operation.Target is ILocalReferenceOperation targetLocal && currentLocal.Equals(targetLocal.Local))
                    {
                        AnalyzeAssignmentValue(operation.Value);
                    }
                }
Example #6
0
            public override void VisitSimpleAssignment([NotNull] ISimpleAssignmentOperation operation)
            {
                if (operation.Target is ILocalReferenceOperation targetLocal && local.Equals(targetLocal.Local))
                {
                    TrySetEvent(operation.Value);
                }

                base.VisitSimpleAssignment(operation);
            }
Example #7
0
        private static bool AnalyzeAssignmentToMember <T>(ISimpleAssignmentOperation assignmentOperation, T instance, Func <T, T, bool> equalityComparer) where T : class, IOperation
        {
            // Check every simple assignments target in a statement for equality to `instance`
            while (assignmentOperation.Value.Kind == OperationKind.SimpleAssignment)
            {
                assignmentOperation = (ISimpleAssignmentOperation)assignmentOperation.Value;

                if (assignmentOperation.Target is T operationValue &&
                    equalityComparer(instance, operationValue))
                {
                    return(true);
                }
            }
            return(false);
        }
Example #8
0
        private static bool TryGetAssignment(
            IOperation statement, out ISimpleAssignmentOperation assignment)
        {
            // Both the WhenTrue and WhenFalse statements must be of the form:
            //      target = value;
            if (!(statement is IExpressionStatementOperation exprStatement) ||
                !(exprStatement.Operation is ISimpleAssignmentOperation assignmentOp) ||
                assignmentOp.Target == null)
            {
                assignment = default;
                return(false);
            }

            assignment = assignmentOp;
            return(true);
        }
Example #9
0
        private void ConvertOnlyIfToConditionalExpression(
            SyntaxEditor editor, IConditionalOperation ifOperation,
            ISimpleAssignmentOperation trueAssignment, ISimpleAssignmentOperation falseAssignment,
            TExpressionSyntax conditionalExpression)
        {
            var generator           = editor.Generator;
            var ifStatement         = (TIfStatementSyntax)ifOperation.Syntax;
            var expressionStatement = (TStatementSyntax)generator.ExpressionStatement(
                generator.AssignmentStatement(
                    trueAssignment.Target.Syntax,
                    conditionalExpression)).WithTriviaFrom(ifStatement);

            editor.ReplaceNode(
                ifOperation.Syntax,
                this.WrapWithBlockIfAppropriate(ifStatement, expressionStatement));
        }
        /// <summary>
        /// Gets the operation for the object being created that is being referenced by <paramref name="operation"/>.
        /// If the operation is referencing an implicit or an explicit this/base/Me/MyBase/MyClass instance, then we return "null".
        /// </summary>
        public static IOperation GetInstance(this IInstanceReferenceOperation operation)
        {
            // VB object initializer allows accessing the members of the object being created with "." operator.
            // The syntax of such an IInstanceReferenceOperation points to the object being created.
            // Check for such an  IObjectCreationOperation or IAnonymousObjectCreationOperation with matching syntax.
            // For example, instance reference for members ".Field1" and ".Field2" in "New C() With { .Field1 = 0, .Field2 = .Field1 }".
            Func <IObjectCreationOperation, bool> isObjectCreation = creation => creation.Syntax == operation.Syntax;
            var objectCreation = operation.GetAncestor(OperationKind.ObjectCreation, isObjectCreation);

            if (objectCreation != null)
            {
                return(objectCreation);
            }

            Func <IAnonymousObjectCreationOperation, bool> isAnonymousObjectCreation = creation => creation.Syntax == operation.Syntax;
            var anonymousObjectCreation = operation.GetAncestor(OperationKind.AnonymousObjectCreation, isAnonymousObjectCreation);

            if (anonymousObjectCreation != null)
            {
                return(anonymousObjectCreation);
            }

            // IInstanceReferenceOperation on left of an IMemberInitializerOperation refers to the ancestor IObjectCreationOperation/IAnonymousObjectCreationOperation/IMemberInitializerOperation.
            // For example, implicit instance reference for member initializer "AnotherType" in "new C() { AnotherType = { IntField = 0 } };", where "AnotherType" is a member of named type kind.
            IMemberInitializerOperation parentMemberInitializer = operation.GetAncestor <IMemberInitializerOperation>(OperationKind.MemberInitializer);

            if (parentMemberInitializer != null &&
                parentMemberInitializer.InitializedMember.DescendantsAndSelf().Contains(operation))
            {
                return(parentMemberInitializer.GetCreation());
            }

            // IInstanceReferenceOperation on left of an ISimpleAssignmentOperation with an IObjectOrCollectionInitializerOperation parent refers to the parenting IObjectCreationOperation/IAnonymousObjectCreationOperation/IMemberInitializerOperation.
            // For example, implicit instance reference for "IntField" in "new C() { IntField = 0 };".
            ISimpleAssignmentOperation parentSimpleAssignmentInitialier = operation.GetAncestor <ISimpleAssignmentOperation>(OperationKind.SimpleAssignment);

            if (parentSimpleAssignmentInitialier != null &&
                parentSimpleAssignmentInitialier.Parent is IObjectOrCollectionInitializerOperation &&
                parentSimpleAssignmentInitialier.Target.DescendantsAndSelf().Contains(operation))
            {
                return(parentSimpleAssignmentInitialier.Parent.Parent);
            }

            // For all cases, IInstanceReferenceOperation refers to the implicit or explicit this/base/Me/MyBase/MyClass reference.
            // We return null for such cases.
            return(null);
        }
        public override void VisitSimpleAssignment(ISimpleAssignmentOperation operation)
        {
            base.VisitSimpleAssignment(operation);

            //TODO: support other than local references
            var target = operation.Target as ILocalReferenceOperation;

            if (!target.Type.IsNullable())
            {
                return;
            }

            var targetEval = CurrentEval[target.Local];
            var value      = operation.Value;

            if (value is IConversionOperation conversion)
            {
                value = conversion.Operand;
            }


            switch (value)
            {
            case ILiteralOperation _ when value.ConstantValue.HasValue && value.ConstantValue.Value == null: //null value
            case IDefaultValueOperation _:                                                                   //default value
                targetEval.Update(NullLatticeValue.Null);
                break;

            case ILiteralOperation literal:
            case IObjectCreationOperation constructorCall:
                targetEval.Update(NullLatticeValue.NotNull);
                break;

            case ILocalReferenceOperation localRef:
                var sourceRef = CurrentEval[localRef.Local];
                targetEval.Update(sourceRef.Value);
                break;

            case IFieldReferenceOperation fieldRef when fieldRef.Field.ContainingType.Name == "String" && fieldRef.Field.Name == "Empty":
                targetEval.Update(NullLatticeValue.NotNull);
                break;

            default:
                throw new NotImplementedException();
            }
        }
Example #12
0
        private bool TryFindMatchingLocalDeclarationImmediatelyAbove(
            IConditionalOperation ifOperation, ISimpleAssignmentOperation trueAssignment, ISimpleAssignmentOperation falseAssignment,
            out IVariableDeclarationGroupOperation localDeclaration, out IVariableDeclaratorOperation declarator)
        {
            localDeclaration = null;
            declarator       = null;

            // See if both assignments are to the same local.
            if (!(trueAssignment.Target is ILocalReferenceOperation trueLocal) ||
                !(falseAssignment.Target is ILocalReferenceOperation falseLocal) ||
                !Equals(trueLocal.Local, falseLocal.Local))
            {
                return(false);
            }

            // If so, see if that local was declared immediately above the if-statement.
            var parentBlock = ifOperation.Parent as IBlockOperation;

            if (parentBlock == null)
            {
                return(false);
            }

            var ifIndex = parentBlock.Operations.IndexOf(ifOperation);

            if (ifIndex <= 0)
            {
                return(false);
            }

            localDeclaration = parentBlock.Operations[ifIndex - 1] as IVariableDeclarationGroupOperation;
            if (localDeclaration == null)
            {
                return(false);
            }

            if (localDeclaration.Declarations.Length != 1)
            {
                return(false);
            }

            var declaration = localDeclaration.Declarations[0];
            var declarators = declaration.Declarators;

            if (declarators.Length != 1)
            {
                return(false);
            }

            declarator = declarators[0];
            var variable = declarator.Symbol;

            if (!Equals(variable, trueLocal.Local))
            {
                // wasn't a declaration of the local we're assigning to.
                return(false);
            }

            var variableName = variable.Name;

            var variableInitializer = declarator.Initializer ?? declaration.Initializer;

            if (variableInitializer?.Value != null)
            {
                var unwrapped = UnwrapImplicitConversion(variableInitializer.Value);
                // the variable has to either not have an initializer, or it needs to be basic
                // literal/default expression.
                if (!(unwrapped is ILiteralOperation) &&
                    !(unwrapped is IDefaultValueOperation))
                {
                    return(false);
                }
            }

            // If the variable is referenced in the condition of the 'if' block, we can't merge the
            // declaration and assignments.
            return(!ReferencesLocalVariable(ifOperation.Condition, variable));
        }
Example #13
0
        private void ProcessSimpleAssignmentOper(ISimpleAssignmentOperation assignOper, List <string> sharedFields, IOperation inst)
        {
            if (assignOper.Syntax.Kind().ToString() == "SimpleAssignmentExpression")
            {
                AssignmentExpressionSyntax assignSynt = (AssignmentExpressionSyntax)assignOper.Syntax;

                string leftOperand = "";
                int    leftIndex   = -1;


                if (assignSynt.Left.Kind().ToString() == "IdentifierName")
                {
                    IdentifierNameSyntax leftOperandExpr = (IdentifierNameSyntax)assignSynt.Left;
                    leftOperand = leftOperandExpr.Identifier.ToString();
                    leftIndex   = sharedFields.IndexOf(leftOperand);
                }
                else if (assignSynt.Left.Kind().ToString() == "SimpleMemberAccessExpression")
                {
                    MemberAccessExpressionSyntax leftOperandExpr = (MemberAccessExpressionSyntax)assignSynt.Left;
                    leftOperand = leftOperandExpr.Name.ToString();
                    leftIndex   = sharedFields.IndexOf(leftOperand);
                }


                string rightOperand = "";
                int    rightIndex   = -1;


                if (assignSynt.Right.Kind().ToString() == "IdentifierName")
                {
                    IdentifierNameSyntax rightOperandExpr = (IdentifierNameSyntax)assignSynt.Right;
                    rightOperand = rightOperandExpr.Identifier.ToString();
                    rightIndex   = sharedFields.IndexOf(rightOperand);

                    if (rightIndex != -1 || methodInvocReturnRegs.IndexOf(rightOperand) != -1)
                    {
                        //Debug.Assert(leftIndex == 0);
                        conflictUnit.Add(new Tuple <Accesses, string, IOperation>(Accesses.Read, rightOperand, inst));
                    }
                }
                else if (assignSynt.Right.Kind().ToString() == "SimpleMemberAccessExpression")
                {
                    MemberAccessExpressionSyntax rightOperandExpr = (MemberAccessExpressionSyntax)assignSynt.Right;
                    rightOperand = rightOperandExpr.Name.ToString();
                    rightIndex   = sharedFields.IndexOf(rightOperand);

                    if (rightIndex != -1)
                    {
                        //Debug.Assert(leftIndex == 0);
                        conflictUnit.Add(new Tuple <Accesses, string, IOperation>(Accesses.Write, rightOperand, inst));
                    }
                }
                else if (assignSynt.Right.Kind().ToString() == "InvocationExpression")
                {
                    InvocationExpressionSyntax invocInst = (InvocationExpressionSyntax)assignSynt.Right;
                    ProcessInvocationExpr(invocInst, inst, leftOperand);
                    //conflictUnit.Add(new Tuple<Accesses, string, IOperation>(Accesses.Invocation, "", inst));
                }
                else if (assignSynt.Right.Kind().ToString() == "AwaitExpression")
                {
                    AwaitExpressionSyntax awaitInst = (AwaitExpressionSyntax)assignSynt.Right;

                    if (awaitInst.Expression.Kind().ToString() == "InvocationExpression")
                    {
                        InvocationExpressionSyntax invocInst = (InvocationExpressionSyntax)awaitInst.Expression;
                        ProcessInvocationExpr(invocInst, inst, leftOperand);
                        isAsync = true;
                    }
                    else if (awaitInst.Expression.Kind().ToString() == "IdentifierName")
                    {
                        IdentifierNameSyntax indentInst = (IdentifierNameSyntax)awaitInst.Expression;
                        isAsync      = true;
                        rightOperand = indentInst.Identifier.ValueText;
                        awaitInvocRel.Add(new Tuple <string, string>(rightOperand, leftOperand));
                        methodInvocReturnRegs.Add(leftOperand);
                    }
                    conflictUnit.Add(new Tuple <Accesses, string, IOperation>(Accesses.Await, leftOperand, inst));
                }

                if (leftIndex != -1)
                {
                    //Debug.Assert(rightIndex == 0);
                    conflictUnit.Add(new Tuple <Accesses, string, IOperation>(Accesses.Write, leftOperand, inst));
                }
            }
        }
Example #14
0
        private void MethodSummary(ImmutableArray <BasicBlock> bb, List <string> sharedFields)
        {
            foreach (BasicBlock b in bb)
            {
                var a = b.GetType();
                var c = b.BranchValue;

                if (b.Operations != null)
                {
                    foreach (IOperation inst in b.Operations)
                    {
                        //Console.WriteLine($"inst.Syntax.ToSring() '{inst.Syntax.ToString()}'");

                        if (inst.Kind.ToString() == "ExpressionStatement")
                        {
                            IExpressionStatementOperation exprInst = (IExpressionStatementOperation)inst;

                            if (exprInst.Operation != null)
                            {
                                //if (exprInst.Operation.Kind.ToString() == Kind = SimpleAssignment)
                                //if (exprInst.Operation.Kind.ToString() == Kind = SimpleAssignment)
                                if (exprInst.Operation.Kind.ToString() == "SimpleAssignment")
                                {
                                    ISimpleAssignmentOperation assignInst = (ISimpleAssignmentOperation)exprInst.Operation;
                                    ProcessSimpleAssignmentOper(assignInst, sharedFields, inst);
                                }
                                else if (exprInst.Operation.Kind.ToString() == "Await")
                                {
                                    IAwaitOperation awaitInst = (IAwaitOperation)exprInst.Operation;

                                    if (awaitInst.Operation.Kind.ToString() == "Invocation")
                                    {
                                        IInvocationOperation invocInst = (IInvocationOperation)awaitInst.Operation;
                                        string leftOperand             = "";
                                        ProcessInvocationOper(invocInst, inst, leftOperand);
                                        isAsync = true;
                                        //conflictUnit.Add(new Tuple<Accesses, string, IOperation>(Accesses.Invocation, "", inst));
                                    }
                                    else if (awaitInst.Operation.Kind.ToString() == "Invalid")
                                    {
                                        ExpressionSyntax localvar = (ExpressionSyntax)awaitInst.Operation.Syntax;
                                        //var v = localvar.Kind().ToString();
                                        if (localvar.Kind().ToString() == "InvocationExpression")
                                        {
                                            InvocationExpressionSyntax invocInst = (InvocationExpressionSyntax)localvar;
                                            string leftOperand = "";
                                            ProcessInvocationExpr(invocInst, inst, leftOperand);
                                            isAsync = true;
                                        }
                                    }
                                    else if (awaitInst.Operation.Kind.ToString() == "IdentifierName")
                                    {
                                        //IdentifierNameSyntax indentInst = (IdentifierNameSyntax)awaitInst.Operation;
                                        isAsync = true;
                                        //rightOperand = indentInst.Identifier.ValueText;
                                        //awaitInvocRel.Add(new Tuple<string, string>(rightOperand, leftOperand));
                                    }
                                    conflictUnit.Add(new Tuple <Accesses, string, IOperation>(Accesses.Await, invocSuffix, inst));
                                }
                                else if (exprInst.Operation.Kind.ToString() == "Invocation")
                                {
                                    IInvocationOperation invocInst = (IInvocationOperation)exprInst.Operation;
                                    string leftOperand             = "";
                                    ProcessInvocationOper(invocInst, inst, leftOperand);
                                    //conflictUnit.Add(new Tuple<Accesses, string, IOperation>(Accesses.Invocation, "", inst));

                                    // invocSyntax = Regex.Replace(invocSyntax, @"(\w.*)(\.Wait\(\))$", "$1");
                                    //invocSyntax = Regex.Replace(invocSyntax, @"(\w.*)(\.)(\w.*)$", "$3");
                                }
                            }
                        }
                        else if (inst.Kind.ToString() == "SimpleAssignment")
                        {
                            ISimpleAssignmentOperation exprInst = (ISimpleAssignmentOperation)inst;
                            ProcessSimpleAssignmentOper(exprInst, sharedFields, inst);
                        }
                    }
                }
            }
        }
Example #15
0
 public virtual void VisitSimpleAssignment(ISimpleAssignmentOperation operation)
 {
     DefaultVisit(operation);
 }
 public override void VisitSimpleAssignment([NotNull] ISimpleAssignmentOperation operation)
 {
     RegisterAssignment(operation.Target);
     base.VisitSimpleAssignment(operation);
 }
Example #17
0
 public override bool VisitSimpleAssignment([NotNull] ISimpleAssignmentOperation operation1,
                                            [CanBeNull] IOperation argument)
 {
     return(argument is ISimpleAssignmentOperation operation2 && AreBaseOperationsEqual(operation1, operation2) &&
            operation1.IsRef == operation2.IsRef);
 }
        public override void Initialize(AnalysisContext context)
        {
            context.EnableConcurrentExecution();

            // Security analyzer - analyze and report diagnostics on generated code.
            context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze | GeneratedCodeAnalysisFlags.ReportDiagnostics);

            context.RegisterCompilationStartAction(
                (CompilationStartAnalysisContext compilationStartAnalysisContext) =>
            {
                if (!compilationStartAnalysisContext.Compilation.TryGetOrCreateTypeByMetadataName(WellKnownTypeNames.SystemWebHttpCookie,
                                                                                                  out INamedTypeSymbol? httpCookieSymbol))
                {
                    return;
                }

                PooledHashSet <(IOperation Operation, ISymbol ContainingSymbol)> rootOperationsNeedingAnalysis = PooledHashSet <(IOperation, ISymbol)> .GetInstance();

                compilationStartAnalysisContext.RegisterOperationBlockStartAction(
                    (OperationBlockStartAnalysisContext operationBlockStartAnalysisContext) =>
                {
                    ISymbol owningSymbol = operationBlockStartAnalysisContext.OwningSymbol;

                    if (owningSymbol.IsConfiguredToSkipAnalysis(
                            operationBlockStartAnalysisContext.Options,
                            Rule,
                            operationBlockStartAnalysisContext.Compilation,
                            operationBlockStartAnalysisContext.CancellationToken))
                    {
                        return;
                    }

                    operationBlockStartAnalysisContext.RegisterOperationAction(
                        (OperationAnalysisContext operationAnalysisContext) =>
                    {
                        ISimpleAssignmentOperation simpleAssignmentOperation =
                            (ISimpleAssignmentOperation)operationAnalysisContext.Operation;

                        if (simpleAssignmentOperation.Target is IPropertyReferenceOperation propertyReferenceOperation &&
                            httpCookieSymbol.Equals(propertyReferenceOperation.Property.ContainingType) &&
                            propertyReferenceOperation.Property.Name == "HttpOnly" &&
                            simpleAssignmentOperation.Value.ConstantValue.HasValue &&
                            simpleAssignmentOperation.Value.ConstantValue.Value.Equals(false))
                        {
                            operationAnalysisContext.ReportDiagnostic(
                                simpleAssignmentOperation.CreateDiagnostic(
                                    Rule));
                        }
                    },
                        OperationKind.SimpleAssignment);

                    operationBlockStartAnalysisContext.RegisterOperationAction(
                        (OperationAnalysisContext operationAnalysisContext) =>
                    {
                        IReturnOperation returnOperation = (IReturnOperation)operationAnalysisContext.Operation;

                        if (httpCookieSymbol.Equals(returnOperation.ReturnedValue?.Type))
                        {
                            lock (rootOperationsNeedingAnalysis)
                            {
                                rootOperationsNeedingAnalysis.Add(
                                    (returnOperation.GetRoot(), operationAnalysisContext.ContainingSymbol));
                            }
                        }
                    },
                        OperationKind.Return);

                    operationBlockStartAnalysisContext.RegisterOperationAction(
                        (OperationAnalysisContext operationAnalysisContext) =>
                    {
                        IArgumentOperation argumentOperation = (IArgumentOperation)operationAnalysisContext.Operation;

                        if (httpCookieSymbol.Equals(argumentOperation.Value.Type))
                        {
                            lock (rootOperationsNeedingAnalysis)
                            {
                                rootOperationsNeedingAnalysis.Add(
                                    (argumentOperation.GetRoot(), operationAnalysisContext.ContainingSymbol));
                            }
                        }
                    },
                        OperationKind.Argument);
                });

                compilationStartAnalysisContext.RegisterCompilationEndAction(
                    (CompilationAnalysisContext compilationAnalysisContext) =>
                {
                    PooledDictionary <(Location Location, IMethodSymbol?Method), HazardousUsageEvaluationResult>?allResults = null;

                    try
                    {
                        lock (rootOperationsNeedingAnalysis)
                        {
                            if (!rootOperationsNeedingAnalysis.Any())
                            {
                                return;
                            }

                            allResults = PropertySetAnalysis.BatchGetOrComputeHazardousUsages(
                                compilationAnalysisContext.Compilation,
                                rootOperationsNeedingAnalysis,
                                compilationAnalysisContext.Options,
                                WellKnownTypeNames.SystemWebHttpCookie,
                                ConstructorMapper,
                                PropertyMappers,
                                HazardousUsageEvaluators,
                                InterproceduralAnalysisConfiguration.Create(
                                    compilationAnalysisContext.Options,
                                    SupportedDiagnostics,
                                    defaultInterproceduralAnalysisKind: InterproceduralAnalysisKind.ContextSensitive,
                                    cancellationToken: compilationAnalysisContext.CancellationToken));
                        }

                        if (allResults == null)
                        {
                            return;
                        }

                        foreach (KeyValuePair <(Location Location, IMethodSymbol?Method), HazardousUsageEvaluationResult> kvp
                                 in allResults)
                        {
                            if (kvp.Value == HazardousUsageEvaluationResult.Flagged)
                            {
                                compilationAnalysisContext.ReportDiagnostic(
                                    Diagnostic.Create(
                                        Rule,
                                        kvp.Key.Location));
                            }
                        }
                    }
                    finally
                    {
                        rootOperationsNeedingAnalysis.Free();
                        allResults?.Free();
                    }
                });
            });
        }
Example #19
0
        public override void VisitSimpleAssignment(ISimpleAssignmentOperation operation)
        {
            bool isRef = operation.IsRef;

            base.VisitSimpleAssignment(operation);
        }
Example #20
0
        public override Scope VisitSimpleAssignment(ISimpleAssignmentOperation operation, Scope currentScope)
        {
            var newScope = operation.Target.Accept(this, currentScope);

            return(operation.Value.Accept(this, newScope));
        }
 public override TAbstractAnalysisValue VisitSimpleAssignment(ISimpleAssignmentOperation operation, object argument)
 {
     return(VisitAssignmentOperation(operation, argument));
 }
Example #22
0
 public override Scope VisitSimpleAssignment(ISimpleAssignmentOperation operation, Scope currentScope) =>
 operation.Target.Accept(this, currentScope);
Example #23
0
 public override IOperation VisitSimpleAssignment(ISimpleAssignmentOperation operation, object argument)
 {
     return(new SimpleAssignmentExpression(Visit(operation.Target), operation.IsRef, Visit(operation.Value), ((Operation)operation).SemanticModel, operation.Syntax, operation.Type, operation.ConstantValue, operation.IsImplicit));
 }
Example #24
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="operation">IOperationインスタンス</param>
 /// <param name="container">イベントコンテナ</param>
 public SimpleAssignment(ISimpleAssignmentOperation operation, EventContainer container) : base(container)
 {
     Expressions.AddRange(OperationFactory.GetExpressionList(operation.Target, container));
     Expressions.Add(new Expression("=", string.Empty));
     Expressions.AddRange(OperationFactory.GetExpressionList(operation.Value, container));
 }
 public override ExpressionSyntax VisitSimpleAssignment(ISimpleAssignmentOperation operation, Scope scope) =>
 AssignmentExpression(
     SyntaxKind.SimpleAssignmentExpression,
     operation.Target.Accept(this, scope),
     operation.Value.Accept(this, scope)
     );
Example #26
0
 public override void VisitSimpleAssignment([NotNull] ISimpleAssignmentOperation operation)
 {
     base.VisitSimpleAssignment(operation);
 }