private VariableState VisitSelectBlock(SelectBlockSyntax selectBlockSyntax, ExecutionState state)
        {
            var exprVarState = VisitNode(selectBlockSyntax.SelectStatement, state);

            if (selectBlockSyntax.CaseBlocks.Count <= 0)
            {
                return(exprVarState);
            }

            var firstCaseState  = new ExecutionState(state);
            var sectionVarState = VisitNode(selectBlockSyntax.CaseBlocks[0], firstCaseState);

            exprVarState.MergeTaint(sectionVarState.Taint);

            for (var i = 1; i < selectBlockSyntax.CaseBlocks.Count; i++)
            {
                var section   = selectBlockSyntax.CaseBlocks[i];
                var caseState = new ExecutionState(state);
                sectionVarState = VisitNode(section, caseState);
                exprVarState.MergeTaint(sectionVarState.Taint);
                firstCaseState.Merge(caseState);
            }

            if (selectBlockSyntax.CaseBlocks.Any(section => section.Kind() == SyntaxKind.CaseElseBlock))
            {
                state.Replace(firstCaseState);
            }
            else
            {
                state.Merge(firstCaseState);
            }

            return(exprVarState);
        }
예제 #2
0
 private IEnumerable <SyntaxNode> VisitSelectBlock(SelectBlockSyntax node)
 {
     if (!node.CaseBlocks.Any())
     {
         yield return(node.SelectStatement);
     }
 }
예제 #3
0
 public override void VisitSelectBlock(SelectBlockSyntax node) =>
 counter.CheckNesting(node.SelectStatement.SelectKeyword, () => base.VisitSelectBlock(node));
예제 #4
0
 private static bool HasDefaultLabel(SelectBlockSyntax node)
 {
     return(node.CaseBlocks.Any(section => section.IsKind(SyntaxKind.CaseElseBlock)));
 }
예제 #5
0
 public override void VisitSelectBlock(SelectBlockSyntax node)
 {
     State.IncreaseComplexityByNestingPlusOne(node.SelectStatement.SelectKeyword);
     State.VisitWithNesting(node, base.VisitSelectBlock);
 }
예제 #6
0
 public override void VisitSelectBlock(SelectBlockSyntax node)
 {
     LogicalLineCount++;
     base.VisitSelectBlock(node);
 }
 private static bool HasAtLeastThreeLabels(SelectBlockSyntax node) =>
 node.CaseBlocks.Sum(caseBlock => caseBlock.CaseStatement.Cases.Count) >= 3;
예제 #8
0
        private SwitchStatement TraverseSwitchStatement(SelectBlockSyntax sbs, ref int returnCnt, bool nested = false)
        {
            SwitchStatement switchStm = new SwitchStatement();
            switchStm.IsNested = nested;
            SelectStatementSyntax sss = sbs.SelectStatement;

            foreach (SyntaxNode sn in sss.DescendantNodesAndSelf())
            {
                if (sn is BinaryExpressionSyntax)
                {
                    switchStm.ConditionCount++;
                }
                else if (sn is IdentifierNameSyntax)
                {
                    Variables variable = new Variables();
                    variable.IsReferenced = true;

                    variable.Name = (sn as IdentifierNameSyntax).Identifier.ValueText;
                    switchStm.AccessedVars.Add(variable);
                }
            }

            foreach (CaseBlockSyntax cbb in sbs.CaseBlocks)
            {
                CaseStatement aCase = new CaseStatement();

                foreach (SyntaxNode sn in cbb.Begin.DescendantNodesAndSelf())
                {
                    if (sn is BinaryExpressionSyntax)
                    {
                        switchStm.ConditionCount++;
                    }
                    else if (sn is IdentifierNameSyntax)
                    {
                        Variables variable = new Variables();
                        variable.IsReferenced = true;

                        variable.Name = (sn as IdentifierNameSyntax).Identifier.ValueText;
                        aCase.AccessedVars.Add(variable);
                    }
                }
                foreach (StatementSyntax ss in cbb.Statements)
                {

                    if (ss is AssignmentStatementSyntax)
                    {
                        //TODO: need to look at more than just then name!
                        Method tempMethod = TraverseAccessVars(ss as AssignmentStatementSyntax);

                        aCase.AccessedVars.AddRange(tempMethod.AccessedVariables);
                        aCase.InvokedMethods.AddRange(tempMethod.InvokedMethods);
                    }
                    else if (ss is LocalDeclarationStatementSyntax)
                    {
                        Method tempMethod = TraverseVarDecls(ss as LocalDeclarationStatementSyntax);
                        aCase.AccessedVars.AddRange(tempMethod.AccessedVariables);
                        aCase.InvokedMethods.AddRange(tempMethod.InvokedMethods);
                    }
                    else if (ss is SingleLineIfStatementSyntax)
                    {
                        Decisions decision = TraverseIfStatement(ss as SingleLineIfStatementSyntax, ref returnCnt, true);
                        aCase.Nested.AddRange(decision.IfStatements);
                        aCase.Nested.AddRange(decision.ElseStatements);
                    }
                    else if (ss is MultiLineIfBlockSyntax)
                    {
                        Decisions decisions = TraverseMultiIfStatement(ss as MultiLineIfBlockSyntax, ref returnCnt, true);
                        aCase.Nested.AddRange(decisions.IfStatements);
                        aCase.Nested.AddRange(decisions.ElseStatements);
                    }
                    else if (ss is ElseStatementSyntax)
                    {
                        aCase.Nested.Add(TravsereElseStatement(ss as ElseStatementSyntax, ref returnCnt, true));
                    }
                    else if (ss is ForBlockSyntax)
                    {
                        Decisions tempDecision = TraverseForStatement(ss as ForBlockSyntax, ref returnCnt, true);
                        aCase.Nested.AddRange(tempDecision.IfStatements);
                        aCase.Nested.AddRange(tempDecision.ElseStatements);
                        aCase.Nested.AddRange(tempDecision.ForEachStatements);
                        aCase.Nested.AddRange(tempDecision.ForStatements);
                        aCase.Nested.AddRange(tempDecision.WhileLoops);
                        aCase.Nested.AddRange(tempDecision.DoWhileLoops);
                        aCase.Nested.AddRange(tempDecision.Catches);
                        aCase.Nested.AddRange(tempDecision.SwitchStatements);
                    }
                    else if (ss is SelectBlockSyntax)
                    {
                        aCase.Nested.Add(TraverseSwitchStatement(ss as SelectBlockSyntax, ref returnCnt, true));
                    }
                    else if (ss is DoLoopBlockSyntax)
                    {
                        aCase.Nested.Add(TraverseDoWhileLoop(ss as DoLoopBlockSyntax, ref returnCnt, true));
                    }
                    else if (ss is WhileBlockSyntax)
                    {
                        aCase.Nested.Add(TraverseWhileLoop(ss as WhileBlockSyntax, ref returnCnt, true));
                    }
                    else if (ss is CallStatementSyntax)
                    {
                        aCase.InvokedMethods.Add(TraverseInvokedMethod(ss as CallStatementSyntax));
                    }
                    else if (ss is ReturnStatementSyntax)
                    {
                        Method tempMethod = TraverseReturnStatement(ss as ReturnStatementSyntax);
                        aCase.InvokedMethods.AddRange(tempMethod.InvokedMethods);
                        aCase.AccessedVars.AddRange(tempMethod.AccessedVariables);
                        returnCnt++;
                    }
                }
                switchStm.CaseStatements.Add(aCase);
            }

            return switchStm;
        }