@@ -20,7 +20,8 @@ module ProductFlow {
20
20
* `source1` and `source2` must belong to the same callable.
21
21
*/
22
22
predicate isSourcePair (
23
- DataFlow:: Node source1 , string state1 , DataFlow:: Node source2 , string state2
23
+ DataFlow:: Node source1 , DataFlow:: FlowState state1 , DataFlow:: Node source2 ,
24
+ DataFlow:: FlowState state2
24
25
) {
25
26
state1 = "" and
26
27
state2 = "" and
@@ -89,6 +90,49 @@ module ProductFlow {
89
90
*/
90
91
predicate isBarrierOut2 ( DataFlow:: Node node ) { none ( ) }
91
92
93
+ /*
94
+ * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps in
95
+ * the first projection of the product dataflow graph.
96
+ */
97
+
98
+ predicate isAdditionalFlowStep1 ( DataFlow:: Node node1 , DataFlow:: Node node2 ) { none ( ) }
99
+
100
+ /**
101
+ * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps in
102
+ * the first projection of the product dataflow graph.
103
+ *
104
+ * This step is only applicable in `state1` and updates the flow state to `state2`.
105
+ */
106
+ predicate isAdditionalFlowStep1 (
107
+ DataFlow:: Node node1 , DataFlow:: FlowState state1 , DataFlow:: Node node2 ,
108
+ DataFlow:: FlowState state2
109
+ ) {
110
+ state1 instanceof DataFlow:: FlowStateEmpty and
111
+ state2 instanceof DataFlow:: FlowStateEmpty and
112
+ this .isAdditionalFlowStep1 ( node1 , node2 )
113
+ }
114
+
115
+ /**
116
+ * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps in
117
+ * the second projection of the product dataflow graph.
118
+ */
119
+ predicate isAdditionalFlowStep2 ( DataFlow:: Node node1 , DataFlow:: Node node2 ) { none ( ) }
120
+
121
+ /**
122
+ * Holds if data may flow from `node1` to `node2` in addition to the normal data-flow steps in
123
+ * the second projection of the product dataflow graph.
124
+ *
125
+ * This step is only applicable in `state1` and updates the flow state to `state2`.
126
+ */
127
+ predicate isAdditionalFlowStep2 (
128
+ DataFlow:: Node node1 , DataFlow:: FlowState state1 , DataFlow:: Node node2 ,
129
+ DataFlow:: FlowState state2
130
+ ) {
131
+ state1 instanceof DataFlow:: FlowStateEmpty and
132
+ state2 instanceof DataFlow:: FlowStateEmpty and
133
+ this .isAdditionalFlowStep2 ( node1 , node2 )
134
+ }
135
+
92
136
predicate hasFlowPath (
93
137
DataFlow:: PathNode source1 , DataFlow2:: PathNode source2 , DataFlow:: PathNode sink1 ,
94
138
DataFlow2:: PathNode sink2
@@ -103,54 +147,69 @@ module ProductFlow {
103
147
class Conf1 extends DataFlow:: Configuration {
104
148
Conf1 ( ) { this = "Conf1" }
105
149
106
- override predicate isSource ( DataFlow:: Node source , string state ) {
150
+ override predicate isSource ( DataFlow:: Node source , DataFlow :: FlowState state ) {
107
151
exists ( Configuration conf | conf .isSourcePair ( source , state , _, _) )
108
152
}
109
153
110
- override predicate isSink ( DataFlow:: Node sink , string state ) {
154
+ override predicate isSink ( DataFlow:: Node sink , DataFlow :: FlowState state ) {
111
155
exists ( Configuration conf | conf .isSinkPair ( sink , state , _, _) )
112
156
}
113
157
114
- override predicate isBarrier ( DataFlow:: Node node , string state ) {
158
+ override predicate isBarrier ( DataFlow:: Node node , DataFlow :: FlowState state ) {
115
159
exists ( Configuration conf | conf .isBarrier1 ( node , state ) )
116
160
}
117
161
118
162
override predicate isBarrierOut ( DataFlow:: Node node ) {
119
163
exists ( Configuration conf | conf .isBarrierOut1 ( node ) )
120
164
}
165
+
166
+ override predicate isAdditionalFlowStep (
167
+ DataFlow:: Node node1 , DataFlow:: FlowState state1 , DataFlow:: Node node2 ,
168
+ DataFlow:: FlowState state2
169
+ ) {
170
+ exists ( Configuration conf | conf .isAdditionalFlowStep1 ( node1 , state1 , node2 , state2 ) )
171
+ }
121
172
}
122
173
123
174
class Conf2 extends DataFlow2:: Configuration {
124
175
Conf2 ( ) { this = "Conf2" }
125
176
126
- override predicate isSource ( DataFlow:: Node source , string state ) {
127
- exists ( Configuration conf , DataFlow:: Node source1 |
128
- conf .isSourcePair ( source1 , _ , source , state ) and
129
- any ( Conf1 c ) .hasFlow ( source1 , _)
177
+ override predicate isSource ( DataFlow:: Node source , DataFlow :: FlowState state ) {
178
+ exists ( Configuration conf , DataFlow:: PathNode source1 |
179
+ conf .isSourcePair ( source1 . getNode ( ) , source1 . getState ( ) , source , state ) and
180
+ any ( Conf1 c ) .hasFlowPath ( source1 , _)
130
181
)
131
182
}
132
183
133
- override predicate isSink ( DataFlow:: Node sink , string state ) {
134
- exists ( Configuration conf , DataFlow:: Node sink1 |
135
- conf .isSinkPair ( sink1 , _, sink , state ) and any ( Conf1 c ) .hasFlow ( _, sink1 )
184
+ override predicate isSink ( DataFlow:: Node sink , DataFlow:: FlowState state ) {
185
+ exists ( Configuration conf , DataFlow:: PathNode sink1 |
186
+ conf .isSinkPair ( sink1 .getNode ( ) , sink1 .getState ( ) , sink , state ) and
187
+ any ( Conf1 c ) .hasFlowPath ( _, sink1 )
136
188
)
137
189
}
138
190
139
- override predicate isBarrier ( DataFlow:: Node node , string state ) {
191
+ override predicate isBarrier ( DataFlow:: Node node , DataFlow :: FlowState state ) {
140
192
exists ( Configuration conf | conf .isBarrier2 ( node , state ) )
141
193
}
142
194
143
195
override predicate isBarrierOut ( DataFlow:: Node node ) {
144
196
exists ( Configuration conf | conf .isBarrierOut2 ( node ) )
145
197
}
198
+
199
+ override predicate isAdditionalFlowStep (
200
+ DataFlow:: Node node1 , DataFlow:: FlowState state1 , DataFlow:: Node node2 ,
201
+ DataFlow:: FlowState state2
202
+ ) {
203
+ exists ( Configuration conf | conf .isAdditionalFlowStep2 ( node1 , state1 , node2 , state2 ) )
204
+ }
146
205
}
147
206
}
148
207
149
208
private predicate reachableInterprocEntry (
150
209
Configuration conf , DataFlow:: PathNode source1 , DataFlow2:: PathNode source2 ,
151
210
DataFlow:: PathNode node1 , DataFlow2:: PathNode node2
152
211
) {
153
- conf .isSourcePair ( node1 .getNode ( ) , _ , node2 .getNode ( ) , _ ) and
212
+ conf .isSourcePair ( node1 .getNode ( ) , node1 . getState ( ) , node2 .getNode ( ) , node2 . getState ( ) ) and
154
213
node1 = source1 and
155
214
node2 = source2
156
215
or
@@ -213,7 +272,7 @@ module ProductFlow {
213
272
) {
214
273
exists ( DataFlow:: PathNode mid1 , DataFlow2:: PathNode mid2 |
215
274
reachableInterprocEntry ( conf , source1 , source2 , mid1 , mid2 ) and
216
- conf .isSinkPair ( sink1 .getNode ( ) , _ , sink2 .getNode ( ) , _ ) and
275
+ conf .isSinkPair ( sink1 .getNode ( ) , sink1 . getState ( ) , sink2 .getNode ( ) , sink2 . getState ( ) ) and
217
276
localPathStep1 * ( mid1 , sink1 ) and
218
277
localPathStep2 * ( mid2 , sink2 )
219
278
)
0 commit comments