Esempio n. 1
0
        public ImmutableArray <int> GetMethodParameterLines(IWorkSession session, int lineInMethod, int columnInMethod)
        {
            var declaration = RoslynAdapterHelper.FindSyntaxNodeInSession(session, lineInMethod, columnInMethod)
                              ?.AncestorsAndSelf()
                              .FirstOrDefault(x => x is MethodBlockBaseSyntax || x is LambdaExpressionSyntax);

            var parameters = declaration switch
            {
                MethodBlockBaseSyntax m => m.BlockStatement.ParameterList.Parameters,
                LambdaExpressionSyntax l => l.SubOrFunctionHeader.ParameterList.Parameters,
                _ => SyntaxFactory.SeparatedList <ParameterSyntax>()
            };

            if (parameters.Count == 0)
            {
                return(ImmutableArray <int> .Empty);
            }

            var results = new int[parameters.Count];

            for (var i = 0; i < parameters.Count; i++)
            {
                results[i] = parameters[i].GetLocation().GetLineSpan().StartLinePosition.Line + 1;
            }
            return(ImmutableArray.Create(results));
        }
 private void TaintParameters(MethodBlockBaseSyntax node, ParameterListSyntax parameterList, ExecutionState state)
 {
     foreach (ParameterSyntax parameter in parameterList.Parameters)
     {
         state.AddNewValue(ResolveIdentifier(parameter.Identifier.Identifier),
                           new VariableState(parameter, VariableTaint.Tainted));
     }
 }
 private static bool OnlyThrowsNotImplementedException(MethodBlockBaseSyntax method, SemanticModel semanticModel) =>
 method.Statements.Count == 1 &&
 method.Statements
 .OfType <ThrowStatementSyntax>()
 .Select(tss => tss.Expression)
 .OfType <ObjectCreationExpressionSyntax>()
 .Select(oces => semanticModel.GetSymbolInfo(oces).Symbol)
 .OfType <IMethodSymbol>()
 .Any(s => s != null && s.ContainingType.Is(KnownType.System_NotImplementedException));
Esempio n. 4
0
        /// <summary>
        /// Entry point that visits the method statements.
        /// </summary>
        /// <param name="node"></param>
        /// <param name="state"></param>
        /// <returns></returns>
        private VariableState VisitMethodDeclaration(MethodBlockBaseSyntax node, ParameterListSyntax parameterList, ExecutionState state)
        {
            foreach (ParameterSyntax parameter in parameterList.Parameters)
            {
                state.AddNewValue(ResolveIdentifier(parameter.Identifier.Identifier),
                                  new VariableState(parameter, VariableTaint.Tainted));
            }

            return(VisitBlock(node, state));
        }
