@@ -133,6 +133,18 @@ module ProductFlow {
133133 this .isAdditionalFlowStep2 ( node1 , node2 )
134134 }
135135
136+ /**
137+ * Holds if data flow into `node` is prohibited in the first projection of the product
138+ * dataflow graph.
139+ */
140+ predicate isBarrierIn1 ( DataFlow:: Node node ) { none ( ) }
141+
142+ /**
143+ * Holds if data flow into `node` is prohibited in the second projection of the product
144+ * dataflow graph.
145+ */
146+ predicate isBarrierIn2 ( DataFlow:: Node node ) { none ( ) }
147+
136148 predicate hasFlowPath (
137149 DataFlow:: PathNode source1 , DataFlow2:: PathNode source2 , DataFlow:: PathNode sink1 ,
138150 DataFlow2:: PathNode sink2
@@ -169,6 +181,10 @@ module ProductFlow {
169181 ) {
170182 exists ( Configuration conf | conf .isAdditionalFlowStep1 ( node1 , state1 , node2 , state2 ) )
171183 }
184+
185+ override predicate isBarrierIn ( DataFlow:: Node node ) {
186+ exists ( Configuration conf | conf .isBarrierIn1 ( node ) )
187+ }
172188 }
173189
174190 class Conf2 extends DataFlow2:: Configuration {
@@ -202,9 +218,14 @@ module ProductFlow {
202218 ) {
203219 exists ( Configuration conf | conf .isAdditionalFlowStep2 ( node1 , state1 , node2 , state2 ) )
204220 }
221+
222+ override predicate isBarrierIn ( DataFlow:: Node node ) {
223+ exists ( Configuration conf | conf .isBarrierIn2 ( node ) )
224+ }
205225 }
206226 }
207227
228+ pragma [ nomagic]
208229 private predicate reachableInterprocEntry (
209230 Configuration conf , DataFlow:: PathNode source1 , DataFlow2:: PathNode source2 ,
210231 DataFlow:: PathNode node1 , DataFlow2:: PathNode node2
0 commit comments