Skip to content

Commit e0a5d18

Browse files
committed
C++: Respond to Schack feedback.
1 parent 5ce47d9 commit e0a5d18

File tree

1 file changed

+28
-11
lines changed

1 file changed

+28
-11
lines changed

cpp/ql/lib/experimental/semmle/code/cpp/dataflow/ProductFlow.qll

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)