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);
        }
Beispiel #3
0
        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 VisitSingleLineIfStatement(SingleLineIfStatementSyntax singleLineIfStatementSyntax, ExecutionState state)
        {
            var condition = VisitExpression(singleLineIfStatementSyntax.Condition, state);

            var ifState   = new ExecutionState(state);
            var lastState = new VariableState(singleLineIfStatementSyntax, VariableTaint.Unset);

            lastState = VisitStatements(singleLineIfStatementSyntax.Statements, ifState, lastState);
            condition.MergeTaint(lastState.Taint);
            state.Merge(ifState);
            return(condition);
        }
Beispiel #5
0
        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);
        }