@@ -4,80 +4,90 @@ class Tuples
4
4
{
5
5
static void M1 ( )
6
6
{
7
- var x = ( a : "taint source" , ( 1 , "taint source" ) ) ;
7
+ var o1 = Source < object > ( 1 ) ;
8
+ var o2 = Source < object > ( 2 ) ;
9
+
10
+ var x = ( a : o1 , ( 1 , o2 ) ) ;
8
11
var ( a , ( b , c ) ) = x ;
9
- Sink ( a ) ; // Tainted
12
+ Sink ( a ) ; // $ hasValueFlow=1
10
13
Sink ( b ) ;
11
- Sink ( c ) ; // Tainted
14
+ Sink ( c ) ; // $ hasValueFlow=2
12
15
13
16
( a , ( b , c ) ) = x ;
14
- Sink ( a ) ; // Tainted
17
+ Sink ( a ) ; // $ hasValueFlow=1
15
18
Sink ( b ) ;
16
- Sink ( c ) ; // Tainted
19
+ Sink ( c ) ; // $ hasValueFlow=2
17
20
18
21
( var p , var q ) = x ;
19
- Sink ( p ) ; // Tainted
22
+ Sink ( p ) ; // $ hasValueFlow=1
20
23
Sink ( q . Item1 ) ;
21
- Sink ( q . Item2 ) ; // Tainted
24
+ Sink ( q . Item2 ) ; // $ hasValueFlow=2
22
25
23
- Sink ( x . Item1 ) ; // Tainted
24
- Sink ( x . a ) ; // Tainted
26
+ Sink ( x . Item1 ) ; // $ hasValueFlow=1
27
+ Sink ( x . a ) ; // $ hasValueFlow=1
25
28
Sink ( x . Item2 . Item1 ) ;
26
- Sink ( x . Item2 . Item2 ) ; // Tainted
29
+ Sink ( x . Item2 . Item2 ) ; // $ hasValueFlow=2
27
30
}
28
31
29
32
static void M2 ( )
30
33
{
31
- var x = ( "taint source" , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , "taint source" ) ;
32
- Sink ( x . Item1 ) ; // Tainted
34
+ var o1 = Source < object > ( 3 ) ;
35
+ var o2 = Source < object > ( 4 ) ;
36
+
37
+ var x = ( o1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , o2 ) ;
38
+ Sink ( x . Item1 ) ; // $ hasValueFlow=3
33
39
Sink ( x . Item2 ) ;
34
- Sink ( x . Item10 ) ; // Tainted
40
+ Sink ( x . Item10 ) ; // $ hasValueFlow=4
35
41
}
36
42
37
43
static void M3 ( )
38
44
{
39
- var x = ( ValueTuple < string , int , int > ) ( "taint source" , 2 , 3 ) ;
40
- Sink ( x . Item1 ) ; // Tainted
45
+ var o = Source < string > ( 5 ) ;
46
+ var x = ( ValueTuple < string , int , int > ) ( o , 2 , 3 ) ;
47
+ Sink ( x . Item1 ) ; // $ hasValueFlow=5
41
48
Sink ( x . Item2 ) ;
42
49
43
- var y = ( ValueTuple < object , int , int > ) ( "taint source" , 2 , 3 ) ;
44
- Sink ( y . Item1 ) ; // Tainted, not found
50
+ var y = ( ValueTuple < object , int , int > ) ( o , 2 , 3 ) ;
51
+ Sink ( y . Item1 ) ; // $ MISSING: hasValueFlow=5
45
52
Sink ( y . Item2 ) ;
46
53
}
47
54
48
55
static void M4 ( string s )
49
56
{
50
- var x = ( "taint source" , ( 2 , "taint source" ) , 3 ) ;
57
+ var o1 = Source < string > ( 6 ) ;
58
+ var o2 = Source < string > ( 7 ) ;
59
+ var x = ( o1 , ( 2 , o2 ) , 3 ) ;
51
60
switch ( x )
52
61
{
53
62
case ValueTuple < string , ( int , string ) , int > t when t . Item3 > 1 :
54
- Sink ( t . Item1 ) ; // Tainted
55
- Sink ( t . Item2 . Item2 ) ; // Tainted
63
+ Sink ( t . Item1 ) ; // $ hasValueFlow=6
64
+ Sink ( t . Item2 . Item2 ) ; // $ hasValueFlow=7
56
65
Sink ( t . Item2 . Item1 ) ;
57
66
break ;
58
67
case var ( a , ( b , c ) , _) :
59
- Sink ( a ) ; // Tainted
60
- Sink ( c ) ; // Tainted
68
+ Sink ( a ) ; // $ hasValueFlow=6
69
+ Sink ( c ) ; // $ hasValueFlow=7
61
70
Sink ( b ) ;
62
71
break ;
63
72
}
64
73
74
+ var o3 = Source < string > ( 8 ) ;
65
75
var y = ( s , ( 2 , s ) , 3 ) ;
66
76
switch ( y )
67
77
{
68
- case ( "taint source" , var ( b , c ) , _) :
69
- Sink ( y . Item1 ) ; // Tainted, not found
70
- Sink ( y . Item2 . Item2 ) ; // Tainted, not found
71
- Sink ( c ) ; // Tainted, not found
78
+ case ( var a , var ( b , c ) , _) when a == o3 :
79
+ Sink ( y . Item1 ) ; // $ MISSING: hasValueFlow=8
80
+ Sink ( y . Item2 . Item2 ) ; // $ MISSING: hasValueFlow=8
81
+ Sink ( c ) ; // $ MISSING: hasValueFlow=8
72
82
Sink ( y . Item2 . Item1 ) ;
73
83
Sink ( b ) ;
74
84
break ;
75
85
}
76
86
77
87
if ( x is var ( p , ( q , r ) , _ ) )
78
88
{
79
- Sink ( p ) ; // Tainted
80
- Sink ( r ) ; // Tainted
89
+ Sink ( p ) ; // $ hasValueFlow=6
90
+ Sink ( r ) ; // $ hasValueFlow=7
81
91
Sink ( q ) ;
82
92
}
83
93
}
@@ -86,23 +96,47 @@ record R1(string i, int j) { };
86
96
87
97
static void M5 ( )
88
98
{
89
- var r = new R1 ( "taint source" , 1 ) ;
90
- Sink ( r . i ) ; // Tainted
99
+ var o = Source < string > ( 9 ) ;
100
+ var r = new R1 ( o , 1 ) ;
101
+ Sink ( r . i ) ; // $ hasValueFlow=9
91
102
92
103
var ( a , b ) = r ;
93
- Sink ( a ) ; // Tainted, not found
104
+ Sink ( a ) ; // $ MISSING: hasValueFlow=9
94
105
Sink ( b ) ;
95
106
96
107
switch ( r )
97
108
{
98
109
case var ( x , y ) :
99
- Sink ( x ) ; // Tainted, not found
110
+ Sink ( x ) ; // $ MISSING: hasValueFlow=9
100
111
Sink ( y ) ;
101
112
break ;
102
113
}
103
114
}
104
115
105
- static void Sink < T > ( T x ) { }
116
+ static void M6 ( )
117
+ {
118
+ var o = Source < object > ( 9 ) ;
119
+
120
+ int y1 = 0 ;
121
+ ( object x1 , y1 ) = ( o , 1 ) ;
122
+ Sink ( x1 ) ; // $ hasValueFlow=9
123
+
124
+ var x2 = new object ( ) ;
125
+ ( x2 , int y2 ) = ( o , 1 ) ;
126
+ Sink ( x2 ) ; // $ hasValueFlow=9
127
+
128
+ var x3 = 0 ;
129
+ ( x3 , object y3 ) = ( 1 , o ) ;
130
+ Sink ( y3 ) ; // $ hasValueFlow=9
131
+
132
+ var y4 = new object ( ) ;
133
+ ( int x4 , y4 ) = ( 1 , o ) ;
134
+ Sink ( y4 ) ; // $ hasValueFlow=9
135
+ }
136
+
137
+ public static void Sink ( object o ) { }
138
+
139
+ static T Source < T > ( object source ) => throw null ;
106
140
}
107
141
108
142
namespace System . Runtime . CompilerServices
0 commit comments