Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 3f53138

Browse files
committed
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`.
1 parent 0507d51 commit 3f53138

1 file changed

Lines changed: 11 additions & 10 deletions

File tree

  • cpp/ql/src/semmle/code/cpp/dataflow/internal

cpp/ql/src/semmle/code/cpp/dataflow/internal/FlowVar.qll

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -89,31 +89,34 @@ cached class FlowVar extends TFlowVar {
8989
*/
9090
private module PartialDefinitions {
9191
private newtype TPartialDefinition =
92-
TExplicitFieldStoreQualifier(Expr qualifier, FieldAccess fa) {
93-
isInstanceFieldWrite(fa) and qualifier = fa.getQualifier()
92+
TExplicitFieldStoreQualifier(Expr qualifier, ControlFlowNode node) {
93+
exists(FieldAccess fa |
94+
isInstanceFieldWrite(fa, node) and qualifier = fa.getQualifier()
95+
)
9496
} or
9597
TExplicitCallQualifier(Expr qualifier, Call call) { qualifier = call.getQualifier() } or
9698
TReferenceArgument(Expr arg, VariableAccess va) { definitionByReference(va, arg) }
9799

98-
private predicate isInstanceFieldWrite(FieldAccess fa) {
100+
private predicate isInstanceFieldWrite(FieldAccess fa, ControlFlowNode node) {
99101
not fa.getTarget().isStatic() and
100-
assignmentLikeOperation(_, fa.getTarget(), fa, _)
102+
assignmentLikeOperation(node, fa.getTarget(), fa, _)
101103
}
102104

103105
class PartialDefinition extends TPartialDefinition {
104106
Expr definedExpr;
107+
ControlFlowNode node;
105108

106109
PartialDefinition() {
107-
this = TExplicitFieldStoreQualifier(definedExpr, _) or
108-
this = TExplicitCallQualifier(definedExpr, _) or
109-
this = TReferenceArgument(definedExpr, _)
110+
this = TExplicitFieldStoreQualifier(definedExpr, node) or
111+
this = TExplicitCallQualifier(definedExpr, _) and node = definedExpr or
112+
this = TReferenceArgument(definedExpr, node)
110113
}
111114

112115
predicate partiallyDefines(Variable v) { definedExpr = v.getAnAccess() }
113116

114117
predicate partiallyDefinesThis(ThisExpr e) { definedExpr = e }
115118

116-
ControlFlowNode getSubBasicBlockStart() { result = definedExpr }
119+
ControlFlowNode getSubBasicBlockStart() { result = node }
117120

118121
Expr getDefinedExpr() { result = definedExpr }
119122

@@ -141,8 +144,6 @@ private module PartialDefinitions {
141144
VariableAccess getVariableAccess() { result = va }
142145

143146
override predicate partiallyDefines(Variable v) { va = v.getAnAccess() }
144-
145-
override ControlFlowNode getSubBasicBlockStart() { result = va }
146147
}
147148
}
148149
import PartialDefinitions

0 commit comments

Comments
 (0)