@@ -61,7 +61,6 @@ module ProductFlow {
6161 }
6262 }
6363
64-
6564 private predicate reachableInterprocEntry (
6665 Configuration conf , DataFlow:: PathNode source1 , DataFlow2:: PathNode source2 ,
6766 DataFlow:: PathNode node1 , DataFlow2:: PathNode node2
@@ -83,31 +82,49 @@ module ProductFlow {
8382
8483 private predicate localPathStep1 ( DataFlow:: PathNode pred , DataFlow:: PathNode succ ) {
8584 DataFlow:: PathGraph:: edges ( pred , succ ) and
86- pred .getNode ( ) .getEnclosingCallable ( ) = succ .getNode ( ) .getEnclosingCallable ( )
85+ pragma [ only_bind_out ] ( pred .getNode ( ) .getEnclosingCallable ( ) ) =
86+ pragma [ only_bind_out ] ( succ .getNode ( ) .getEnclosingCallable ( ) )
8787 }
8888
8989 private predicate localPathStep2 ( DataFlow2:: PathNode pred , DataFlow2:: PathNode succ ) {
9090 DataFlow2:: PathGraph:: edges ( pred , succ ) and
91- pred .getNode ( ) .getEnclosingCallable ( ) = succ .getNode ( ) .getEnclosingCallable ( )
91+ pragma [ only_bind_out ] ( pred .getNode ( ) .getEnclosingCallable ( ) ) =
92+ pragma [ only_bind_out ] ( succ .getNode ( ) .getEnclosingCallable ( ) )
93+ }
94+
95+ pragma [ nomagic]
96+ private predicate interprocEdge1 (
97+ Declaration predDecl , Declaration succDecl , DataFlow:: PathNode pred1 , DataFlow:: PathNode succ1
98+ ) {
99+ DataFlow:: PathGraph:: edges ( pred1 , succ1 ) and
100+ predDecl != succDecl and
101+ pred1 .getNode ( ) .getEnclosingCallable ( ) = predDecl and
102+ succ1 .getNode ( ) .getEnclosingCallable ( ) = succDecl
103+ }
104+
105+ pragma [ nomagic]
106+ private predicate interprocEdge2 (
107+ Declaration predDecl , Declaration succDecl , DataFlow2:: PathNode pred2 , DataFlow2:: PathNode succ2
108+ ) {
109+ DataFlow2:: PathGraph:: edges ( pred2 , succ2 ) and
110+ predDecl != succDecl and
111+ pred2 .getNode ( ) .getEnclosingCallable ( ) = predDecl and
112+ succ2 .getNode ( ) .getEnclosingCallable ( ) = succDecl
92113 }
93114
94115 private predicate interprocEdgePair (
95116 DataFlow:: PathNode pred1 , DataFlow2:: PathNode pred2 , DataFlow:: PathNode succ1 ,
96117 DataFlow2:: PathNode succ2
97118 ) {
98119 exists ( Declaration predDecl , Declaration succDecl |
99- DataFlow:: PathGraph:: edges ( pred1 , succ1 ) and
100- DataFlow2:: PathGraph:: edges ( pred2 , succ2 ) and
101- predDecl != succDecl and
102- pred1 .getNode ( ) .getEnclosingCallable ( ) = predDecl and
103- pred2 .getNode ( ) .getEnclosingCallable ( ) = predDecl and
104- succ1 .getNode ( ) .getEnclosingCallable ( ) = succDecl and
105- succ2 .getNode ( ) .getEnclosingCallable ( ) = succDecl
120+ interprocEdge1 ( predDecl , succDecl , pred1 , succ1 ) and
121+ interprocEdge2 ( predDecl , succDecl , pred2 , succ2 )
106122 )
107123 }
108124
109125 private predicate reachable (
110- Configuration conf , DataFlow:: PathNode source1 , DataFlow2:: PathNode source2 , DataFlow:: PathNode sink1 , DataFlow2:: PathNode sink2
126+ Configuration conf , DataFlow:: PathNode source1 , DataFlow2:: PathNode source2 ,
127+ DataFlow:: PathNode sink1 , DataFlow2:: PathNode sink2
111128 ) {
112129 exists ( DataFlow:: PathNode mid1 , DataFlow2:: PathNode mid2 |
113130 reachableInterprocEntry ( conf , source1 , source2 , mid1 , mid2 ) and
0 commit comments