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 newtype TPartialDefinition =
|
||||
TExplicitFieldStoreQualifier(Expr qualifier, FieldAccess fa) {
|
||||
isInstanceFieldWrite(fa) and qualifier = fa.getQualifier()
|
||||
TExplicitFieldStoreQualifier(Expr qualifier, ControlFlowNode node) {
|
||||
exists(FieldAccess fa |
|
||||
isInstanceFieldWrite(fa, node) and qualifier = fa.getQualifier()
|
||||
)
|
||||
} or
|
||||
TExplicitCallQualifier(Expr qualifier, Call call) { qualifier = call.getQualifier() } or
|
||||
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
|
||||
assignmentLikeOperation(_, fa.getTarget(), fa, _)
|
||||
assignmentLikeOperation(node, fa.getTarget(), fa, _)
|
||||
}
|
||||
|
||||
class PartialDefinition extends TPartialDefinition {
|
||||
Expr definedExpr;
|
||||
ControlFlowNode node;
|
||||
|
||||
PartialDefinition() {
|
||||
this = TExplicitFieldStoreQualifier(definedExpr, _) or
|
||||
this = TExplicitCallQualifier(definedExpr, _) or
|
||||
this = TReferenceArgument(definedExpr, _)
|
||||
this = TExplicitFieldStoreQualifier(definedExpr, node) or
|
||||
this = TExplicitCallQualifier(definedExpr, _) and node = definedExpr or
|
||||
this = TReferenceArgument(definedExpr, node)
|
||||
}
|
||||
|
||||
predicate partiallyDefines(Variable v) { definedExpr = v.getAnAccess() }
|
||||
|
||||
predicate partiallyDefinesThis(ThisExpr e) { definedExpr = e }
|
||||
|
||||
ControlFlowNode getSubBasicBlockStart() { result = definedExpr }
|
||||
ControlFlowNode getSubBasicBlockStart() { result = node }
|
||||
|
||||
Expr getDefinedExpr() { result = definedExpr }
|
||||
|
||||
@@ -141,8 +144,6 @@ private module PartialDefinitions {
|
||||
VariableAccess getVariableAccess() { result = va }
|
||||
|
||||
override predicate partiallyDefines(Variable v) { va = v.getAnAccess() }
|
||||
|
||||
override ControlFlowNode getSubBasicBlockStart() { result = va }
|
||||
}
|
||||
}
|
||||
import PartialDefinitions
|
||||
|
||||
Reference in New Issue
Block a user