[reflection] Check whether a pointer is valid before dereferencing (#19842)
[mono-project.git] / mono / tests / incorrect-ldvirtftn-read-behind-for-dup.il
blob2405c50b0ca99075f67d20b96e549ee9d0be8e8e
1 /*
2 Based on this C#, which is based on MSDN.
4 public delegate void D();
6 public class B
8         int i = 1;
10         public void Instance ()
11         {
12                 System.Console.WriteLine("Instance {0}", i);
13         }
15         public static void Static ()
16         {
17                 System.Console.WriteLine("Static {0}", 2);
18         }
20         public virtual void Virtual ()
21         {
22                 System.Console.WriteLine("Virtual {0}", i + 2);
23         }
26 public class A
28         public static void Main()
29         {
30                 var b = new B ();
31                 var d1 = new D (b.Instance);
32                 var d2 = new D (B.Static);
33                 var d3 = new D (b.Virtual);
34                 d1 ();
35                 d2 ();
36                 d3 ();
37         }
41 .assembly extern mscorlib { }
43 .assembly '1' { }
45 .class sealed public D
46 extends [mscorlib]System.MulticastDelegate
48 .method public void '.ctor' (object 'object', native int 'method') runtime { }
49 .method public virtual newslot instance void Invoke () runtime { }
50 .method public virtual newslot instance class [mscorlib]System.IAsyncResult BeginInvoke (class [mscorlib]System.AsyncCallback callback, object 'object') runtime { }
51 .method public virtual newslot instance void EndInvoke (class [mscorlib]System.IAsyncResult result) runtime { }
54 .class public B
56         .field int32 i
58 .method public instance void Instance ()
60         .maxstack 99
62         ldstr "B.Instance {0}"
63         ldarg 0
64         ldfld int32 B::i
65         box [mscorlib]System.Int32
66         call void class [mscorlib]System.Console::WriteLine(string, object)
67         ret
70 .method public static void Static ()
72         .maxstack 99
74         ldstr "B.Static {0}"
75         ldc.i4 2
76         box [mscorlib]System.Int32
77         call void class [mscorlib]System.Console::WriteLine(string, object)
78         ret
81 .method public virtual newslot instance void Virtual1 ()
83         .maxstack 99
84         ldstr "B.Virtual1"
85         call void class [mscorlib]System.Console::WriteLine(string)
86         ret
89 .method public virtual newslot instance void Virtual ()
91         .maxstack 99
93         ldstr "B.Virtual {0}"
94         ldarg 0
95         ldfld int32 B::i
96         ldc.i4 2
97         add
98         box [mscorlib]System.Int32
99         call void class [mscorlib]System.Console::WriteLine(string, object)
100         ret
103 .method public specialname rtspecialname instance void .ctor ()
105         .maxstack 99
107         ldarg 0
108         ldc.i4 1
109         stfld int32 B::i
110         ldarg 0
111         call instance void object::.ctor()
112         ret
116 .class public C
118         .field int32 i
120 .method public instance void Instance ()
122         .maxstack 99
124         ldstr "C.Instance {0}"
125         ldarg 0
126         ldfld int32 C::i
127         box [mscorlib]System.Int32
128         call void class [mscorlib]System.Console::WriteLine(string, object)
129         ret
132 .method public static void Static ()
134         .maxstack 99
136         ldstr "C.Static {0}"
137         ldc.i4 2
138         box [mscorlib]System.Int32
139         call void class [mscorlib]System.Console::WriteLine(string, object)
140         ret
143 .method public virtual newslot instance void Virtual ()
145         .maxstack 99
147         ldstr "C.Virtual {0}"
148         ldarg 0
149         ldfld int32 C::i
150         ldc.i4 2
151         add
152         box [mscorlib]System.Int32
153         call void class [mscorlib]System.Console::WriteLine(string, object)
154         ret
157 .method public specialname rtspecialname instance void .ctor ()
159         .maxstack 99
161         ldarg 0
162         ldc.i4 1
163         stfld int32 C::i
164         ldarg 0
165         call instance void object::.ctor()
166         ret
170 .class public A
173 .method public static void Main ()
175         .entrypoint
176         .maxstack 99
177         .locals init (
178                 class B b,
179                 class D d1,
180                 class D d2,
181                 class D d3,
182                 class C c,
184                 // pad out locals to hit the assert
185                 class C v00, class C v01, class C v02, class C v03, class C v04, class C v05, class C v06, class C v07,
186                 class C v08, class C v09, class C v0A, class C v0B, class C v0C, class C v0D, class C v0E, class C v0F,
187                 class C v10, class C v11, class C v12, class C v13, class C v14, class C v15, class C v16, class C v17,
188                 class C v18, class C v19, class C v1A, class C v1B, class C v1C, class C v1D, class C v1E, class C v1F,
189                 class C v20, class C v21, class C v22, class C v23, class C v24, class C v25, class C v26, class C v27
190         )
192         // b = new B ()
193         newobj instance void class B::'.ctor'()
194         stloc b
196         // c = new C ()
197         newobj instance void class C::.ctor()
198         stloc c
200         // d1 = new D (b, B::Instance)
201         ldloc b
202         ldftn instance void class B::Instance()
203         newobj instance void class D::.ctor(object, native int)
204         stloc d1
206         // d2 = new D (null, B::Static)
207         ldnull
208         ldftn void class B::Static()
209         newobj instance void class D::.ctor(object, native int)
210         stloc d2
212         // d3 = new D (c, {c, B::Virtual}) but JIT sees b
213         ldloc c
214         dup             // the dup the code is/was looking back for
216 // dup is 0x25
217 // Let's put in 0x25 that isn't dup.
218 // And mess up the compile-time but not runtime stack.
219 // Mislead the JIT and there is a runtime crash.
220         ldloc b
221         dup
222         stloc.s 0x25
223         stloc.s 0x25
225         ldvirtftn instance void class B::Virtual1()
226         newobj instance void class D::.ctor(object, native int)
227         stloc d3
229         // d1 ()
230         ldloc d1
231         callvirt instance void class D::Invoke()
233         // d2 ()
234         ldloc d2
235         callvirt instance void class D::Invoke()
237         // d3 ()
238         ldloc d3
239         callvirt instance void class D::Invoke()
241         ret