diff --git a/java/ql/lib/semmle/code/java/semantic/SemanticCFG.qll b/java/ql/lib/semmle/code/java/semantic/SemanticCFG.qll index d12d24cc00e..2d116ece446 100644 --- a/java/ql/lib/semmle/code/java/semantic/SemanticCFG.qll +++ b/java/ql/lib/semmle/code/java/semantic/SemanticCFG.qll @@ -4,30 +4,12 @@ private import java private import SemanticExpr -private import SemanticExprSpecific +private import SemanticCFGSpecific::SemanticCFGConfig as Specific -private newtype TSemBasicBlock = MkSemBasicBlock(BasicBlock block) +class SemBasicBlock extends Specific::BasicBlock { + final predicate bbDominates(SemBasicBlock otherBlock) { Specific::bbDominates(this, otherBlock) } -class SemBasicBlock extends TSemBasicBlock { - BasicBlock block; + final predicate hasDominanceInformation() { Specific::hasDominanceInformation(this) } - SemBasicBlock() { this = MkSemBasicBlock(block) } - - final string toString() { result = block.toString() } - - final Location getLocation() { result = block.getLocation() } - - final predicate bbDominates(SemBasicBlock otherBlock) { - block.bbDominates(getJavaBasicBlock(otherBlock)) - } - - final SemExpr getAnExpr() { SemanticExprConfig::getExprBasicBlock(result) = this } -} - -SemBasicBlock getSemanticBasicBlock(BasicBlock block) { result = MkSemBasicBlock(block) } - -BasicBlock getJavaBasicBlock(SemBasicBlock block) { block = getSemanticBasicBlock(result) } - -predicate semHasDominanceInformation(SemBasicBlock bb) { - hasDominanceInformation(getJavaBasicBlock(bb)) + final SemExpr getAnExpr() { result.getBasicBlock() = this } } diff --git a/java/ql/lib/semmle/code/java/semantic/SemanticCFGSpecific.qll b/java/ql/lib/semmle/code/java/semantic/SemanticCFGSpecific.qll new file mode 100644 index 00000000000..4cd499ee8c0 --- /dev/null +++ b/java/ql/lib/semmle/code/java/semantic/SemanticCFGSpecific.qll @@ -0,0 +1,20 @@ +private import java as J +private import SemanticCFG + +module SemanticCFGConfig { + class BasicBlock instanceof J::BasicBlock { + final string toString() { result = this.(J::BasicBlock).toString() } + + final J::Location getLocation() { result = this.(J::BasicBlock).getLocation() } + } + + predicate bbDominates(BasicBlock dominator, BasicBlock dominated) { + dominator.(J::BasicBlock).bbDominates(dominated.(J::BasicBlock)) + } + + predicate hasDominanceInformation(BasicBlock block) { J::hasDominanceInformation(block) } +} + +SemBasicBlock getSemanticBasicBlock(J::BasicBlock block) { result = block } + +J::BasicBlock getJavaBasicBlock(SemBasicBlock block) { block = getSemanticBasicBlock(result) } diff --git a/java/ql/lib/semmle/code/java/semantic/SemanticExprSpecific.qll b/java/ql/lib/semmle/code/java/semantic/SemanticExprSpecific.qll index 586607b6d66..ef0dabc6bb5 100644 --- a/java/ql/lib/semmle/code/java/semantic/SemanticExprSpecific.qll +++ b/java/ql/lib/semmle/code/java/semantic/SemanticExprSpecific.qll @@ -1,6 +1,7 @@ private import java as J private import SemanticCFG private import SemanticExpr +private import SemanticCFGSpecific private import SemanticSSA private import SemanticType private import semmle.code.java.dataflow.SSA as SSA diff --git a/java/ql/lib/semmle/code/java/semantic/SemanticGuard.qll b/java/ql/lib/semmle/code/java/semantic/SemanticGuard.qll index b0646007c80..ceea61977ff 100644 --- a/java/ql/lib/semmle/code/java/semantic/SemanticGuard.qll +++ b/java/ql/lib/semmle/code/java/semantic/SemanticGuard.qll @@ -6,6 +6,7 @@ private import java private import semmle.code.java.controlflow.Guards private import semmle.code.java.controlflow.internal.GuardsLogic private import SemanticCFG +private import SemanticCFGSpecific private import SemanticExpr private import SemanticExprSpecific private import SemanticSSA diff --git a/java/ql/lib/semmle/code/java/semantic/SemanticSSA.qll b/java/ql/lib/semmle/code/java/semantic/SemanticSSA.qll index 27759706f35..f438a4dd601 100644 --- a/java/ql/lib/semmle/code/java/semantic/SemanticSSA.qll +++ b/java/ql/lib/semmle/code/java/semantic/SemanticSSA.qll @@ -9,6 +9,7 @@ private import SemanticExpr private import SemanticType private import semmle.code.java.dataflow.internal.rangeanalysis.SsaReadPositionCommon private import SemanticExprSpecific +private import SemanticCFGSpecific private newtype TSemSsaVariable = MkSemSsaVariable(SSA::SsaVariable var) @@ -118,6 +119,6 @@ predicate semBackEdge(SemSsaPhiNode phi, SemSsaVariable inp, SemSsaReadPositionP // Conservatively assume that every edge is a back edge if we don't have dominance information. ( phi.getBasicBlock().bbDominates(edge.getOrigBlock()) or - not semHasDominanceInformation(edge.getOrigBlock()) + not edge.getOrigBlock().hasDominanceInformation() ) } diff --git a/java/ql/test/library-tests/dataflow/sign-analysis/diff.ql b/java/ql/test/library-tests/dataflow/sign-analysis/diff.ql index 7017cf40dc3..7c6ede2e30d 100644 --- a/java/ql/test/library-tests/dataflow/sign-analysis/diff.ql +++ b/java/ql/test/library-tests/dataflow/sign-analysis/diff.ql @@ -2,6 +2,7 @@ import java import semmle.code.java.dataflow.SignAnalysis import semmle.code.java.semantic.analysis.SignAnalysisCommon import semmle.code.java.semantic.SemanticCFG +import semmle.code.java.semantic.SemanticCFGSpecific import semmle.code.java.semantic.SemanticExpr import semmle.code.java.semantic.SemanticExprSpecific import semmle.code.java.semantic.SemanticSSA