1+ using System ;
2+
3+ public class LambdaFlow
4+ {
5+ /// <summary>
6+ /// Flow into a normal method
7+ /// </summary>
8+ class Ex1
9+ {
10+ void M1 ( string s )
11+ {
12+ Sink ( s ) ; // $ hasValueFlow=1
13+ }
14+
15+ public void M2 ( )
16+ {
17+ var source = Source ( 1 ) ;
18+ M1 ( source ) ;
19+ }
20+ }
21+
22+
23+
24+
25+
26+
27+
28+ /// <summary>
29+ /// Flow into a lambda
30+ /// </summary>
31+ class Ex2
32+ {
33+ void M1 ( Action < string > lambda )
34+ {
35+ var source = Source ( 2 ) ;
36+ lambda ( source ) ;
37+ }
38+
39+ void M2 ( )
40+ {
41+ Action < string > lambda = x => Sink ( x ) ; // $ hasValueFlow=2
42+ M1 ( lambda ) ;
43+ }
44+ }
45+
46+
47+
48+
49+
50+
51+
52+ /// <summary>
53+ /// Flow out of a lambda
54+ /// </summary>
55+ class Ex3
56+ {
57+ Func < string > M1 ( )
58+ {
59+ return ( ) => Source ( 3 ) ;
60+ }
61+
62+ void M2 ( )
63+ {
64+ var lambda = M1 ( ) ;
65+ Sink ( lambda ( ) ) ; // $ hasValueFlow=3
66+ }
67+ }
68+
69+
70+
71+
72+
73+
74+
75+ /// <summary>
76+ /// Flow through a lambda
77+ /// </summary>
78+ class Ex4
79+ {
80+ string M1 ( Func < string , string > lambda , string input )
81+ {
82+ return lambda ( input ) ;
83+ }
84+
85+ void M2 ( )
86+ {
87+ Func < string , string > id = x => x ;
88+ var source = Source ( 4 ) ;
89+ var output = M1 ( id , source ) ;
90+ Sink ( output ) ; // $ hasValueFlow=4
91+ }
92+ }
93+
94+
95+
96+
97+
98+
99+
100+ /// <summary>
101+ /// No flow into lambda (call context sensitivity)
102+ /// </summary>
103+ class Ex5
104+ {
105+ void M1 ( Action < string > lambda , string input )
106+ {
107+ lambda ( input ) ;
108+ }
109+
110+ void M2 ( Action < string > lambda , string input )
111+ {
112+ M1 ( lambda , input ) ;
113+ }
114+
115+ void M3 ( )
116+ {
117+ Action < string > lambda1 = arg => Sink ( arg ) ;
118+ Action < string > lambda2 = arg => { } ;
119+
120+ var source = Source ( 5 ) ;
121+ var nonSource = "non-source" ;
122+
123+ M1 ( lambda1 , nonSource ) ;
124+ M1 ( lambda2 , source ) ;
125+
126+ M2 ( lambda1 , nonSource ) ;
127+ M2 ( lambda2 , source ) ;
128+ }
129+ }
130+
131+
132+
133+
134+
135+
136+
137+ /// <summary>
138+ /// Flow into a returned lambda
139+ /// </summary>
140+ class Ex6
141+ {
142+ Action < string > M1 ( )
143+ {
144+ return x => Sink ( x ) ; // $ hasValueFlow=6
145+ }
146+
147+ void M2 ( )
148+ {
149+ var source = Source ( 6 ) ;
150+ var lambda = M1 ( ) ;
151+ lambda ( source ) ;
152+ }
153+ }
154+
155+
156+
157+
158+
159+
160+
161+ /// <summary>
162+ /// No flow through lambda
163+ /// </summary>
164+ class Ex7
165+ {
166+ void M1 ( Func < string , string > lambda )
167+ {
168+ var source = Source ( 7 ) ;
169+ lambda ( source ) ;
170+ }
171+
172+ void M2 ( Func < string , string > lambda )
173+ {
174+ var nonSource = "non-source" ;
175+ var output = lambda ( nonSource ) ;
176+ Sink ( output ) ;
177+ }
178+
179+ void M3 ( )
180+ {
181+ Func < string , string > id = x => x ;
182+ M1 ( id ) ;
183+ M2 ( id ) ;
184+ }
185+ }
186+
187+ static string Source ( int source ) => source . ToString ( ) ;
188+
189+ static void Sink ( string value ) { }
190+ }
0 commit comments