@@ -61,7 +61,6 @@ module ProductFlow {
61
61
}
62
62
}
63
63
64
-
65
64
private predicate reachableInterprocEntry (
66
65
Configuration conf , DataFlow:: PathNode source1 , DataFlow2:: PathNode source2 ,
67
66
DataFlow:: PathNode node1 , DataFlow2:: PathNode node2
@@ -83,31 +82,49 @@ module ProductFlow {
83
82
84
83
private predicate localPathStep1 ( DataFlow:: PathNode pred , DataFlow:: PathNode succ ) {
85
84
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 ( ) )
87
87
}
88
88
89
89
private predicate localPathStep2 ( DataFlow2:: PathNode pred , DataFlow2:: PathNode succ ) {
90
90
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
92
113
}
93
114
94
115
private predicate interprocEdgePair (
95
116
DataFlow:: PathNode pred1 , DataFlow2:: PathNode pred2 , DataFlow:: PathNode succ1 ,
96
117
DataFlow2:: PathNode succ2
97
118
) {
98
119
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 )
106
122
)
107
123
}
108
124
109
125
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
111
128
) {
112
129
exists ( DataFlow:: PathNode mid1 , DataFlow2:: PathNode mid2 |
113
130
reachableInterprocEntry ( conf , source1 , source2 , mid1 , mid2 ) and
0 commit comments