2009-06-12 Bill Holmes <billholmes54@gmail.com>
[mono.git] / mono / tests / metadata-verifier / cli-tables-tests.md
1 tables-header {
2         assembly simple-assembly.exe
3
4         #table schema major version
5         valid offset cli-metadata + read.uint ( stream-header ( 0 ) ) + 4  set-byte 2
6         valid offset tables-header + 4  set-byte 2
7
8         #major/minor versions   
9         invalid offset tables-header + 4 set-byte 22
10         invalid offset tables-header + 5 set-byte 1
11
12         #table schema size
13         invalid offset stream-header ( 0 ) + 4 set-uint 23
14
15         #heap sizes
16         #LAMEIMPL MS ignore garbage on the upper bits.
17         invalid offset tables-header + 6 set-byte 0x8
18         invalid offset tables-header + 6 set-byte 0x10
19         invalid offset tables-header + 6 set-byte 0xF
20
21         #present tables
22         #ECMA-335 defines 39 tables, the empty slows are the following:
23         # MS Extensions: 0x3 0x5 0x7 0x13 0x16
24         # Unused: 0x1E 0x1F 0x2D-0x3F
25         # We don't care about the MS extensions.
26
27         invalid offset tables-header + 8 set-bit 0x3
28         invalid offset tables-header + 8 set-bit 0x5
29         invalid offset tables-header + 8 set-bit 0x7
30         invalid offset tables-header + 8 set-bit 0x13
31         invalid offset tables-header + 8 set-bit 0x16
32
33         invalid offset tables-header + 8 set-bit 0x1E
34         invalid offset tables-header + 8 set-bit 0x1F
35
36         invalid offset tables-header + 8 set-bit 0x2D
37         invalid offset tables-header + 8 set-bit 0x2F
38         invalid offset tables-header + 8 set-bit 0x30
39         invalid offset tables-header + 8 set-bit 0x35
40         invalid offset tables-header + 8 set-bit 0x38
41         invalid offset tables-header + 8 set-bit 0x3F
42
43         #simple-assembly.exe feature 6 tables (modules, typeref, typedef, method, assembly and assemblyref)
44         #This means that there must be 24 + 6 *4 bytes to hold the schemata + rows -> 48 bytes
45
46         #table schema size
47         invalid offset stream-header ( 0 ) + 4 set-uint 24
48         invalid offset stream-header ( 0 ) + 4 set-uint 33
49         invalid offset stream-header ( 0 ) + 4 set-uint 39
50         invalid offset stream-header ( 0 ) + 4 set-uint 44
51         invalid offset stream-header ( 0 ) + 4 set-uint 47
52
53         #total size of the tables
54         invalid offset stream-header ( 0 ) + 4 set-uint 60
55         invalid offset stream-header ( 0 ) + 4 set-uint 93
56 }
57
58 module-table {
59         assembly simple-assembly.exe
60
61         #generation
62         valid offset table-row ( 0 0 ) set-ushort 0
63         #FALESPEC this field is ignored
64         valid offset table-row ( 0 0 ) set-ushort 9999
65
66         #rows
67         valid offset tables-header + 24 set-uint 1
68         invalid offset tables-header + 24 set-uint 0
69         invalid offset tables-header + 24 set-uint 2 , offset tables-header + 32 set-uint 1
70         
71         #name
72         #invalid string
73         invalid offset table-row ( 0 0 ) + 2 set-ushort 0x8888
74         #point to an empty string
75         invalid offset table-row ( 0 0 ) + 2 set-ushort 0
76
77         #mvid
78         invalid offset table-row ( 0 0 ) + 4 set-ushort 0x8888
79
80         #encId
81         invalid offset table-row ( 0 0 ) + 6 set-ushort 0x8888
82
83         #encBaseId
84         invalid offset table-row ( 0 0 ) + 8 set-ushort 0x8888
85 }
86
87
88 typeref-table {
89         assembly simple-assembly.exe
90
91         #Resolution Scope
92
93         #all table indexes are valid
94         #Invalid module
95         invalid offset table-row ( 1 0 ) set-ushort 0x8000
96
97         #Invalid moduleref
98         invalid offset table-row ( 1 0 ) set-ushort 0x8001
99
100         #Invalid assemblyref
101         invalid offset table-row ( 1 0 ) set-ushort 0x8002
102
103         #Invalid typeref
104         invalid offset table-row ( 1 0 ) set-ushort 0x8003
105
106         #Empty TypeName
107         invalid offset table-row ( 1 0 ) + 2 set-ushort 0
108
109         #Invalid TypeName
110         invalid offset table-row ( 1 0 ) + 2 set-ushort 0x8080
111
112         #Empty TypeNamespace
113         invalid offset table-row ( 1 0 ) + 4 set-ushort 0x8080
114 }
115
116 typedef-table {
117         assembly simple-assembly.exe
118
119         #rows
120         valid offset tables-header + 32 set-uint 2
121         invalid offset tables-header + 32 set-uint 0
122
123         #This part of the test suite only verifies structural properties, not table relationships       
124
125         #Flags invalid bits: 6,9,14,15,19,21,24-31
126         invalid offset table-row ( 2 1 ) set-bit 6
127         invalid offset table-row ( 2 1 ) set-bit 9
128         invalid offset table-row ( 2 1 ) set-bit 14
129         invalid offset table-row ( 2 1 ) set-bit 15
130         invalid offset table-row ( 2 1 ) set-bit 19
131         invalid offset table-row ( 2 1 ) set-bit 21
132         invalid offset table-row ( 2 1 ) set-bit 24
133         invalid offset table-row ( 2 1 ) set-bit 25
134         invalid offset table-row ( 2 1 ) set-bit 26
135         invalid offset table-row ( 2 1 ) set-bit 27
136         invalid offset table-row ( 2 1 ) set-bit 28
137         invalid offset table-row ( 2 1 ) set-bit 29
138         invalid offset table-row ( 2 1 ) set-bit 30
139         invalid offset table-row ( 2 1 ) set-bit 31
140
141         #invalid class layout
142         invalid offset table-row ( 2 1 ) or-uint 0x18
143
144         #invalid StringFormatMask - mono doesn't support CustomFormatMask
145         invalid offset table-row ( 2 1 ) or-uint 0x30000
146
147         #CustomStringFormatMask must be zero
148         invalid offset table-row ( 2 1 ) or-uint 0xC00000
149
150         #We ignore all validation requited by HasSecurity
151
152         #TypeName
153         invalid offset table-row ( 2 1 ) + 4 set-ushort 0
154         invalid offset table-row ( 2 1 ) + 4 set-ushort 0x9999
155
156         #TypeNameSpace
157         invalid offset table-row ( 2 1 ) + 6 set-ushort 0x9999
158
159         #Extends is a TypeDefOrRef coded token (uses 2 bits to code typedef, typeref and typespec)
160         #invalid coded table
161         invalid offset table-row ( 2 1 ) + 8 set-ushort 0x33003
162
163         #null token (except system.obj, <module> and interfaces)
164         invalid offset table-row ( 2 1 ) + 8 set-ushort 0x0
165         invalid offset table-row ( 2 1 ) + 8 set-ushort 0x01
166         invalid offset table-row ( 2 1 ) + 8 set-ushort 0x02
167
168         #make type 1 an inteface but let it remain extending something
169         invalid offset table-row ( 2 1 ) or-uint 0x20
170         #interface must extend nothing
171         valid offset table-row ( 2 1 ) or-uint 0xA0 , offset table-row ( 2 1 ) + 8 set-ushort 0x0
172
173         #interface must be abstract
174         invalid offset table-row ( 2 1 ) or-uint 0x20 , offset table-row ( 2 1 ) + 8 set-ushort 0x0
175
176         #TODO add a test for sys.obj (we should test for mscorlib as well)
177
178         valid offset table-row ( 2 0 ) + 8 set-ushort 0
179         #make <module> extend the first typeref entry, which usually is sys.obj
180         #LAMEIMPL MS ignores if <module> extend something.
181         invalid offset table-row ( 2 0 ) + 8 set-ushort 0x5
182 }
183
184 typedef-table-field-list {
185         assembly assembly-with-complex-type.exe
186
187         valid offset table-row ( 2 1 ) + 10 set-ushort 1
188
189         #bad field list 
190         invalid offset table-row ( 2 1 ) + 10 set-ushort 999
191
192         #this type is bigger than the next
193         invalid offset table-row ( 2 1 ) + 10 set-ushort 4
194
195         #can't be zero
196         invalid offset table-row ( 2 0 ) + 10 set-ushort 0
197
198 }
199
200 typedef-table-method-list {
201         assembly assembly-with-complex-type.exe
202
203         valid offset table-row ( 2 1 ) + 12 set-ushort 1
204
205         #bad field list 
206         invalid offset table-row ( 2 1 ) + 12 set-ushort 999
207
208         #this type is bigger than the next
209         invalid offset table-row ( 2 1 ) + 12 set-ushort 5
210
211         #can't be zero
212         invalid offset table-row ( 2 0 ) + 12 set-ushort 0
213
214 }
215
216 field-table {
217         assembly assembly-with-complex-type.exe
218
219         #This tests only verify basic structural properties, they don't verify relationship between tables
220         #flags
221
222         #invalid bits 11, 14 (4)
223         invalid offset table-row ( 4 1 ) set-bit 3
224         invalid offset table-row ( 4 1 ) set-bit 11
225         invalid offset table-row ( 4 1 ) set-bit 14
226
227         #invalid visibility (5)
228         invalid offset table-row ( 4 0 ) or-ushort 0x7
229
230         #field with initonly and literal (6)
231         invalid offset table-row ( 4 0 ) or-ushort 0x60
232
233         #field with literal must be static (7)
234         valid offset table-row ( 4 4 ) or-ushort 0x50
235         invalid offset table-row ( 4 0 ) or-ushort 0x40
236
237         #field with rt special name must have special name (8)
238         #special name
239         valid offset table-row ( 4 0 ) or-ushort 0x0200
240         #special name + rt special name
241
242         #LAMEIMPL MS requires that fields marked rtspecialname to be named value__ even if they are not enums
243         valid offset table-row ( 4 0 ) or-ushort 0x0600
244         #only rt special name
245         invalid offset table-row ( 4 0 ) or-ushort 0x0400
246
247         #no row in the field marshal table for field 0 (9)
248         invalid offset table-row ( 4 0 ) or-ushort 0x1000
249
250         #no row in the constant table for field 0 (10)
251         invalid offset table-row ( 4 0 ) or-ushort 0x8000
252
253         #no row in the field rva table for field 0 (11)
254         invalid offset table-row ( 4 0 ) or-ushort 0x0100
255
256         #name can't be empty or invalid (12)
257         invalid offset table-row ( 4 1 ) + 2 set-ushort 0
258         invalid offset table-row ( 4 1 ) + 2 set-ushort 0x9999
259
260         #invalid signature
261         invalid offset table-row ( 4 1 ) + 4 set-ushort 0x4666
262
263         #if it's a global variable, it must be static and (public|compiler controler|private) (16)
264         #static + compiler controled
265         valid offset table-row ( 2 1 ) + 10 set-ushort 2 , offset table-row ( 4 0 ) set-ushort 0x10 
266         #static + private
267         valid offset table-row ( 2 1 ) + 10 set-ushort 2 , offset table-row ( 4 0 ) set-ushort 0x11
268         #static + public
269         valid offset table-row ( 2 1 ) + 10 set-ushort 2 , offset table-row ( 4 0 ) set-ushort 0x16 
270         #static + bad visibility
271         #LAMEIMPL MS doesn't verify visibility
272         invalid offset table-row ( 2 1 ) + 10 set-ushort 2 , offset table-row ( 4 0 ) set-ushort 0x12
273         invalid offset table-row ( 2 1 ) + 10 set-ushort 2 , offset table-row ( 4 0 ) set-ushort 0x13
274         invalid offset table-row ( 2 1 ) + 10 set-ushort 2 , offset table-row ( 4 0 ) set-ushort 0x14
275         invalid offset table-row ( 2 1 ) + 10 set-ushort 2 , offset table-row ( 4 0 ) set-ushort 0x15
276
277         #public and not static
278         invalid offset table-row ( 2 1 ) + 10 set-ushort 2 , offset table-row ( 4 0 ) set-ushort 0x06 
279
280         #field is constant but has no row in the contant table
281         #LAMESPEC this check is missing from the spec
282         invalid offset table-row ( 4 0 ) or-ushort 0x50
283
284         #TODO enum and signature content
285 }
286
287 methoddef-table {
288         assembly assembly-with-methods.exe
289
290         #bad implflags (3)
291         #unused bits 4,5,6,8,9,10,11,15
292         #LAMEIMPL MS doesn't check invalid bits  6,8,9,10,11,13,14,15
293         invalid offset table-row ( 6 0 ) + 4 set-bit 6
294         invalid offset table-row ( 6 0 ) + 4 set-bit 8
295         invalid offset table-row ( 6 0 ) + 4 set-bit 9
296         invalid offset table-row ( 6 0 ) + 4 set-bit 10
297         invalid offset table-row ( 6 0 ) + 4 set-bit 11
298         invalid offset table-row ( 6 0 ) + 4 set-bit 13
299         invalid offset table-row ( 6 0 ) + 4 set-bit 14
300         invalid offset table-row ( 6 0 ) + 4 set-bit 15
301
302         #bad flags (4)
303         #no unused bits
304         
305         #invalid .ctor with generic params and specialname (6)
306         #method 0 is a .ctor, method 1 is generic
307         invalid offset table-row ( 6 1 ) + 6 or-ushort 0x1800 , offset table-row ( 6 1 ) + 8 set-ushort read.ushort ( table-row ( 6 0 ) + 8 )
308
309         #visibility 0x7 is invalid (6)
310         invalid offset table-row ( 6 0 ) + 6 or-ushort 0x7
311
312         #Invalid combination of flags (7)
313         #static + final
314         invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0030
315         #static + virtual
316         invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0050
317         #static + newslot
318         invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0110
319         #final + abstract
320         invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0420
321         #abstract + pinvokeimpl
322         invalid offset table-row ( 6 2 ) + 6 set-ushort 0x2400
323
324         #LAMEIMPL MS doesn't care about this
325         #compilercontrolled | specialname
326         invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0800
327
328         #LAMEIMPL MS doesn't care about this
329         #compilercontrolled | rtspecialname
330         invalid offset table-row ( 6 2 ) + 6 set-ushort 0x1800
331
332         #Abstract method must be virtual (8)
333         invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0400
334
335         #A rtspecialnamemethod must be special name (9)
336         invalid offset table-row ( 6 2 ) + 6 set-ushort 0x1000
337
338         #XXX we don't care about CAS security (10, 11,12,13)
339
340         #name shall be non empty (14)
341         invalid offset table-row ( 6 2 ) + 8 set-ushort 0
342         invalid offset table-row ( 6 2 ) + 8 set-ushort 0x9999
343
344         #Interface cannot have .ctors (15)
345         #method 3 belongs to an inteface
346         invalid offset table-row ( 6 3 ) + 8 set-ushort read.ushort ( table-row ( 6 0 ) + 8 )
347         #Interfacre methods can't be static 
348         invalid offset table-row ( 6 3 ) + 6 or-ushort 0x0010 
349
350         #XXX we don't care about CLS names (17)
351
352         #signature shall be good (18)
353         invalid offset table-row ( 6 2 ) + 10 set-ushort 0x9999
354
355         #TODO type kind check for valuetypes (21)
356         #TODO implement duplicate detection (22)
357
358         #if (final,newslot or stric) then it must be virtual (24)
359         #final
360         valid offset table-row ( 6 2 ) + 6 set-ushort 0x0060
361         invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0020
362
363         #newslot
364         valid offset table-row ( 6 2 ) + 6 set-ushort 0x0140
365         invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0100
366
367         #strict
368         valid offset table-row ( 6 2 ) + 6 set-ushort 0x0240
369         invalid offset table-row ( 6 2 ) + 6 set-ushort 0x0200
370
371         #if pinvoke then it must not be virtual (25)
372         #this is a pretty stupid test as all pinvokes must be static, which disallows virtual
373         #method 5 is a pinvoke
374         invalid offset table-row ( 6 5 ) + 6 or-ushort 0x0040
375
376         #if !abstract then only one of: rva != 0, pinvoke or implruntime (26)
377         #pinvoke with rva != 0
378         invalid offset table-row ( 6 5 ) set-uint read.uint ( table-row ( 6 2 ) )
379
380         #pinvoke with runtime
381         #LAMEIMPL/SPEC either MS ignores it or the spec is ill defined 
382         #invalid offset table-row ( 6 5 ) + 4 or-ushort 0x1000
383
384         #if compilercontroled (0x0) it must have an RVA or a pinvoke
385         #let's change method 3 which is part of an interface
386         invalid offset table-row ( 6 3 ) + 6 set-ushort 0x05c0
387
388         #TODO check signature (28,29,30,31,32,33)
389
390         #if RVA = 0 then one of (abstract, runtime, pinvoke) (34)
391         #let's test with an abstract class, method 6 is abstract and belongs to one.
392         invalid offset table-row ( 6 7 ) + 6 set-ushort 0x0006
393         #icall 
394         valid offset table-row ( 6 7 ) + 6 set-ushort 0x01c6 , offset table-row ( 6 7 ) + 4 or-ushort 0x1000
395
396         #if rva != 0 then abstract == 0 and codetypemask must be (native,cil,runtime) and rva shall be valid  (35)
397         #rva != 0 and abstract == 0
398         invalid offset table-row ( 6 2 ) + 6 or-ushort 0x0400
399         #rva != 0 and codetypemask == OPTIL
400         invalid offset table-row ( 6 2 ) + 4 set-ushort 0x0002
401         #invalid rva
402         invalid offset table-row ( 6 2 ) set-uint 0x999999
403
404         #if pinvoke the rva == 0 and has a row in implmap (36)
405         #method 5 is a pinvoke
406         #pinvoke with rva !=0
407         invalid offset table-row ( 6 5 ) set-uint 0x20f8
408         #pinvoke without an implmap row
409         invalid offset table-row ( 0x1C 0 ) + 2 set-ushort 0xF
410
411         #if rtspecialname = 1 then name must be: .ctor and .cctor (37)
412         #is not .ctor or .cctor
413         invalid offset table-row ( 6 2 ) + 6 or-ushort 0x1800
414
415         #.ctor or .cctor without rtspecialname (38)
416         #method 9 is .ctor method 10 is .cctor
417         invalid offset table-row ( 6 9 ) + 6 set-ushort 0x0006
418         invalid offset table-row ( 6 10 ) + 6 set-ushort 0x0016
419
420         #TODO do all .ctor and .cctor valdiation (39, 40)
421 }
422
423 methoddef-table-global-methods {
424         assembly assembly-with-global-method.exe
425
426         #checks for methods owned by <module> (20)
427         
428         #static + public
429         valid offset table-row ( 6 0 ) + 6 set-ushort 0x0010
430         #static + private
431         valid offset table-row ( 6 0 ) + 6 set-ushort 0x0011
432         #static + compiler controled
433         valid offset table-row ( 6 0 ) + 6 set-ushort 0x0016
434
435         #must be static
436         invalid offset table-row ( 6 0 ) + 6 set-ushort 0x0006
437
438         #must not be abstract
439         invalid offset table-row ( 6 0 ) + 6 set-ushort 0x0416
440
441         #must not be virtual
442         invalid offset table-row ( 6 0 ) + 6 set-ushort 0x0056
443
444         #can only be compiler controled, public or private
445         #which leaves out: famandassem assem family famorassem
446         #LAMEIMPL MS doesn't care about those bits.
447         invalid offset table-row ( 6 0 ) + 6 set-ushort 0x0012
448         invalid offset table-row ( 6 0 ) + 6 set-ushort 0x0013
449         invalid offset table-row ( 6 0 ) + 6 set-ushort 0x0014
450         invalid offset table-row ( 6 0 ) + 6 set-ushort 0x0015
451 }
452
453 methoddef-table-params {
454         assembly assembly-with-methods.exe
455
456         #method 12,13,14 have 3 params and params: 2,5,8        
457         #method 13 has 3 params and params: 5
458         invalid offset table-row ( 6 12 ) + 12 set-ushort 6
459         invalid offset table-row ( 6 13 ) + 12 set-ushort 99 
460 }
461
462
463 param-table {
464         assembly assembly-with-params.exe
465
466         #Flags should only have valid bits (3)
467         #bits not used: 2,3,5,6,7,8,910,11,14,15
468         invalid offset table-row ( 8 0 ) set-bit 2
469         invalid offset table-row ( 8 0 ) set-bit 3
470         invalid offset table-row ( 8 0 ) set-bit 5
471         invalid offset table-row ( 8 0 ) set-bit 6
472         invalid offset table-row ( 8 0 ) set-bit 7
473         invalid offset table-row ( 8 0 ) set-bit 8
474         invalid offset table-row ( 8 0 ) set-bit 9
475         invalid offset table-row ( 8 0 ) set-bit 10
476         invalid offset table-row ( 8 0 ) set-bit 11
477         invalid offset table-row ( 8 0 ) set-bit 14
478         invalid offset table-row ( 8 0 ) set-bit 15
479
480         #TODO verify if sequence is < number of params, requires to decode signature (4)
481
482         #ordering
483         valid offset table-row ( 8 0 ) + 2 set-ushort 0
484         invalid offset table-row ( 8 0 ) + 2 set-ushort 2
485         invalid offset table-row ( 8 1 ) + 2 set-ushort 1
486
487         
488         #if HasDefault = 1 then there must be a row in the constant table (6)
489         #param 2 doesn't have a default
490         invalid offset table-row ( 8 2 ) or-ushort 0x1000
491
492         #if HasDefault = 0 then there must be no row in the constant table (7)
493         #param 0 have a default
494         invalid offset table-row ( 8 0 ) set-ushort 0x000
495
496         #if FieldMarshal = 1 the there must be a row in the FieldMarshal table
497         invalid offset table-row ( 8 1 ) set-ushort 0x2000
498
499         invalid offset table-row ( 8 1 ) + 4 set-ushort 0x99999
500         #ok to be empty
501         valid offset table-row ( 8 1 ) + 4 set-ushort 0
502 }
503
504 interfaceimpl-table {
505         assembly assembly-with-complex-type.exe
506
507         #class cannot be null (2)
508         #LAMEIMPL MS allows a null class
509         valid offset table-row ( 9 0 ) set-ushort 0
510
511         #class must be a valid row (3.a)
512         invalid offset table-row ( 9 0 ) set-ushort 0x9999
513
514         #interface must be a valid token (3.b)
515         #null
516         invalid offset table-row ( 9 0 ) + 2 set-ushort 0
517         #invalid table bit 0x3
518         invalid offset table-row ( 9 0 ) + 2 set-ushort 0x7
519         #invalid token typedef
520         invalid offset table-row ( 9 0 ) + 2 set-ushort 0x8800
521         #invalid token typeref
522         invalid offset table-row ( 9 0 ) + 2 set-ushort 0x8801
523         #invalid token typespec
524         invalid offset table-row ( 9 0 ) + 2 set-ushort 0x8802
525
526         #TODO verify if the target is an interface (3.c)
527
528 }
529
530 memberref-table {
531         assembly assembly-with-complex-type.exe
532         
533         #class must be a valid token (1 2)
534         #null
535         invalid offset table-row ( 10 0 ) set-ushort 0
536         #invalid coded table
537         invalid offset table-row ( 10 0 ) set-ushort 0x0015
538         invalid offset table-row ( 10 0 ) set-ushort 0x0016
539         invalid offset table-row ( 10 0 ) set-ushort 0x0017
540         #invalid code index
541         invalid offset table-row ( 10 0 ) set-ushort 0x1000
542         invalid offset table-row ( 10 0 ) set-ushort 0x1001
543         invalid offset table-row ( 10 0 ) set-ushort 0x1002
544         invalid offset table-row ( 10 0 ) set-ushort 0x1003
545         invalid offset table-row ( 10 0 ) set-ushort 0x1004
546
547         #name must be valid and non-empty (3)
548         invalid offset table-row ( 10 0 ) + 2 set-ushort 0x0000
549         invalid offset table-row ( 10 0 ) + 2 set-ushort 0x9900
550
551         #signature must be valid (5)
552         invalid offset table-row ( 10 0 ) + 4 set-ushort 0x9900
553         
554
555         #TODO validate the signature (5)
556
557         #LAMESPEC CompilerControled visibility (9,10) is nice but no impl care about
558
559         #LAMESPEC what does (11) mean? 
560 }
561
562 constant-table {
563         assembly assembly-with-constants.exe
564
565         #type must be one of (bool, char, i1, u1, i2, u2, i4, u4, i8, u8, r4, r8, string or class
566         #class must have value zero (1)
567         #this means (type >= 0x02 && type <= 0x0e) or (type == 0x12 && value == 0)
568         #bad type
569         invalid offset table-row ( 0xB 0 ) set-byte 0x00
570         invalid offset table-row ( 0xB 0 ) set-byte 0x01
571         invalid offset table-row ( 0xB 0 ) set-byte 0x01
572         invalid offset table-row ( 0xB 0 ) set-byte 0x0F
573         invalid offset table-row ( 0xB 0 ) set-byte 0x10
574         invalid offset table-row ( 0xB 0 ) set-byte 0x11
575         invalid offset table-row ( 0xB 0 ) set-byte 0x13
576         invalid offset table-row ( 0xB 0 ) set-byte 0x20
577
578         #type == class && value != 0
579         invalid offset table-row ( 0xB 2 ) set-byte 0x12 , offset table-row ( 0xB 2 ) + 4 set-ushort 0x0001
580
581         #parent is a valid row in the field, property or param table (3)
582         #Test for a property with a valid default value
583         #First remove default from param 'a' (param table idx 0)
584         #Then set the has default flag in the property table
585         #Finally, make the first constant point from the part to the property (const 1, prop 0, token 0x6)
586         valid offset table-row ( 0x8 0 ) set-ushort 0 , offset table-row ( 0x17 0 ) or-ushort 0x1000 , offset table-row ( 0xB 1 ) + 2 set-ushort 0x6 
587
588         #Invalid coded table
589         invalid offset table-row ( 0xB 0 ) + 2 set-ushort 0x0013 , offset table-row ( 0x04 0 ) set-ushort 0x16
590         #null
591         invalid offset table-row ( 0xB 0 ) + 2 set-ushort 0x0000 , offset table-row ( 0x04 0 ) set-ushort 0x16
592         #bad field
593         invalid offset table-row ( 0xB 0 ) + 2 set-ushort 0x00F0 , offset table-row ( 0x04 0 ) set-ushort 0x16
594         #bad param
595         invalid offset table-row ( 0xB 0 ) + 2 set-ushort 0x00F1 , offset table-row ( 0x04 0 ) set-ushort 0x16
596         #bad property
597         invalid offset table-row ( 0xB 0 ) + 2 set-ushort 0x00F2 , offset table-row ( 0x04 0 ) set-ushort 0x16
598
599         #TODO check for dups
600
601         #TODO check value range
602         #we set it to 1 less the end of the blob heap
603         invalid offset table-row ( 0xB 0 ) + 4 set-ushort read.uint ( stream-header ( 3 ) + 4 )
604
605         #LAMEIMPL, MS doesn't bound check the constant size. Lame of them.
606         invalid offset table-row ( 0xB 0 ) + 4 set-ushort read.uint ( stream-header ( 3 ) + 4 ) - 1 
607 }
608
609 cattr-table {
610         assembly assembly-with-cattr.exe
611
612         #parent is a valid coded index (2)
613         #The spec say any table can be used, but only 19 tables are allowed on the coded token
614         #bad table
615         invalid offset table-row ( 0xC 0 ) set-ushort 0x33
616         invalid offset table-row ( 0xC 0 ) set-ushort 0x34
617         invalid offset table-row ( 0xC 0 ) set-ushort 0x35
618         invalid offset table-row ( 0xC 0 ) set-ushort 0x36
619
620         #LAMEIMPL MS doesn't test this error
621         invalid offset table-row ( 0xC 0 ) set-ushort 0x37
622         #LAMEIMPL MS doesn't test this error
623         invalid offset table-row ( 0xC 0 ) set-ushort 0x38
624
625         invalid offset table-row ( 0xC 0 ) set-ushort 0x39
626         invalid offset table-row ( 0xC 0 ) set-ushort 0x3A
627         invalid offset table-row ( 0xC 0 ) set-ushort 0x3B
628         invalid offset table-row ( 0xC 0 ) set-ushort 0x3C
629         invalid offset table-row ( 0xC 0 ) set-ushort 0x3D
630         invalid offset table-row ( 0xC 0 ) set-ushort 0x3E
631         invalid offset table-row ( 0xC 0 ) set-ushort 0x3F
632
633         #bad index
634         invalid offset table-row ( 0xC 0 ) set-ushort 0x8801
635         invalid offset table-row ( 0xC 0 ) set-ushort 0x8832
636
637         #type is a valid token (3)
638         #this uses 3 bits and only 0x2/0x3 are valid
639         invalid offset table-row ( 0xC 0 ) + 2 set-ushort 0x0008
640         invalid offset table-row ( 0xC 0 ) + 2 set-ushort 0x0009
641         valid offset table-row ( 0xC 0 ) + 2 set-ushort 0x000A
642         valid offset table-row ( 0xC 0 ) + 2 set-ushort 0x000B
643         invalid offset table-row ( 0xC 0 ) + 2 set-ushort 0x000C
644         invalid offset table-row ( 0xC 0 ) + 2 set-ushort 0x000D
645         invalid offset table-row ( 0xC 0 ) + 2 set-ushort 0x000E
646         invalid offset table-row ( 0xC 0 ) + 2 set-ushort 0x000F
647
648         #value is optional (4)
649         valid offset table-row ( 0xC 0 ) + 4 set-ushort 0
650
651         #Valid is a valid blob index (5)
652         invalid offset table-row ( 0xC 0 ) + 4 set-ushort 0x8888
653
654         #TODO validate the cattr blob (6,7,8,9)
655         #TODO verify is Type is a .ctor.
656 }
657
658 field-marshal-table {
659         assembly assembly-with-complex-type.exe
660
661         #part must be valid (2)
662         #LAMEIMPL MS doesn't verify for null
663         invalid offset table-row ( 0xd 0 ) set-ushort 0x0000 , offset table-row ( 0x4 5 ) set-ushort 0x0001
664         invalid offset table-row ( 0xd 0 ) set-ushort 0x8800 , offset table-row ( 0x4 5 ) set-ushort 0x0001
665         invalid offset table-row ( 0xd 0 ) set-ushort 0x8801 , offset table-row ( 0x4 5 ) set-ushort 0x0001
666
667         #native type must index non null valid blob index (3)
668         #LAMEIMPL MS doesn't verify for null
669         invalid offset table-row ( 0xd 0 ) + 2 set-ushort 0
670         invalid offset table-row ( 0xd 0 ) + 2 set-ushort 0x9900
671
672         #TODO check for dups (4)
673
674         #TODO check the marshalspec blob (5)
675 }
676
677 decl-security-table {
678         assembly assembly-with-cas.exe
679
680         #bad parent (2)
681         invalid offset table-row ( 0xe 0 ) + 2 set-ushort 0x0000
682         invalid offset table-row ( 0xe 0 ) + 2 set-ushort 0x0007
683         invalid offset table-row ( 0xe 0 ) + 2 set-ushort 0x1000
684         invalid offset table-row ( 0xe 0 ) + 2 set-ushort 0x1001
685         invalid offset table-row ( 0xe 0 ) + 2 set-ushort 0x1002
686
687         #bad permission set (6)
688         invalid offset table-row ( 0xe 0 ) + 4 set-ushort 0x8800
689 }
690
691 class-layout-table {
692         assembly assembly-with-complex-type.exe
693
694         #valid parent row (2)
695         invalid offset table-row ( 0xF 0 ) + 6 set-ushort 0x0000
696         invalid offset table-row ( 0xF 0 ) + 6 set-ushort 0x0880
697
698         #TODO check that the type is not an interface (2)
699         #TODO parent must not have auto layout (3)
700
701         #packing must be (0,1,2,4,8,16,32,64,128) (4)
702         invalid offset table-row ( 0xF 0 ) set-ushort 0x0003
703
704         #TODO do checks depending on the kind of parent (4) 
705
706         #Check layout along the inheritance chain. (7)
707 }
708
709 field-layout-table {
710         assembly assembly-with-complex-type.exe
711
712         #TODO check properties of the field (2, 5, 7, 8, 9)
713
714         #Field must be valid (4)
715         invalid offset table-row ( 0x10 0 ) + 4 set-ushort 0x0000
716         invalid offset table-row ( 0x10 0 ) + 4 set-ushort 0x8800
717
718 }
719
720 stand-alone-sig-table {
721         assembly assembly-with-complex-type.exe
722
723         #signature has a valid blob index (2)
724
725         #TODO validate the blob content. (3)
726         invalid offset table-row ( 0x11 0 ) set-ushort 0x8800
727
728 }
729
730 event-map-table {
731         assembly assembly-with-events.exe
732
733         #parent must be a valid typedef token
734         invalid offset table-row ( 0x12 0 ) set-ushort 0x8800
735
736         #bad eventlist
737         invalid offset table-row ( 0x12 0 ) + 2 set-ushort 0x0000
738         invalid offset table-row ( 0x12 0 ) + 2 set-ushort 0x8800
739
740         #eventlist must not be duplicated and increase monotonically
741         #evt list is 1,3,7 we change the first to 4
742         invalid offset table-row ( 0x12 0 ) + 2 set-ushort 4
743 }
744
745 event-table {
746         assembly assembly-with-events.exe
747
748         #event flags have valid bits (3)
749         #only bits 9 and 10 are used 
750
751         invalid offset table-row ( 0x14 0 ) set-bit 0
752         invalid offset table-row ( 0x14 0 ) set-bit 1
753         invalid offset table-row ( 0x14 0 ) set-bit 2
754         invalid offset table-row ( 0x14 0 ) set-bit 3
755         invalid offset table-row ( 0x14 0 ) set-bit 4
756         invalid offset table-row ( 0x14 0 ) set-bit 5
757         invalid offset table-row ( 0x14 0 ) set-bit 6
758         invalid offset table-row ( 0x14 0 ) set-bit 7
759         invalid offset table-row ( 0x14 0 ) set-bit 8
760         invalid offset table-row ( 0x14 0 ) set-bit 11
761         invalid offset table-row ( 0x14 0 ) set-bit 12
762         invalid offset table-row ( 0x14 0 ) set-bit 13
763         invalid offset table-row ( 0x14 0 ) set-bit 14
764         invalid offset table-row ( 0x14 0 ) set-bit 15
765
766         #name is a valid non empty string (4)
767         invalid offset table-row ( 0x14 0 ) + 2 set-ushort 0
768         invalid offset table-row ( 0x14 0 ) + 2 set-ushort 0x8880
769
770         #event type can be null (6)
771         valid offset table-row ( 0x14 0 ) + 4 set-ushort 0
772
773         #event type is valid (7)
774         #coded table 0x3 is invalid
775         invalid offset table-row ( 0x14 0 ) + 4 set-ushort 0x7
776         invalid offset table-row ( 0x14 0 ) + 4 set-ushort 0x8880
777         invalid offset table-row ( 0x14 0 ) + 4 set-ushort 0x8881
778         invalid offset table-row ( 0x14 0 ) + 4 set-ushort 0x8882
779
780         #TODO eventtype must be a class (8)
781
782         #TODO for each row, there shall be one add_ and one remove_ row in methodsemantics (9)
783         #change AddOn to Other
784         invalid offset table-row ( 0x18 0 ) set-ushort 0x0004
785         #change RemoveOn to Other
786         invalid offset table-row ( 0x18 1 ) set-ushort 0x0004
787
788         #TODO for each row, there can be zero or one raise_ rows (10)
789
790         #TODO check for dups
791 }
792
793 property-map-table {
794         assembly assembly-with-properties.exe
795
796         #parent must be a valid typedef token
797         invalid offset table-row ( 0x15 0 ) set-ushort 0x8800
798
799         #bad propertylist
800         invalid offset table-row ( 0x15 0 ) + 2 set-ushort 0x0000
801         invalid offset table-row ( 0x15 0 ) + 2 set-ushort 0x8800
802
803         #propertylist must not be duplicated and increase monotonically
804         #property list is 1,3,7 we change the first to 4
805         invalid offset table-row ( 0x15 0 ) + 2 set-ushort 4
806 }
807
808 property-table {
809         assembly assembly-with-properties.exe
810
811         #valid flags (3)
812         #only bits 9, 10 and 12 are used 
813         invalid offset table-row ( 0x17 0 ) set-bit 0
814         invalid offset table-row ( 0x17 0 ) set-bit 1
815         invalid offset table-row ( 0x17 0 ) set-bit 2
816         invalid offset table-row ( 0x17 0 ) set-bit 3
817         invalid offset table-row ( 0x17 0 ) set-bit 4
818         invalid offset table-row ( 0x17 0 ) set-bit 5
819         invalid offset table-row ( 0x17 0 ) set-bit 6
820         invalid offset table-row ( 0x17 0 ) set-bit 7
821         invalid offset table-row ( 0x17 0 ) set-bit 8
822         invalid offset table-row ( 0x17 0 ) set-bit 11
823         invalid offset table-row ( 0x17 0 ) set-bit 13
824         invalid offset table-row ( 0x17 0 ) set-bit 14
825         invalid offset table-row ( 0x17 0 ) set-bit 15
826
827         #valid non empty name (4)
828         invalid offset table-row ( 0x17 0 ) + 2 set-ushort 0
829         invalid offset table-row ( 0x17 0 ) + 2 set-ushort 0x8800
830
831         #type must be a non null type signature in the blob heap (6)
832         invalid offset table-row ( 0x17 0 ) + 4 set-ushort 0
833         invalid offset table-row ( 0x17 0 ) + 4 set-ushort 0x8800
834
835         #TODO signature must be of the right kind (7)
836
837         #if property has default, there must be a row in the defaults table
838         #we mark row zero as having default value
839         #field zero has default value
840         valid offset table-row (0x17 0) + 0 or-ushort  0x1000, #mark the property with hasdefault
841                   offset table-row (0x04 0) + 0 set-ushort 0x0011, #clear literal and hasdefault from the field
842                   offset table-row (0x0B 0) + 2 set-ushort 0x0006  #change the parent token to row 1 of the property table (0x2) 
843
844         invalid offset table-row (0x17 0) + 0 or-ushort  0x1000
845
846         #TODO check for dups
847 }
848
849 methodimpl-table {
850         assembly assembly-with-complex-type.exe
851
852         #class shall be valid (2)
853         invalid offset table-row (0x19 0) set-ushort 0 
854         invalid offset table-row (0x19 0) set-ushort 0x8800
855
856         #methodbody shall be valid (3)
857         #null
858         invalid offset table-row (0x19 0) + 2 set-ushort 0x0000 
859         invalid offset table-row (0x19 0) + 2 set-ushort 0x0001
860         #out of range
861         invalid offset table-row (0x19 0) + 2 set-ushort 0x8800 
862         invalid offset table-row (0x19 0) + 2 set-ushort 0x8801
863
864         #MethodDeclaration shall be valid
865         #null
866         invalid offset table-row (0x19 0) + 4 set-ushort 0x0000 
867         invalid offset table-row (0x19 0) + 4 set-ushort 0x0001
868         #out of range
869         invalid offset table-row (0x19 0) + 4 set-ushort 0x8800 
870         invalid offset table-row (0x19 0) + 4 set-ushort 0x8801
871         
872
873         #TODO check MethodDeclaration method for virtual and owner type for !sealed (4,5)       
874         #TODO check MethodBody for belonging to a super type of Class,been virtual and rva != 0 (6,7,8)
875         #TODO check MethodBody must belong to any ancestor or iface of Class (9)
876         #TODO check MethodDeclaration method shall not be final (10)
877         #TODO if MethodDeclaration is strict, it must be visible to Class (11)
878         #TODO the method signature of MethodBody must match of MethodDeclaration (12)   
879         #TODO no dups
880 }
881
882 moduleref-table {
883         assembly assembly-with-module.exe
884
885         #string must be valid (2)
886         invalid offset table-row (0x1A 0) set-ushort 0
887         invalid offset table-row (0x1A 0) set-ushort 0x8801
888
889         #TODO there must be a row on the File table with the same name
890 }
891
892 typespec-table {
893         assembly assembly-with-complex-type.exe
894
895         #valid signature
896         invalid offset table-row (0x1B 0) set-ushort 0
897         invalid offset table-row (0x1B 0) set-ushort 0x8800
898 }
899
900 implmap-table {
901         assembly assembly-with-methods.exe
902
903         #flags has good values (2)
904         #used bits: 0,1,2,7,8,9,10
905         invalid offset table-row (0x1C 0) set-bit 3
906         invalid offset table-row (0x1C 0) set-bit 4
907         invalid offset table-row (0x1C 0) set-bit 5
908         invalid offset table-row (0x1C 0) set-bit 6
909         invalid offset table-row (0x1C 0) set-bit 11
910         invalid offset table-row (0x1C 0) set-bit 12
911         invalid offset table-row (0x1C 0) set-bit 13
912         invalid offset table-row (0x1C 0) set-bit 14
913         invalid offset table-row (0x1C 0) set-bit 15
914
915         #call conv 0 and 6 are invalid
916         invalid offset table-row (0x1C 0) set-ushort 0x0000
917         invalid offset table-row (0x1C 0) set-ushort 0x0600
918         invalid offset table-row (0x1C 0) set-ushort 0x0700
919
920         #memberforwarded token is valid and indexes a method (3)
921         #pinvoke is row 5
922         invalid offset table-row (0x1C 0) + 2 set-ushort 0x0000, #null
923                         offset table-row (0x06 5) + 6 set-ushort 0x0444 #set method to abstract instead of pinvoke
924         invalid offset table-row (0x1C 0) + 2 set-ushort 0x0002, #field
925                         offset table-row (0x06 5) + 6 set-ushort 0x0444 #set method to abstract instead of pinvoke
926         invalid offset table-row (0x1C 0) + 2 set-ushort 0x8801, #bad method
927                         offset table-row (0x06 5) + 6 set-ushort 0x0444 #set method to abstract instead of pinvoke
928
929         #charset rule is not required (4)
930
931         #import name must be valid (5)
932         invalid offset table-row (0x1C 0) + 4 set-ushort 0x0000 #null
933         invalid offset table-row (0x1C 0) + 4 set-ushort 0x8800 #invalid
934
935         #import scope must be valie (6)
936         invalid offset table-row (0x1C 0) + 6 set-ushort 0x0000 #null
937         invalid offset table-row (0x1C 0) + 6 set-ushort 0x8800 #invalid
938
939         #TODO check methoddef for pinvokeimpl and state (7)
940 }
941
942 fieldrva-table {
943         assembly assembly-with-complex-type.exe
944
945         #rva non zero (1)
946         invalid offset table-row (0x1D 0) set-uint 0
947         #valid rva (2)
948         invalid offset table-row (0x1D 0) set-uint 0x88880000
949
950         #valid field (4)
951         #field 17 has rva
952         invalid offset table-row (0x1D 0) + 4 set-ushort 0,
953                         offset table-row (0x04 17) set-ushort 0x0013 #remove fieldrva from target field
954         invalid offset table-row (0x1D 0) + 4 set-ushort 0x9901,
955                         offset table-row (0x04 17) set-ushort 0x0013 
956
957
958         #TODO verify if the field is a blitable valuetype
959         #TODO verify if the field.size + rva does boundcheck
960 }
961
962 assembly-table {
963         assembly simple-assembly.exe
964
965         #The table can have zero or 1 row (1)
966         #rows
967         invalid offset tables-header + 40 set-uint 2,
968                         offset stream-header (0) + 4 set-uint read.uint (stream-header (0) + 4) + 22 #increase the size of the #~ section
969
970         #bad hasalg (2) 
971         valid offset table-row (0x20 0) set-uint 0
972         valid offset table-row (0x20 0) set-uint 0x8003
973         valid offset table-row (0x20 0) set-uint 0x8004
974         invalid offset table-row (0x20 0) set-uint 0x8005
975         invalid offset table-row (0x20 0) set-uint 1
976
977         #good flags (4)
978         #only bits 0, 8, 14 and 15 are used
979         invalid offset table-row (0x20 0) + 12 set-bit 1
980         invalid offset table-row (0x20 0) + 12 set-bit 5
981         invalid offset table-row (0x20 0) + 12 set-bit 9
982         invalid offset table-row (0x20 0) + 12 set-bit 11
983         invalid offset table-row (0x20 0) + 12 set-bit 16
984         invalid offset table-row (0x20 0) + 12 set-bit 20
985         invalid offset table-row (0x20 0) + 12 set-bit 23
986         invalid offset table-row (0x20 0) + 12 set-bit 26
987         invalid offset table-row (0x20 0) + 12 set-bit 29
988         invalid offset table-row (0x20 0) + 12 set-bit 30
989         invalid offset table-row (0x20 0) + 12 set-bit 31
990
991
992         #valid pub key (5)
993         valid offset table-row (0x20 0) + 16 set-ushort 0 
994         invalid offset table-row (0x20 0) + 16 set-ushort 0x9990
995
996         #name is a valid non-empty string (5)
997         invalid offset table-row (0x20 0) + 18 set-ushort 0
998         invalid offset table-row (0x20 0) + 18 set-ushort 0x9990
999
1000         #culture is an optional valid non-empty string (8)
1001         valid offset table-row (0x20 0) + 20 set-ushort 0 
1002         invalid offset table-row (0x20 0) + 20 set-ushort 0x9990
1003
1004         #TODO check if culture is one of the listed cultures (9) (23.1.3)
1005 }
1006
1007 assembly-ref-table {
1008         assembly simple-assembly.exe
1009
1010         #flags can only have publickey set (2)
1011         valid offset table-row (0x23 0) + 8 set-uint 0
1012         valid offset table-row (0x23 0) + 8 set-uint 1
1013         invalid offset table-row (0x23 0) + 8 set-uint 0x0100
1014         invalid offset table-row (0x23 0) + 8 set-uint 0x4000
1015         invalid offset table-row (0x23 0) + 8 set-uint 0x8000
1016         invalid offset table-row (0x23 0) + 8 set-bit 2
1017         invalid offset table-row (0x23 0) + 8 set-bit 5
1018         invalid offset table-row (0x23 0) + 8 set-bit 9
1019         invalid offset table-row (0x23 0) + 8 set-bit 20
1020         invalid offset table-row (0x23 0) + 8 set-bit 22
1021         invalid offset table-row (0x23 0) + 8 set-bit 30
1022
1023         #PublicKeyToken is valid (3)
1024         valid offset table-row (0x23 0) + 12 set-ushort 0
1025         invalid offset table-row (0x23 0) + 12 set-ushort 0x9700
1026
1027         #name is a valid non-empty string (5)
1028         invalid offset table-row (0x23 0) + 14 set-ushort 0x9700
1029         invalid offset table-row (0x23 0) + 14 set-ushort 0
1030
1031         #culture is an optional valid non-empty string (6)
1032         valid offset table-row (0x23 0) + 16 set-ushort 0 
1033         invalid offset table-row (0x23 0) + 16 set-ushort 0x9990
1034
1035         #TODO check if culture is one of the listed cultures (7) (23.1.3)
1036
1037         #HashValue is an optinal valid blob item (9)
1038         valid offset table-row (0x23 0) + 18 set-ushort 0
1039         invalid offset table-row (0x23 0) + 18 set-ushort 0x9990
1040
1041         #it's ok to have dups
1042 }
1043
1044 file-table {
1045         assembly assembly-with-resource.exe
1046
1047         #flags is valid (1)
1048         #only bit 0 is valid
1049         invalid offset table-row (0x26 0) set-bit 1
1050         invalid offset table-row (0x26 0) set-bit 4
1051         invalid offset table-row (0x26 0) set-bit 6
1052         invalid offset table-row (0x26 0) set-bit 8
1053         invalid offset table-row (0x26 0) set-bit 11
1054         invalid offset table-row (0x26 0) set-bit 17
1055         invalid offset table-row (0x26 0) set-bit 22
1056         invalid offset table-row (0x26 0) set-bit 27
1057         invalid offset table-row (0x26 0) set-bit 29
1058         invalid offset table-row (0x26 0) set-bit 31
1059
1060         #name is a non empty string (2)
1061         invalid offset table-row (0x26 0) + 4 set-ushort 0
1062         invalid offset table-row (0x26 0) + 4 set-ushort 0x9999
1063
1064         #hash is a valid blob item (3)
1065         invalid offset table-row (0x26 0) + 6 set-ushort 0
1066         invalid offset table-row (0x26 0) + 6 set-ushort 0x9999
1067
1068         #TODO check name format (I belive only the lack of directory directives should be checked)
1069         #TODO check for dups based on name
1070         #TODO check for images with rows in file and assembly tables
1071 }
1072
1073 exported-type-table {
1074         assembly assembly-with-module.exe
1075
1076         #flags is valid (it's a TypeAttribute flag set) (3)
1077         #Flags invalid bits: 6,9,14,15,19,21,24-31
1078         invalid offset table-row (0x27 0) set-bit 6 #this is a mysterious bit on MS
1079         invalid offset table-row (0x27 0) set-bit 9
1080         invalid offset table-row (0x27 0) set-bit 14
1081         invalid offset table-row (0x27 0) set-bit 15
1082         invalid offset table-row (0x27 0) set-bit 19
1083         valid offset table-row (0x27 0) set-bit 21 #this is the non specified FORWARDER bit
1084         invalid offset table-row (0x27 0) set-bit 24
1085         invalid offset table-row (0x27 0) set-bit 25
1086         invalid offset table-row (0x27 0) set-bit 26
1087         invalid offset table-row (0x27 0) set-bit 27
1088         invalid offset table-row (0x27 0) set-bit 28
1089         invalid offset table-row (0x27 0) set-bit 29
1090         invalid offset table-row (0x27 0) set-bit 30
1091         invalid offset table-row (0x27 0) set-bit 31
1092
1093         #type 0 is toplevel
1094         #type 1 is nested
1095         #if Implementation points to file table visibility must be public (4)
1096         #invalid offset table-row (0x27 0) set-uint 0x100005 #LAMEIMPL/SPEC this check is not really relevant
1097
1098         #if Implementation points to exported type table visibility must be nested public (5)
1099         #invalid offset table-row (0x27 1) set-uint 0x100005 #LAMEIMPL/SPEC this check is not really relevant
1100         
1101         #typename is a valid non-empty string (7)
1102         invalid offset table-row (0x27 0) + 8 set-ushort 0
1103         invalid offset table-row (0x27 0) + 8 set-ushort 0x9900
1104         
1105         #typenamedpace is a valid string (8,9)
1106         invalid offset table-row (0x27 0) + 10 set-ushort 0x9900
1107
1108         #nested types must have an empty typenamespace (11)
1109         valid offset table-row (0x27 1) + 10 set-ushort 0
1110         invalid offset table-row (0x27 1) + 10 set-ushort 1 #LAMEIMPL ms doesn't check this.
1111
1112         #12 implementation is a valid non empty token (12)
1113         invalid offset table-row (0x27 0) + 12 set-ushort 0
1114         invalid offset table-row (0x27 0) + 12 set-ushort 0x8880
1115
1116         #TODO check if a type in the exported table is not defined in the current module (2)
1117         #TODO check if target type is valid and public (6)
1118         #TODO check for dups (14,15,16)
1119 }
1120
1121 manifest-resource-table {
1122         assembly assembly-with-resource.exe
1123
1124         #flags must have a valid value (3)
1125         #only bits 0-2 are used
1126         invalid offset table-row (0x28 0) + 4 set-bit 3
1127         invalid offset table-row (0x28 0) + 4 set-bit 7
1128         invalid offset table-row (0x28 0) + 4 set-bit 16
1129         invalid offset table-row (0x28 0) + 4 set-bit 31
1130
1131         #inly 0x1 and 0x2 are valid visibility values (4)
1132         invalid offset table-row (0x28 0) + 4 set-uint 0
1133         invalid offset table-row (0x28 0) + 4 set-uint 3
1134         invalid offset table-row (0x28 0) + 4 set-uint 4
1135         invalid offset table-row (0x28 0) + 4 set-uint 5
1136         invalid offset table-row (0x28 0) + 4 set-uint 6
1137         invalid offset table-row (0x28 0) + 4 set-uint 7
1138
1139         #name shall index a valid non-empty (5)
1140         invalid offset table-row (0x28 0) + 8 set-ushort 0
1141         invalid offset table-row (0x28 0) + 8 set-ushort 0x9900
1142
1143         #if implementation is null the offset is a valid offset based on cli resource entry (7)
1144         valid offset table-row (0x28 0) + 10 set-ushort 0,
1145                         offset table-row (0x28 0) + 0  set-uint 1
1146
1147         #LAMEIMPL it doesn't check the resource offset! 
1148         invalid offset table-row (0x28 0) + 10 set-ushort 0,
1149                         offset table-row (0x28 0) + 0  set-uint 0x990000
1150         
1151
1152         #implementation is a valid token (8)
1153         #does it accept exported type? 
1154         invalid offset table-row (0x28 0) + 10 set-ushort 0x0006
1155
1156         #coded table 4 is invalid
1157         invalid offset table-row (0x28 0) + 10 set-ushort 0x0007
1158         #bad index
1159         invalid offset table-row (0x28 0) + 10 set-ushort 0x8800
1160         invalid offset table-row (0x28 0) + 10 set-ushort 0x8801
1161
1162         #if implementation point to a file it's index must be zero (10)
1163         #row 0 is a file resource
1164         invalid offset table-row (0x28 0) set-uint 1
1165         
1166         #TODO check for dups (9)
1167 }
1168
1169 nested-class-table {
1170         assembly assembly-with-complex-type.exe
1171
1172         #both nested and enclosing classes must index valid non-null rows in the typedef table (2,3)
1173         invalid offset table-row (0x29 0) set-ushort 0
1174         invalid offset table-row (0x29 0) set-ushort 0x9800
1175
1176         invalid offset table-row (0x29 0) + 2 set-ushort 0
1177         invalid offset table-row (0x29 0) + 2 set-ushort 0x9800
1178
1179         invalid offset table-row (0x29 0) + 2 set-ushort read.ushort (table-row (0x29 0))
1180
1181         #TODO check for dups based on nestedclass (5) 
1182 }
1183
1184
1185 generic-param-table {
1186         assembly assembly-with-generics.exe
1187
1188         #bad flags
1189         #only 0-4 are used
1190         invalid offset table-row (0x2A 0) + 2 set-bit 5
1191         invalid offset table-row (0x2A 0) + 2 set-bit 6
1192         invalid offset table-row (0x2A 0) + 2 set-bit 7
1193         invalid offset table-row (0x2A 0) + 2 set-bit 8
1194         invalid offset table-row (0x2A 0) + 2 set-bit 9
1195         invalid offset table-row (0x2A 0) + 2 set-bit 10
1196         invalid offset table-row (0x2A 0) + 2 set-bit 11
1197         invalid offset table-row (0x2A 0) + 2 set-bit 12
1198         invalid offset table-row (0x2A 0) + 2 set-bit 13
1199         invalid offset table-row (0x2A 0) + 2 set-bit 14
1200         invalid offset table-row (0x2A 0) + 2 set-bit 15
1201
1202         #variance 0x3 is invalid
1203         invalid offset table-row (0x2A 0) + 2 set-ushort 0x3
1204
1205         #bad or null owner
1206         invalid offset table-row (0x2A 0) + 4 set-ushort 0
1207         invalid offset table-row (0x2A 0) + 4 set-ushort 0x8800
1208         invalid offset table-row (0x2A 0) + 4 set-ushort 0x8801
1209
1210         #bad or empty name      
1211         invalid offset table-row (0x2A 0) + 6 set-ushort 0
1212         invalid offset table-row (0x2A 0) + 6 set-ushort 0x8800
1213
1214         #wrong order
1215         invalid offset table-row (0x2A 0)  set-ushort 1,
1216                         offset table-row (0x2A 1)  set-ushort 0
1217
1218         #not monotonically growing
1219         invalid offset table-row (0x2A 0)  set-ushort 0,
1220                         offset table-row (0x2A 1)  set-ushort 0
1221
1222         #start big
1223         invalid offset table-row (0x2A 0)  set-ushort 1,
1224                         offset table-row (0x2A 1)  set-ushort 2
1225
1226         #step bigger than 1
1227         invalid offset table-row (0x2A 0)  set-ushort 0,
1228                         offset table-row (0x2A 1)  set-ushort 2
1229 }
1230
1231 method-spec-table {
1232         assembly assembly-with-generics.exe
1233
1234         #method is a valid token
1235         invalid offset table-row (0x2B 0) set-ushort 0
1236         invalid offset table-row (0x2B 0) set-ushort 0x8800
1237         invalid offset table-row (0x2B 0) set-ushort 0x8801
1238
1239         #instantiation is invalid
1240
1241         invalid offset table-row (0x2B 0) + 2 set-ushort 0
1242         invalid offset table-row (0x2B 0) + 2 set-ushort 0xABCD
1243
1244         #TODO check the content of the blob sig and validate against the token.
1245 }
1246
1247 generic-param-constraint-table {
1248         assembly assembly-with-generics.exe
1249
1250         #owner is a valid rown in the gparam table
1251         invalid offset table-row (0x2C 0) set-ushort 0x0000
1252         invalid offset table-row (0x2C 0) set-ushort 0x2345
1253
1254         #constaint is a valid token
1255         invalid offset table-row (0x2C 0) + 2 set-ushort 0x0000
1256         invalid offset table-row (0x2C 0) + 2 set-ushort 0x0007
1257         invalid offset table-row (0x2C 0) + 2 set-ushort 0x8800
1258         invalid offset table-row (0x2C 0) + 2 set-ushort 0x8801
1259         invalid offset table-row (0x2C 0) + 2 set-ushort 0x8802
1260
1261         #TODO check for dups and sorting.
1262 }