Skip to content

Commit df2b586

Browse files
authored
Merge pull request #10577 from hvitved/dataflow/get-a-read-content-fan-in
Data flow: Fix bad join-order when getAReadContent has large fan-in
2 parents 56e3334 + 335e1a8 commit df2b586

36 files changed

+144
-36
lines changed

cpp/ql/lib/experimental/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

cpp/ql/lib/experimental/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

cpp/ql/lib/experimental/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

cpp/ql/lib/experimental/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl2.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl3.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImpl4.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplLocal.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl2.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl3.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImpl4.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl2.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl3.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl4.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImpl5.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplForContentDataFlow.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl2.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImpl3.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -558,13 +558,16 @@ private predicate expectsContentEx(NodeEx n, Content c) {
558558
pragma[nomagic]
559559
private predicate notExpectsContent(NodeEx n) { not expectsContentCached(n.asNode(), _) }
560560

561+
pragma[nomagic]
562+
private predicate hasReadStep(Content c, Configuration config) { read(_, c, _, config) }
563+
561564
pragma[nomagic]
562565
private predicate store(
563566
NodeEx node1, TypedContent tc, NodeEx node2, DataFlowType contentType, Configuration config
564567
) {
565568
store(pragma[only_bind_into](node1.asNode()), tc, pragma[only_bind_into](node2.asNode()),
566569
contentType) and
567-
read(_, tc.getContent(), _, config) and
570+
hasReadStep(tc.getContent(), config) and
568571
stepFilter(node1, node2, config)
569572
}
570573

0 commit comments

Comments
 (0)