mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
SSA: Remove empty predicates and dead code.
This commit is contained in:
@@ -956,8 +956,6 @@ class GlobalDef extends Definition {
|
||||
private module SsaImpl = SsaImplCommon::Make<Location, SsaInput>;
|
||||
|
||||
private module DataFlowIntegrationInput implements SsaImpl::DataFlowIntegrationInputSig {
|
||||
private import codeql.util.Void
|
||||
|
||||
class Expr extends Instruction {
|
||||
Expr() {
|
||||
exists(IRBlock bb, int i |
|
||||
@@ -979,14 +977,6 @@ private module DataFlowIntegrationInput implements SsaImpl::DataFlowIntegrationI
|
||||
|
||||
predicate ssaDefHasSource(SsaImpl::WriteDefinition def) { none() }
|
||||
|
||||
predicate ssaDefAssigns(SsaImpl::WriteDefinition def, Expr value) { none() }
|
||||
|
||||
class Parameter extends Void {
|
||||
Location getLocation() { none() }
|
||||
}
|
||||
|
||||
predicate ssaDefInitializesParam(SsaImpl::WriteDefinition def, Parameter p) { none() }
|
||||
|
||||
predicate allowFlowIntoUncertainDef(SsaImpl::UncertainWriteDefinition def) { any() }
|
||||
|
||||
private EdgeKind getConditionalEdge(boolean branch) {
|
||||
|
||||
@@ -1029,16 +1029,6 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu
|
||||
def instanceof Ssa::ImplicitParameterDefinition
|
||||
}
|
||||
|
||||
predicate ssaDefAssigns(WriteDefinition def, Expr value) {
|
||||
// exclude flow directly from RHS to SSA definition, as we instead want to
|
||||
// go from RHS to matching assingnable definition, and from there to SSA definition
|
||||
none()
|
||||
}
|
||||
|
||||
class Parameter = Ssa::ImplicitParameterDefinition;
|
||||
|
||||
predicate ssaDefInitializesParam(WriteDefinition def, Parameter p) { none() }
|
||||
|
||||
/**
|
||||
* Allows for flow into uncertain defintions that are not call definitions,
|
||||
* as we, conservatively, consider such definitions to be certain.
|
||||
|
||||
@@ -647,16 +647,10 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu
|
||||
|
||||
Expr getARead(Definition def) { result = getAUse(def) }
|
||||
|
||||
class Parameter = J::Parameter;
|
||||
|
||||
predicate ssaDefHasSource(WriteDefinition def) {
|
||||
def instanceof SsaExplicitUpdate or def.(SsaImplicitInit).isParameterDefinition(_)
|
||||
}
|
||||
|
||||
predicate ssaDefAssigns(Impl::WriteDefinition def, Expr value) { none() }
|
||||
|
||||
predicate ssaDefInitializesParam(Impl::WriteDefinition def, Parameter p) { none() }
|
||||
|
||||
predicate allowFlowIntoUncertainDef(UncertainWriteDefinition def) {
|
||||
def instanceof SsaUncertainImplicitUpdate
|
||||
}
|
||||
|
||||
@@ -61,18 +61,6 @@ module SsaDataflowInput implements DataFlowIntegrationInputSig {
|
||||
none()
|
||||
}
|
||||
|
||||
predicate ssaDefAssigns(WriteDefinition def, Expr value) {
|
||||
// This library only handles use-use flow after a post-update, there are no definitions, only uses.
|
||||
none()
|
||||
}
|
||||
|
||||
class Parameter = js::Parameter;
|
||||
|
||||
predicate ssaDefInitializesParam(WriteDefinition def, Parameter p) {
|
||||
// This library only handles use-use flow after a post-update, there are no definitions, only uses.
|
||||
none()
|
||||
}
|
||||
|
||||
cached
|
||||
Expr getARead(Definition def) {
|
||||
// Copied from implementation so we can cache it here
|
||||
|
||||
@@ -473,18 +473,12 @@ class ParameterExt extends TParameterExt {
|
||||
private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInputSig {
|
||||
private import codeql.ruby.controlflow.internal.Guards as Guards
|
||||
|
||||
class Parameter = ParameterExt;
|
||||
|
||||
class Expr extends Cfg::CfgNodes::ExprCfgNode {
|
||||
predicate hasCfgNode(SsaInput::BasicBlock bb, int i) { this = bb.getNode(i) }
|
||||
}
|
||||
|
||||
Expr getARead(Definition def) { result = Cached::getARead(def) }
|
||||
|
||||
predicate ssaDefAssigns(WriteDefinition def, Expr value) { none() }
|
||||
|
||||
predicate ssaDefInitializesParam(WriteDefinition def, Parameter p) { none() }
|
||||
|
||||
class Guard extends Cfg::CfgNodes::AstCfgNode {
|
||||
/**
|
||||
* Holds if the control flow branching from `bb1` is dependent on this guard,
|
||||
|
||||
@@ -342,11 +342,6 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu
|
||||
|
||||
predicate ssaDefHasSource(WriteDefinition def) { none() } // handled in `DataFlowImpl.qll` instead
|
||||
|
||||
/** Holds if SSA definition `def` assigns `value` to the underlying variable. */
|
||||
predicate ssaDefAssigns(WriteDefinition def, Expr value) {
|
||||
none() // handled in `DataFlowImpl.qll` instead
|
||||
}
|
||||
|
||||
private predicate isArg(CfgNodes::CallExprBaseCfgNode call, CfgNodes::ExprCfgNode e) {
|
||||
call.getArgument(_) = e
|
||||
or
|
||||
@@ -366,13 +361,6 @@ private module DataFlowIntegrationInput implements Impl::DataFlowIntegrationInpu
|
||||
)
|
||||
}
|
||||
|
||||
class Parameter = CfgNodes::ParamBaseCfgNode;
|
||||
|
||||
/** Holds if SSA definition `def` initializes parameter `p` at function entry. */
|
||||
predicate ssaDefInitializesParam(WriteDefinition def, Parameter p) {
|
||||
none() // handled in `DataFlowImpl.qll` instead
|
||||
}
|
||||
|
||||
class Guard extends CfgNodes::AstCfgNode {
|
||||
/**
|
||||
* Holds if the control flow branching from `bb1` is dependent on this guard,
|
||||
|
||||
@@ -1468,21 +1468,6 @@ module Make<LocationSig Location, InputSig<Location> Input> {
|
||||
*/
|
||||
default predicate ssaDefHasSource(WriteDefinition def) { any() }
|
||||
|
||||
/** Holds if SSA definition `def` assigns `value` to the underlying variable. */
|
||||
predicate ssaDefAssigns(WriteDefinition def, Expr value);
|
||||
|
||||
/** A parameter. */
|
||||
class Parameter {
|
||||
/** Gets a textual representation of this parameter. */
|
||||
string toString();
|
||||
|
||||
/** Gets the location of this parameter. */
|
||||
Location getLocation();
|
||||
}
|
||||
|
||||
/** Holds if SSA definition `def` initializes parameter `p` at function entry. */
|
||||
predicate ssaDefInitializesParam(WriteDefinition def, Parameter p);
|
||||
|
||||
/**
|
||||
* Holds if flow should be allowed into uncertain SSA definition `def` from
|
||||
* previous definitions or reads.
|
||||
@@ -1675,17 +1660,7 @@ module Make<LocationSig Location, InputSig<Location> Input> {
|
||||
cached
|
||||
private newtype TNode =
|
||||
TWriteDefSource(WriteDefinition def) { DfInput::ssaDefHasSource(def) } or
|
||||
TParamNode(DfInput::Parameter p) {
|
||||
exists(WriteDefinition def | DfInput::ssaDefInitializesParam(def, p))
|
||||
} or
|
||||
TExprNode(DfInput::Expr e, Boolean isPost) {
|
||||
e = DfInput::getARead(_)
|
||||
or
|
||||
exists(DefinitionExt def |
|
||||
DfInput::ssaDefAssigns(def, e) and
|
||||
isPost = false
|
||||
)
|
||||
} or
|
||||
TExprNode(DfInput::Expr e, Boolean isPost) { e = DfInput::getARead(_) } or
|
||||
TSsaDefinitionNode(DefinitionExt def) { not phiHasUniqNextNode(def) } or
|
||||
TSsaInputNode(SsaPhiExt phi, BasicBlock input) { relevantPhiInputNode(phi, input) }
|
||||
|
||||
@@ -1722,22 +1697,6 @@ module Make<LocationSig Location, InputSig<Location> Input> {
|
||||
|
||||
final class WriteDefSourceNode = WriteDefSourceNodeImpl;
|
||||
|
||||
/** A parameter node. */
|
||||
private class ParameterNodeImpl extends NodeImpl, TParamNode {
|
||||
private DfInput::Parameter p;
|
||||
|
||||
ParameterNodeImpl() { this = TParamNode(p) }
|
||||
|
||||
/** Gets the underlying parameter. */
|
||||
DfInput::Parameter getParameter() { result = p }
|
||||
|
||||
override string toString() { result = p.toString() }
|
||||
|
||||
override Location getLocation() { result = p.getLocation() }
|
||||
}
|
||||
|
||||
final class ParameterNode = ParameterNodeImpl;
|
||||
|
||||
/** A (post-update) expression node. */
|
||||
abstract private class ExprNodePreOrPostImpl extends NodeImpl, TExprNode {
|
||||
DfInput::Expr e;
|
||||
@@ -2003,14 +1962,7 @@ module Make<LocationSig Location, InputSig<Location> Input> {
|
||||
predicate localFlowStep(SourceVariable v, Node nodeFrom, Node nodeTo, boolean isUseStep) {
|
||||
exists(Definition def |
|
||||
// Flow from write definition source into SSA definition
|
||||
nodeFrom = TWriteDefSource(def)
|
||||
or
|
||||
// Flow from assignment into SSA definition
|
||||
DfInput::ssaDefAssigns(def, nodeFrom.(ExprNode).getExpr())
|
||||
or
|
||||
// Flow from parameter into entry definition
|
||||
DfInput::ssaDefInitializesParam(def, nodeFrom.(ParameterNode).getParameter())
|
||||
|
|
||||
nodeFrom = TWriteDefSource(def) and
|
||||
isUseStep = false and
|
||||
if DfInput::includeWriteDefsInFlowStep()
|
||||
then
|
||||
@@ -2042,14 +1994,7 @@ module Make<LocationSig Location, InputSig<Location> Input> {
|
||||
predicate localMustFlowStep(SourceVariable v, Node nodeFrom, Node nodeTo) {
|
||||
exists(Definition def |
|
||||
// Flow from write definition source into SSA definition
|
||||
nodeFrom = TWriteDefSource(def)
|
||||
or
|
||||
// Flow from assignment into SSA definition
|
||||
DfInput::ssaDefAssigns(def, nodeFrom.(ExprNode).getExpr())
|
||||
or
|
||||
// Flow from parameter into entry definition
|
||||
DfInput::ssaDefInitializesParam(def, nodeFrom.(ParameterNode).getParameter())
|
||||
|
|
||||
nodeFrom = TWriteDefSource(def) and
|
||||
v = def.getSourceVariable() and
|
||||
if DfInput::includeWriteDefsInFlowStep()
|
||||
then nodeTo.(SsaDefinitionNode).getDefinition() = def
|
||||
|
||||
Reference in New Issue
Block a user