forked from github/codeql
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathD.cs
More file actions
153 lines (125 loc) · 3.5 KB
/
D.cs
File metadata and controls
153 lines (125 loc) · 3.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
public class D
{
object AutoProp { get; set; }
object trivialPropField;
object TrivialProp
{
get { return this.trivialPropField; }
set { this.trivialPropField = value; }
}
object ComplexProp
{
get { return this.trivialPropField; }
set { this.TrivialProp = value; }
}
static D Create(object o1, object o2, object o3)
{
var ret = new D();
ret.AutoProp = o1;
ret.TrivialProp = o2;
ret.ComplexProp = o3;
return ret;
}
private void M()
{
var o = Source<object>(1);
var d = Create(o, null, null);
Sink(d.AutoProp); // $ hasValueFlow=1
Sink(d.TrivialProp); // no flow
Sink(d.trivialPropField); // no flow
Sink(d.ComplexProp); // no flow
d = Create(null, Source<object>(2), null);
Sink(d.AutoProp); // no flow
Sink(d.TrivialProp); // $ hasValueFlow=2
Sink(d.trivialPropField); // $ hasValueFlow=2
Sink(d.ComplexProp); // $ hasValueFlow=2
d = Create(null, null, Source<object>(3));
Sink(d.AutoProp); // no flow
Sink(d.TrivialProp); // $ hasValueFlow=3
Sink(d.trivialPropField); // $ hasValueFlow=3
Sink(d.ComplexProp); // $ hasValueFlow=3
}
public static void Sink(object o) { }
static T Source<T>(object source) => throw null;
}
public partial class DPartial
{
private object _backingField;
public partial object PartialProp1
{
get { return _backingField; }
set { _backingField = value; }
}
public partial object PartialProp2
{
get { return null; }
set { }
}
}
public partial class DPartial
{
public partial object PartialProp1 { get; set; }
public partial object PartialProp2 { get; set; }
public void M()
{
var o = Source<object>(1);
var d = new DPartial();
d.PartialProp1 = o;
d.PartialProp2 = o;
Sink(d.PartialProp1); // $ hasValueFlow=1
Sink(d.PartialProp2); // no flow
}
public static void Sink(object o) { }
static T Source<T>(object source) => throw null;
}
public class DFieldProps
{
object FieldProp0
{
get { return field; }
set { field = value; }
} = Source<object>(0);
object FieldProp1
{
get { return field; }
set { field = value; }
}
object FieldProp2
{
get { return field; }
set
{
var x = value;
field = x;
}
}
static object StaticFieldProp
{
get { return field; }
set { field = value; }
}
private void M()
{
var d0 = new DFieldProps();
Sink(d0.FieldProp0); // $ hasValueFlow=0
Sink(d0.FieldProp1); // no flow
Sink(d0.FieldProp2); // no flow
var d1 = new DFieldProps();
var o1 = Source<object>(1);
d1.FieldProp1 = o1;
Sink(d1.FieldProp0); // $ hasValueFlow=0
Sink(d1.FieldProp1); // $ hasValueFlow=1
Sink(d1.FieldProp2); // no flow
var d2 = new DFieldProps();
var o2 = Source<object>(2);
d2.FieldProp2 = o2;
Sink(d2.FieldProp0); // $ hasValueFlow=0
Sink(d2.FieldProp1); // no flow
Sink(d2.FieldProp2); // $ hasValueFlow=2
var o3 = Source<object>(3);
DFieldProps.StaticFieldProp = o3;
Sink(DFieldProps.StaticFieldProp); // $ hasValueFlow=3
}
public static void Sink(object o) { }
static T Source<T>(object source) => throw null;
}