Exemplo n.º 1
0
        protected override bool Step(
            GraphStructuredProgram <TNode> targetProgram,
            ResolvedMethod <TNode> targetMethod,
            TNode source,
            Statement statement,
            TNode target,
            Func <TNode> nodeCreator)
        {
            if (statement is AssignmentStatement assignment)
            {
                var sourceEntity = ReferenceResolver.Resolve(targetProgram, targetMethod, assignment.Source);
                var targetEntity = ReferenceResolver.Resolve(targetProgram, targetMethod, assignment.Target);

                var targetSecondaryEntity = targetEntity as SecondaryEntity;
                Trace.Assert(targetSecondaryEntity != null);

                var referencedByThis =
                    assignment.Target is ClassFieldReference classFieldReference &&
                    classFieldReference.Owner is ClassReference classReference &&
                    classReference.ThisClassReference;

                var newStatement = new ResolvedAssignmentStatement(
                    assignment.Location, sourceEntity, targetSecondaryEntity, referencedByThis);

                targetProgram.AddEdge(new OperationEdge <TNode>(source, newStatement, target));

                return(false);
            }

            return(true);
        }
        private Dictionary <SecondaryEntity, ParameterIndex> AddIntermediateEdgesIfNeeded(
            GraphStructuredProgram <TNode> targetProgram,
            Dictionary <Entity, ParameterIndex> passedParameters,
            TNode currentSource,
            Func <TNode> nodeCreator,
            Func <SecondaryEntity> variableCreator,
            out TNode newSource)
        {
            var processedParameters = passedParameters.ToDictionary(
                pair =>
            {
                if (!(pair.Key is ResolvedLocalVariable))
                {
                    var newTarget   = nodeCreator();
                    var newVariable = variableCreator();
                    var statement   = new ResolvedAssignmentStatement(null, pair.Key, newVariable);
                    var edge        = new OperationEdge <TNode>(currentSource, statement, newTarget);

                    targetProgram.AddEdge(edge);
                    currentSource = newTarget;

                    return(newVariable);
                }

                return((SecondaryEntity)pair.Key);
            },
                pair => pair.Value);

            newSource = currentSource;
            return(processedParameters);
        }
Exemplo n.º 3
0
        private void ProcessAssignment(State state, GssNode <StackSymbol, EmptyGssData> stack, ResolvedAssignmentStatement assignment)
        {
            if (!(state is ResolvedLocalVariable))
            {
                if (Utils.IsTaintedSource(assignment.Source))
                {
                    var nextState = Utils.FindClosestLocalOwner(assignment.Target);
                    Accept(nextState);
                }

                return;
            }

            if (assignment.TargetReferencedByThis && stack.Symbol.Owner != null)
            {
                Accept(stack.Symbol.Owner);
            }
            else
            {
                var closestTarget = Utils.FindClosestLocalOwner(assignment.Target);
                if (closestTarget == null)
                {
                    return;
                }

                var closestSource = Utils.FindClosestLocalOwner(assignment.Source as SecondaryEntity);
                if (closestSource == null)
                {
                    return;
                }

                if (closestSource.Equals(state))
                {
                    Accept(closestTarget);
                }
            }
        }