public BuildSignature ( Address addr, Procedure proc ) : bool | ||
addr | Address | |
proc | Procedure | |
리턴 | bool |
public void Usb_BuildSignature() { Given_Procedure(0x1000); var ser = mr.Stub<ProcedureSerializer>(arch, null, "cdecl"); platform.Expect(s => s.CreateProcedureSerializer(null, null)).IgnoreArguments().Return(ser); ser.Expect(s => s.Deserialize( Arg<SerializedSignature>.Is.NotNull, Arg<Frame>.Is.NotNull)).Return(new ProcedureSignature()); mr.ReplayAll(); var usb = new UserSignatureBuilder(program); var sig = usb.BuildSignature("int foo(char *)", proc.Frame); mr.ReplayAll(); }
/// <summary> /// Performs a scan of the blocks that constitute a procedure named <paramref name="procedureName"/> /// </summary> /// <param name="addr">Address of the code from which we will start scanning.</param> /// <param name="procedureName"></param> /// <param name="state"></param> /// <returns></returns> public ProcedureBase ScanProcedure(Address addr, string procedureName, ProcessorState state) { TerminateAnyBlockAt(addr); ExternalProcedure ep; if (TryGetNoDecompiledProcedure(addr, out ep)) return ep; if (program.InterceptedCalls.TryGetValue(addr, out ep)) return ep; var trampoline = GetTrampoline(addr); if (trampoline != null) return trampoline; var imp = GetImportedProcedure(addr, addr); if (imp != null) return imp; Procedure proc = EnsureProcedure(addr, procedureName); if (visitedProcs.Contains(proc)) return proc; visitedProcs.Add(proc); Debug.WriteLineIf(trace.TraceInfo, string.Format("Scanning procedure at {0}", addr)); var st = state.Clone(); EstablishInitialState(addr, st, proc); //$REFACTOR: make the stack explicit? var oldQueue = queue; queue = new PriorityQueue<WorkItem>(); var block = EnqueueJumpTarget(addr, addr, proc, st); proc.ControlGraph.AddEdge(proc.EntryBlock, block); ProcessQueue(); queue = oldQueue; InjectProcedureEntryInstructions(addr, proc); var usb = new UserSignatureBuilder(program); usb.BuildSignature(addr, proc); return proc; }
public void Usb_BuildSignature_KeepRegisterType() { Given_Procedure(0x1000); Given_UserSignature(0x01000, "void test([[reko::arg(register,\"ecx\")]] float f)"); var usb = new UserSignatureBuilder(program); usb.BuildSignature(Address.Ptr32(0x1000), proc); var ass = proc.Statements .Select(stm => stm.Instruction as Assignment) .Where(instr => instr != null) .Single(); Assert.AreEqual("ecx = f", ass.ToString()); // verify that data type of register was not overwritten Assert.AreEqual("word32", ass.Dst.DataType.ToString()); Assert.AreEqual("real32", ass.Src.DataType.ToString()); }