Exemplo n.º 1
0
        public override void VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
        {
            var identifierText = (node.Expression as IdentifierNameSyntax)?.Identifier.Text;

            if (identifierText != nameof(Type) ||
                identifierText != nameof(TypeCode))
            {
                var symbol = SymbolHelper.GetSymbol(node.Expression, SemanticModel);

                if (symbol != null && _newObjectsAndLocks.Keys.Contains(symbol))
                {
                    var objectLocks = _newObjectsAndLocks[symbol];

                    if (!objectLocks.All(x => CurrentLock.Contains(x)))
                    {
                        if (!PotentialIssuesFound.Contains(symbol))
                        {
                            if (GloablOptions.Verbose)
                            {
                                Console.WriteLine($"For node {node}");
                                Console.WriteLine($"With parent {node.Parent}");
                                Console.WriteLine($"In lock(s) {String.Join(", ", objectLocks)}");
                                Console.WriteLine();
                            }
                            PotentialIssuesFound.Add(symbol);
                        }
                    }
                }
            }
            base.VisitMemberAccessExpression(node);
        }
Exemplo n.º 2
0
        public override void VisitObjectCreationExpression(ObjectCreationExpressionSyntax node)
        {
            if (InMethod && CurrentLock.Count > 0)
            {
                ISymbol symbol = null;
                if (node.Parent is AssignmentExpressionSyntax assignmentExpressionSyntax)
                {
                    symbol = SymbolHelper.GetSymbol(assignmentExpressionSyntax.Left, SemanticModel);
                }
                else if (node.Parent is ThrowStatementSyntax ||
                         node.Parent is YieldStatementSyntax ||
                         node.Parent is ArgumentSyntax ||
                         node.Parent is ReturnStatementSyntax)
                {
                    // do nothing
                }
                else if (node.Parent.Parent is VariableDeclaratorSyntax variableDeclaratorSyntax)
                {
                    symbol = SemanticModel.GetDeclaredSymbol(variableDeclaratorSyntax);
                }

                if (symbol != null)
                {
                    var blockSyntax = node.Parent.Ancestors().OfType <BlockSyntax>().First();

                    var analyzeBlockWalker = new AnalyzeBlockWalker(SemanticModel, symbol);
                    analyzeBlockWalker.Visit(blockSyntax);

                    var nonVolatileFieldsAndProperties = analyzeBlockWalker.NonVolatileFieldsAndProperties.ToList();

                    if (nonVolatileFieldsAndProperties.Any())
                    {
                        var locks = CurrentLock.ToList();
                        foreach (var nonVolatileFieldsAndProperty in nonVolatileFieldsAndProperties)
                        {
                            if (!NewObjectsAndLocks.ContainsKey(nonVolatileFieldsAndProperty))
                            {
                                if (GloablOptions.Verbose)
                                {
                                    Console.WriteLine($"For node {node}");
                                    Console.WriteLine($"With parent {node.Parent}");
                                    Console.WriteLine($"In lock(s) {String.Join(", ", locks)}");
                                    Console.WriteLine();
                                }
                                NewObjectsAndLocks.Add(nonVolatileFieldsAndProperty, locks);
                            }
                        }
                    }
                }
            }

            base.VisitObjectCreationExpression(node);
        }