Esempio n. 1
0
        private void OptimizePossibleTaintedEntities(SymbolicReference.VisitingContext markedEntities, SymbolicReference[] arguments)
        {
            throw new NotImplementedException("Must be re-implemented by VisitingContext changes!");
            var context = new SymbolicReference.VisitingContext();

            staticEntity.OptimizePossibleTaintedEntities(context, markedEntities);
            for (var i = 0; i < arguments.Length; i++)
            {
                var argument = arguments[i];
                argument.OptimizePossibleTaintedEntities(context, markedEntities);
            }

            returnValue?.OptimizePossibleTaintedEntities(context, markedEntities);
        }
Esempio n. 2
0
        public long GetNodeCount()
        {
            if (IsEmpty)
            {
                return(0);
            }

            if (nodeCount.HasValue)
            {
                return(nodeCount.Value);
            }

            var context         = new SymbolicReference.VisitingContext();
            var processingNodes = new Queue <SymbolicReference>();

            if (ReturnValue != null)
            {
                processingNodes.Enqueue(ReturnValue);
            }

            for (var i = 0; i < Arguments.Length; i++)
            {
                var argument = Arguments[i];
                processingNodes.Enqueue(argument);
            }

            long count = 0;

            while (processingNodes.Count > 0)
            {
                var node = processingNodes.Dequeue();
                if (context.IsVisited(node))
                {
                    continue;
                }

                context.Visit(node);
                count++;

                foreach (var field in node.Fields)
                {
                    processingNodes.Enqueue(field.Value);
                }
            }

            nodeCount = count;
            return(count);
        }
Esempio n. 3
0
        //public void Dump(string path) => new Summary(method, staticEntity, Arguments.Entities, returnValue).Dump(path);

        public Summary ToSummary()
        {
            // TODO: OPTIMIZATION if slot is not materialized, we can ignore it and just remove
            var arguments = Arguments.Entities;

            if (method.Parameters.Count != arguments.Length)
            {
                throw new ArgumentException("method.Parameters.Count != arguments.Length");
            }

            //return new Summary(method, staticEntity, arguments, returnValue?.MergeEntities());

            // Optimizing
            var context = new SymbolicReference.VisitingContext();

            // Add roots to the context to avoid removing it
            context.Visit(staticEntity);
            for (var i = 0; i < arguments.Length; i++)
            {
                var argument = arguments[i];
                context.Visit(argument);
            }

            SymbolicReference returnEntity = null;

            if (returnValue != null)
            {
                returnEntity = returnValue.MergeEntities();
                context.Visit(returnEntity);
            }

            // Remove empty entities
            staticEntity.RemoveEmptyEntities(context);
            for (var i = 0; i < arguments.Length; i++)
            {
                var argument = arguments[i];
                argument.RemoveEmptyEntities(context);
            }

            returnEntity?.RemoveEmptyEntities(context);

            // Remove non-reachable possible input/tainted entities
            //OptimizePossibleTaintedEntities(context, arguments);

            // Create summary
            return(new Summary(Signature, staticEntity, arguments, returnEntity,
                               MethodCallCount, InstructionCount));
        }