mirror of
https://github.com/github/codeql.git
synced 2025-12-21 19:26:31 +01:00
C++: Reduce number of SubBasicBlocks in FlowVar
by cutting basic blocks at the same place for the `x.a` partial definition in `x.a = ...` as they were already cut for assignment to `a`.
This commit is contained in:
@@ -89,31 +89,34 @@ cached class FlowVar extends TFlowVar {
|
|||||||
*/
|
*/
|
||||||
private module PartialDefinitions {
|
private module PartialDefinitions {
|
||||||
private newtype TPartialDefinition =
|
private newtype TPartialDefinition =
|
||||||
TExplicitFieldStoreQualifier(Expr qualifier, FieldAccess fa) {
|
TExplicitFieldStoreQualifier(Expr qualifier, ControlFlowNode node) {
|
||||||
isInstanceFieldWrite(fa) and qualifier = fa.getQualifier()
|
exists(FieldAccess fa |
|
||||||
|
isInstanceFieldWrite(fa, node) and qualifier = fa.getQualifier()
|
||||||
|
)
|
||||||
} or
|
} or
|
||||||
TExplicitCallQualifier(Expr qualifier, Call call) { qualifier = call.getQualifier() } or
|
TExplicitCallQualifier(Expr qualifier, Call call) { qualifier = call.getQualifier() } or
|
||||||
TReferenceArgument(Expr arg, VariableAccess va) { definitionByReference(va, arg) }
|
TReferenceArgument(Expr arg, VariableAccess va) { definitionByReference(va, arg) }
|
||||||
|
|
||||||
private predicate isInstanceFieldWrite(FieldAccess fa) {
|
private predicate isInstanceFieldWrite(FieldAccess fa, ControlFlowNode node) {
|
||||||
not fa.getTarget().isStatic() and
|
not fa.getTarget().isStatic() and
|
||||||
assignmentLikeOperation(_, fa.getTarget(), fa, _)
|
assignmentLikeOperation(node, fa.getTarget(), fa, _)
|
||||||
}
|
}
|
||||||
|
|
||||||
class PartialDefinition extends TPartialDefinition {
|
class PartialDefinition extends TPartialDefinition {
|
||||||
Expr definedExpr;
|
Expr definedExpr;
|
||||||
|
ControlFlowNode node;
|
||||||
|
|
||||||
PartialDefinition() {
|
PartialDefinition() {
|
||||||
this = TExplicitFieldStoreQualifier(definedExpr, _) or
|
this = TExplicitFieldStoreQualifier(definedExpr, node) or
|
||||||
this = TExplicitCallQualifier(definedExpr, _) or
|
this = TExplicitCallQualifier(definedExpr, _) and node = definedExpr or
|
||||||
this = TReferenceArgument(definedExpr, _)
|
this = TReferenceArgument(definedExpr, node)
|
||||||
}
|
}
|
||||||
|
|
||||||
predicate partiallyDefines(Variable v) { definedExpr = v.getAnAccess() }
|
predicate partiallyDefines(Variable v) { definedExpr = v.getAnAccess() }
|
||||||
|
|
||||||
predicate partiallyDefinesThis(ThisExpr e) { definedExpr = e }
|
predicate partiallyDefinesThis(ThisExpr e) { definedExpr = e }
|
||||||
|
|
||||||
ControlFlowNode getSubBasicBlockStart() { result = definedExpr }
|
ControlFlowNode getSubBasicBlockStart() { result = node }
|
||||||
|
|
||||||
Expr getDefinedExpr() { result = definedExpr }
|
Expr getDefinedExpr() { result = definedExpr }
|
||||||
|
|
||||||
@@ -141,8 +144,6 @@ private module PartialDefinitions {
|
|||||||
VariableAccess getVariableAccess() { result = va }
|
VariableAccess getVariableAccess() { result = va }
|
||||||
|
|
||||||
override predicate partiallyDefines(Variable v) { va = v.getAnAccess() }
|
override predicate partiallyDefines(Variable v) { va = v.getAnAccess() }
|
||||||
|
|
||||||
override ControlFlowNode getSubBasicBlockStart() { result = va }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
import PartialDefinitions
|
import PartialDefinitions
|
||||||
|
|||||||
Reference in New Issue
Block a user