diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll index ba5e562a71e..89efaa8e15a 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll @@ -295,14 +295,16 @@ module IRCfg implements BB::CfgSig { predicate postDominates(BasicBlock bb) { super.postDominates(bb) } } + class EntryBasicBlock extends BasicBlock { + EntryBasicBlock() { isEntryBlock(this) } + } + pragma[nomagic] predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { bb1.getASuccessor() = bb2 and bb1 = bb2.getImmediateDominator() and forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred)) } - - predicate entryBlock(BasicBlock bb) { isEntryBlock(bb) } } cached diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll index ba5e562a71e..89efaa8e15a 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll @@ -295,14 +295,16 @@ module IRCfg implements BB::CfgSig { predicate postDominates(BasicBlock bb) { super.postDominates(bb) } } + class EntryBasicBlock extends BasicBlock { + EntryBasicBlock() { isEntryBlock(this) } + } + pragma[nomagic] predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { bb1.getASuccessor() = bb2 and bb1 = bb2.getImmediateDominator() and forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred)) } - - predicate entryBlock(BasicBlock bb) { isEntryBlock(bb) } } cached diff --git a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll index ba5e562a71e..89efaa8e15a 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll @@ -295,14 +295,16 @@ module IRCfg implements BB::CfgSig { predicate postDominates(BasicBlock bb) { super.postDominates(bb) } } + class EntryBasicBlock extends BasicBlock { + EntryBasicBlock() { isEntryBlock(this) } + } + pragma[nomagic] predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { bb1.getASuccessor() = bb2 and bb1 = bb2.getImmediateDominator() and forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred)) } - - predicate entryBlock(BasicBlock bb) { isEntryBlock(bb) } } cached diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll index 8271b0ac484..c3bf2545230 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll @@ -341,6 +341,8 @@ final class ConditionBlock extends BasicBlock, BasicBlocksImpl::ConditionBasicBl private class BasicBlockAlias = BasicBlock; +private class EntryBasicBlockAlias = EntryBasicBlock; + module Cfg implements BB::CfgSig { class ControlFlowNode = ControlFlow::Node; @@ -348,9 +350,9 @@ module Cfg implements BB::CfgSig { class BasicBlock = BasicBlockAlias; + class EntryBasicBlock = EntryBasicBlockAlias; + predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { BasicBlocksImpl::dominatingEdge(bb1, bb2) } - - predicate entryBlock(BasicBlock bb) { bb instanceof EntryBasicBlock } } diff --git a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll index 774aa9958c8..b3cdf3335e6 100644 --- a/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll +++ b/csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll @@ -167,9 +167,11 @@ module PreCfg implements BB::CfgSig { class BasicBlock = PreBasicBlock; + class EntryBasicBlock extends BasicBlock { + EntryBasicBlock() { entryBB(this) } + } + predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { conditionBlockImmediatelyControls(bb1, bb2, _) } - - predicate entryBlock(BasicBlock bb) { entryBB(bb) } } diff --git a/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll b/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll index 9054debb04e..1657a81816f 100644 --- a/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll +++ b/java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll @@ -165,7 +165,7 @@ module Cfg implements BB::CfgSig { class BasicBlock = BasicBlockAlias; - predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { BbImpl::dominatingEdge(bb1, bb2) } + class EntryBasicBlock extends BasicBlock instanceof BbImpl::EntryBasicBlock { } - predicate entryBlock(BasicBlock bb) { BbImpl::entryBlock(bb) } + predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { BbImpl::dominatingEdge(bb1, bb2) } } diff --git a/javascript/ql/lib/semmle/javascript/internal/BasicBlockInternal.qll b/javascript/ql/lib/semmle/javascript/internal/BasicBlockInternal.qll index 7b9c0b4f841..6742429b15e 100644 --- a/javascript/ql/lib/semmle/javascript/internal/BasicBlockInternal.qll +++ b/javascript/ql/lib/semmle/javascript/internal/BasicBlockInternal.qll @@ -402,13 +402,15 @@ module Public { predicate postDominates(BasicBlock bb) { this.(ReachableBasicBlock).postDominates(bb) } } + class EntryBasicBlock extends BasicBlock { + EntryBasicBlock() { entryBB(this) } + } + pragma[nomagic] predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { bb1.getASuccessor() = bb2 and bb1 = bb2.getImmediateDominator() and forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred)) } - - predicate entryBlock(BasicBlock bb) { entryBB(bb) } } } diff --git a/python/ql/lib/semmle/python/Flow.qll b/python/ql/lib/semmle/python/Flow.qll index 572bbebf1e1..c91a492e269 100644 --- a/python/ql/lib/semmle/python/Flow.qll +++ b/python/ql/lib/semmle/python/Flow.qll @@ -1295,12 +1295,14 @@ module Cfg implements BB::CfgSig { } } + class EntryBasicBlock extends BasicBlock { + EntryBasicBlock() { this.getNode(0).isEntryNode() } + } + pragma[nomagic] predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { bb1.getASuccessor() = bb2 and bb1 = bb2.getImmediateDominator() and forall(BasicBlock pred | pred = bb2.getAPredecessor() and pred != bb1 | bb2.dominates(pred)) } - - predicate entryBlock(BasicBlock bb) { bb.getNode(0).isEntryNode() } } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll b/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll index c6d4b86b882..bd13fca2875 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll @@ -300,6 +300,8 @@ final class ConditionBlock extends BasicBlock, BasicBlocksImpl::ConditionBasicBl private class BasicBlockAlias = BasicBlock; +private class EntryBasicBlockAlias = EntryBasicBlock; + private class SuccessorTypeAlias = SuccessorType; module Cfg implements BB::CfgSig { @@ -309,9 +311,9 @@ module Cfg implements BB::CfgSig { class BasicBlock = BasicBlockAlias; + class EntryBasicBlock = EntryBasicBlockAlias; + predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { BasicBlocksImpl::dominatingEdge(bb1, bb2) } - - predicate entryBlock(BasicBlock bb) { bb instanceof EntryBasicBlock } } diff --git a/rust/ql/lib/codeql/rust/controlflow/BasicBlocks.qll b/rust/ql/lib/codeql/rust/controlflow/BasicBlocks.qll index 03eac5e31be..daa2cb1e818 100644 --- a/rust/ql/lib/codeql/rust/controlflow/BasicBlocks.qll +++ b/rust/ql/lib/codeql/rust/controlflow/BasicBlocks.qll @@ -25,7 +25,7 @@ module Cfg implements BB::CfgSig { class BasicBlock = BasicBlocksImpl::BasicBlock; - predicate dominatingEdge = BasicBlocksImpl::dominatingEdge/2; + class EntryBasicBlock = BasicBlocksImpl::EntryBasicBlock; - predicate entryBlock(BasicBlock bb) { bb instanceof EntryBasicBlock } + predicate dominatingEdge = BasicBlocksImpl::dominatingEdge/2; } diff --git a/shared/controlflow/codeql/controlflow/BasicBlock.qll b/shared/controlflow/codeql/controlflow/BasicBlock.qll index 683182786be..7aa541b4630 100644 --- a/shared/controlflow/codeql/controlflow/BasicBlock.qll +++ b/shared/controlflow/codeql/controlflow/BasicBlock.qll @@ -150,6 +150,12 @@ signature module CfgSig { predicate postDominates(BasicBlock bb); } + /** + * An entry basic block, that is, a basic block whose first node is + * an entry node. + */ + class EntryBasicBlock extends BasicBlock; + /** * Holds if `bb1` has `bb2` as a direct successor and the edge between `bb1` * and `bb2` is a dominating edge. @@ -164,9 +170,6 @@ signature module CfgSig { * means that the edge `(bb1, bb2)` dominates `bb3`. */ predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2); - - /** Holds if `bb` is an entry basic block. */ - predicate entryBlock(BasicBlock bb); } /** @@ -365,6 +368,10 @@ module Make Input> implements CfgSig Input> implements CfgSig Input> implements CfgSig { class BasicBlock = BasicBlockAlias; + class EntryBasicBlock = EntryBasicBlockAlias; + predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { BasicBlocksImpl::dominatingEdge(bb1, bb2) } - - predicate entryBlock(BasicBlock bb) { bb instanceof EntryBasicBlock } }