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); }
private IEnumerable <SyntaxNode> VisitSelectBlock(SelectBlockSyntax node) { if (!node.CaseBlocks.Any()) { yield return(node.SelectStatement); } }
public override void VisitSelectBlock(SelectBlockSyntax node) => counter.CheckNesting(node.SelectStatement.SelectKeyword, () => base.VisitSelectBlock(node));
private static bool HasDefaultLabel(SelectBlockSyntax node) { return(node.CaseBlocks.Any(section => section.IsKind(SyntaxKind.CaseElseBlock))); }
public override void VisitSelectBlock(SelectBlockSyntax node) { State.IncreaseComplexityByNestingPlusOne(node.SelectStatement.SelectKeyword); State.VisitWithNesting(node, base.VisitSelectBlock); }
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;
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; }