private VariableState VisitMultiLineIfBlock(MultiLineIfBlockSyntax multiLineIfBlockSyntax, ExecutionState state) { var condition = VisitNode(multiLineIfBlockSyntax.IfStatement, state); var ifState = new ExecutionState(state); var lastState = new VariableState(multiLineIfBlockSyntax, VariableTaint.Unset); var ifStatement = VisitStatements(multiLineIfBlockSyntax.Statements, ifState, lastState); condition.MergeTaint(ifStatement.Taint); foreach (var elseIfBlock in multiLineIfBlockSyntax.ElseIfBlocks) { var elseState = new ExecutionState(state); condition.MergeTaint(VisitNode(elseIfBlock, elseState).Taint); ifState.Merge(elseState); } if (multiLineIfBlockSyntax.ElseBlock != null) { var elseState = new ExecutionState(state); var elseStatement = VisitNode(multiLineIfBlockSyntax.ElseBlock, elseState); condition.MergeTaint(elseStatement.Taint); ifState.Merge(elseState); state.Replace(ifState); return(condition); } state.Merge(ifState); return(condition); }
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 VariableState VisitSwitch(SwitchStatementSyntax switchStatementSyntax, ExecutionState state) { var exprVarState = VisitExpression(switchStatementSyntax.Expression, state); if (switchStatementSyntax.Sections.Count <= 0) { return(exprVarState); } var firstCaseState = new ExecutionState(state); var sectionVarState = VisitNode(switchStatementSyntax.Sections[0], firstCaseState); exprVarState.MergeTaint(sectionVarState.Taint); for (var i = 1; i < switchStatementSyntax.Sections.Count; i++) { var section = switchStatementSyntax.Sections[i]; var caseState = new ExecutionState(state); sectionVarState = VisitNode(section, caseState); exprVarState.MergeTaint(sectionVarState.Taint); firstCaseState.Merge(caseState); } if (switchStatementSyntax.Sections.Any(section => section.Labels.Any(label => label.Kind() == SyntaxKind.DefaultSwitchLabel))) { state.Replace(firstCaseState); } else { state.Merge(firstCaseState); } return(exprVarState); }
private VariableState VisitIf(IfStatementSyntax ifStatementSyntax, ExecutionState state) { var condition = VisitExpression(ifStatementSyntax.Condition, state); var ifState = new ExecutionState(state); var ifStatement = VisitNode(ifStatementSyntax.Statement, ifState); condition.MergeTaint(ifStatement.Taint); if (ifStatementSyntax.Else != null) { var elseState = new ExecutionState(state); var elseStatement = VisitNode(ifStatementSyntax.Else, elseState); condition.MergeTaint(elseStatement.Taint); var @else = ifStatementSyntax.Else; while (@else?.Statement != null && @else.Statement is IfStatementSyntax elseIf) { @else = elseIf.Else; } if (@else != null) { ifState.Merge(elseState); state.Replace(ifState); return(condition); } else { state.Merge(elseState); } } state.Merge(ifState); return(condition); }