public void Dfa2_UserDefinedStackArgs() { var arch = new X86ArchitectureFlat32(new ServiceContainer(), "x86-protected-32", new Dictionary <string, object>()); var pb = new ProgramBuilder(arch); var test = pb.Add( new UserProcedure(pb.NextAddress(), "test") { CSignature = "void test(int a, int b)" }, m => { var r1 = m.Reg32("r1", 1); var r2 = m.Reg32("r2", 2); var fp = m.Frame.FramePointer; m.Assign(r1, m.Mem32(m.IAdd(fp, 4))); m.Assign(r2, m.Mem32(m.IAdd(fp, 8))); m.Assign(r1, m.IAdd(r1, r2)); m.MStore(m.Ptr32(0x010008), r1); m.Return(); }); var program = pb.BuildProgram(); var platform = new Mock <IPlatform>(); platform.Setup(p => p.Architecture).Returns(arch); platform.Setup(p => p.IsImplicitArgumentRegister(It.IsAny <RegisterStorage>())) .Returns(false); platform.Setup(p => p.DefaultCallingConvention).Returns("__cdecl"); platform.Setup(p => p.GetCallingConvention(null)) .Returns(new X86CallingConvention(4, 4, 4, true, false)); platform.Setup(p => p.GetBitSizeFromCBasicType(CBasicType.Int)).Returns(32); platform.Setup(p => p.PointerType).Returns(PrimitiveType.Ptr32); platform.Setup(p => p.CreateCParser(It.IsAny <TextReader>(), It.IsAny <ParserState>())) .Returns(new Func <TextReader, ParserState, CParser>((r, s) => { var lex = new CLexer(r, CLexer.MsvcKeywords); return(new CParser(s ?? new ParserState(), lex)); })); var dynamicLinker = new Mock <IDynamicLinker>().Object; program.Platform = platform.Object; var usb = new UserSignatureBuilder(program); usb.BuildSignatures(new FakeDecompilerEventListener()); var dfa = new DataFlowAnalysis(program, dynamicLinker, sc); dfa.AnalyzeProgram(); var sExp = @"// test // Return size: 4 void test(int32 a, int32 b) test_entry: // succ: l1 l1: Mem6[0x00010008<p32>:word32] = a + b return // succ: test_exit test_exit: "; AssertProgram(sExp, pb.Program); }