Expand() public method

public Expand ( Expression e ) : Expression
e Expression
return Expression
示例#1
0
        private void RewriteCall(Statement stm, CallInstruction call)
        {
            var e  = expander.Expand(call.Callee);
            var pt = e.Accept(asc) as Pointer;

            if (pt == null)
            {
                return;
            }
            var ft = pt.Pointee as FunctionType;

            if (ft == null)
            {
                return;
            }
            var returnId = ft.ReturnValue.DataType is VoidType ?
                           null : ft.ReturnValue;
            var sigCallee = new ProcedureSignature(returnId, ft.Parameters);
            var ab        = new ApplicationBuilder(
                program.Architecture, proc.Frame, call.CallSite,
                call.Callee, sigCallee, true);

            stm.Instruction = ab.CreateInstruction();
            ssaIdTransformer.Transform(stm, call);
        }
示例#2
0
        private void RewriteCall(Statement stm, CallInstruction call)
        {
            var e  = expander.Expand(call.Callee);
            var pt = e.Accept(asc).ResolveAs <Pointer>();

            if (pt == null)
            {
                return;
            }
            var ft = pt.Pointee as FunctionType;

            if (ft == null)
            {
                return;
            }
            ssam.AdjustRegisterAfterCall(
                stm,
                call,
                ssa.Procedure.Architecture.StackRegister,
                ft.StackDelta - call.CallSite.SizeOfReturnAddressOnStack);
            var ab = new ApplicationBuilder(
                ssa.Procedure.Architecture, proc.Frame, call.CallSite,
                call.Callee, ft, false);

            stm.Instruction = ab.CreateInstruction();
            ssaIdTransformer.Transform(stm, call);
            DefineUninitializedIdentifiers(stm, call);
            changed = true;
        }
示例#3
0
        private bool TryRewriteCall(Statement stm, CallInstruction call)
        {
            var e  = expander.Expand(call.Callee);
            var pt = e.Accept(asc).ResolveAs <Pointer>();

            if (pt == null)
            {
                return(false);
            }
            if (!(pt.Pointee is FunctionType ft))
            {
                return(false);
            }
            RewriteCall(stm, call, ft);
            return(true);
        }
        private void RewriteCall(Statement stm, CallInstruction call)
        {
            var e  = expander.Expand(call.Callee);
            var pt = e.Accept(asc).ResolveAs <Pointer>();

            if (pt == null)
            {
                return;
            }
            var ft = pt.Pointee as FunctionType;

            if (ft == null)
            {
                return;
            }
            AdjustStackPointerAfterCall(stm, call, ft.StackDelta);
            var ab = new ApplicationBuilder(
                program.Architecture, proc.Frame, call.CallSite,
                call.Callee, ft, false);

            stm.Instruction = ab.CreateInstruction();
            ssaIdTransformer.Transform(stm, call);
            changed = true;
        }