Esempio n. 5
0
        private VariableState VisitBlock(MethodBlockBaseSyntax node, ExecutionState state)
        {
            var lastState = new VariableState(node, VariableTaint.Unknown);

            foreach (StatementSyntax statement in node.Statements)
            {
                var statementState = VisitNode(statement, state);
                lastState = statementState;

                foreach (var ext in Extensions)
                {
                    ext.VisitStatement(statement, state);
                }
            }

            return(lastState);
        }
        public static SyntaxToken?GetIdentifierOrDefault(this MethodBlockBaseSyntax methodBlockBase)
        {
            var blockStatement = methodBlockBase?.BlockStatement;

            switch (blockStatement?.Kind())
            {
            case SyntaxKind.SubNewStatement:
                return((blockStatement as SubNewStatementSyntax)?.NewKeyword);

            case SyntaxKind.FunctionStatement:
            case SyntaxKind.SubStatement:
                return((blockStatement as MethodStatementSyntax)?.Identifier);

            default:
                return(null);
            }
        }
        /// <summary>
        /// Entry point that visits the method statements.
        /// </summary>
        private VariableState VisitMethodDeclaration(MethodBlockBaseSyntax node, ParameterListSyntax parameterList, ExecutionState state)
        {
            if (ProjectConfiguration.AuditMode)
            {
                TaintParameters(node, parameterList, state);
            }
            else
            {
                var symbol = state.AnalysisContext.SemanticModel.GetDeclaredSymbol(node);
                if (symbol != null)
                {
                    if (symbol.IsTaintEntryPoint(ProjectConfiguration.TaintEntryPoints))
                    {
                        TaintParameters(node, parameterList, state);
                    }
                }
            }

            return(VisitBlock(node, state));
        }
 public static MethodBlockBaseSyntax WithStatements(this MethodBlockBaseSyntax syntax, SyntaxList <StatementSyntax> statements)
 {
     if (syntax == null)
     {
         throw new System.ArgumentNullException(nameof(syntax));
     }
     if (syntax is MethodBlockSyntax)
     {
         return(((MethodBlockSyntax)syntax).WithStatements(statements));
     }
     if (syntax is ConstructorBlockSyntax)
     {
         return(((ConstructorBlockSyntax)syntax).WithStatements(statements));
     }
     if (syntax is AccessorBlockSyntax)
     {
         return(((AccessorBlockSyntax)syntax).WithStatements(statements));
     }
     if (syntax is OperatorBlockSyntax)
     {
         return(((OperatorBlockSyntax)syntax).WithStatements(statements));
     }
     throw new System.NotSupportedException(syntax.GetType() + " is not supported!");
 }
        private static List <ParameterSyntax> GetUnusedParameters(MethodBlockBaseSyntax methodBlock)
        {
            var usedIdentifiers = GetAllUsedVarOrParameterIdentifierNames();

            return(methodBlock.BlockStatement
                   .ParameterList
                   .Parameters
                   .Where(p => p.Identifier?.Identifier.ValueText != null &&
                          !usedIdentifiers.Contains(p.Identifier.Identifier.ValueText))
                   .ToList());

            HashSet <string> GetAllUsedVarOrParameterIdentifierNames() =>
            methodBlock.Statements
            .SelectMany(statement => statement.DescendantNodes())
            .Where(node => node.IsKind(SyntaxKind.IdentifierName) &&
                   IsVarOrParameter(node))
            .Cast <IdentifierNameSyntax>()
            .Select(ins => ins.Identifier.ValueText)
            .WhereNotNull()
            .ToHashSet();

            bool IsVarOrParameter(SyntaxNode node)
            {
                if (node.Parent.IsKind(SyntaxKind.SimpleMemberAccessExpression))
                {
                    return(((MemberAccessExpressionSyntax)node.Parent).Expression == node);
                }

                if (node.Parent.IsKind(SyntaxKind.ConditionalAccessExpression))
                {
                    return(((ConditionalAccessExpressionSyntax)node.Parent).Expression == node);
                }

                return(true);
            }
        }
        private VariableState VisitBlock(MethodBlockBaseSyntax node, ExecutionState state)
        {
            var lastState = new VariableState(node, VariableTaint.Unknown);

            return(VisitStatements(node.Statements, state, lastState));
        }
 public static Location FindIdentifierLocation(this MethodBlockBaseSyntax methodBlockBase) =>
 GetIdentifierOrDefault(methodBlockBase)?.GetLocation();
 private static bool IsVirtualOrOverride(MethodBlockBaseSyntax method) =>
 method.BlockStatement.Modifiers.Any(m =>
                                     m.IsKind(SyntaxKind.OverridesKeyword) ||
                                     m.IsKind(SyntaxKind.OverridableKeyword));
 private static bool IsEmptyMethod(MethodBlockBaseSyntax method) =>
 method.Statements.Count == 0;
 private static bool HasAnyParameter(MethodBlockBaseSyntax method) =>
 method.BlockStatement.ParameterList != null &&
 method.BlockStatement.ParameterList.Parameters.Count > 0;
 private static bool HasAnyAttribute(MethodBlockBaseSyntax method) =>
 method.BlockStatement.AttributeLists.Count > 0;
 private static bool IsInterfaceImplementation(MethodBlockBaseSyntax method) =>
 (method.BlockStatement as MethodStatementSyntax)?.ImplementsClause != null;