Skip to content

Commit e590a7b

Browse files
committed
C++: Handle alias models for this/qualifiers
1 parent 9ac55af commit e590a7b

File tree

3 files changed

+36
-6
lines changed

3 files changed

+36
-6
lines changed

cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/AliasAnalysis.qll

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,14 +287,24 @@ private predicate isArgumentForParameter(
287287
private predicate isOnlyEscapesViaReturnArgument(Operand operand) {
288288
exists(AliasModels::AliasFunction f |
289289
f = operand.getUse().(CallInstruction).getStaticCallTarget() and
290-
f.parameterEscapesOnlyViaReturn(operand.(PositionalArgumentOperand).getIndex())
290+
(
291+
f.parameterEscapesOnlyViaReturn(operand.(PositionalArgumentOperand).getIndex())
292+
or
293+
f.parameterEscapesOnlyViaReturn(-1) and
294+
operand instanceof ThisArgumentOperand
295+
)
291296
)
292297
}
293298

294299
private predicate isNeverEscapesArgument(Operand operand) {
295300
exists(AliasModels::AliasFunction f |
296301
f = operand.getUse().(CallInstruction).getStaticCallTarget() and
297-
f.parameterNeverEscapes(operand.(PositionalArgumentOperand).getIndex())
302+
(
303+
f.parameterNeverEscapes(operand.(PositionalArgumentOperand).getIndex())
304+
or
305+
f.parameterNeverEscapes(-1) and
306+
operand instanceof ThisArgumentOperand
307+
)
298308
)
299309
}
300310

cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,14 +287,24 @@ private predicate isArgumentForParameter(
287287
private predicate isOnlyEscapesViaReturnArgument(Operand operand) {
288288
exists(AliasModels::AliasFunction f |
289289
f = operand.getUse().(CallInstruction).getStaticCallTarget() and
290-
f.parameterEscapesOnlyViaReturn(operand.(PositionalArgumentOperand).getIndex())
290+
(
291+
f.parameterEscapesOnlyViaReturn(operand.(PositionalArgumentOperand).getIndex())
292+
or
293+
f.parameterEscapesOnlyViaReturn(-1) and
294+
operand instanceof ThisArgumentOperand
295+
)
291296
)
292297
}
293298

294299
private predicate isNeverEscapesArgument(Operand operand) {
295300
exists(AliasModels::AliasFunction f |
296301
f = operand.getUse().(CallInstruction).getStaticCallTarget() and
297-
f.parameterNeverEscapes(operand.(PositionalArgumentOperand).getIndex())
302+
(
303+
f.parameterNeverEscapes(operand.(PositionalArgumentOperand).getIndex())
304+
or
305+
f.parameterNeverEscapes(-1) and
306+
operand instanceof ThisArgumentOperand
307+
)
298308
)
299309
}
300310

csharp/ql/src/experimental/ir/implementation/unaliased_ssa/internal/AliasAnalysis.qll

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,14 +287,24 @@ private predicate isArgumentForParameter(
287287
private predicate isOnlyEscapesViaReturnArgument(Operand operand) {
288288
exists(AliasModels::AliasFunction f |
289289
f = operand.getUse().(CallInstruction).getStaticCallTarget() and
290-
f.parameterEscapesOnlyViaReturn(operand.(PositionalArgumentOperand).getIndex())
290+
(
291+
f.parameterEscapesOnlyViaReturn(operand.(PositionalArgumentOperand).getIndex())
292+
or
293+
f.parameterEscapesOnlyViaReturn(-1) and
294+
operand instanceof ThisArgumentOperand
295+
)
291296
)
292297
}
293298

294299
private predicate isNeverEscapesArgument(Operand operand) {
295300
exists(AliasModels::AliasFunction f |
296301
f = operand.getUse().(CallInstruction).getStaticCallTarget() and
297-
f.parameterNeverEscapes(operand.(PositionalArgumentOperand).getIndex())
302+
(
303+
f.parameterNeverEscapes(operand.(PositionalArgumentOperand).getIndex())
304+
or
305+
f.parameterNeverEscapes(-1) and
306+
operand instanceof ThisArgumentOperand
307+
)
298308
)
299309
}
300310

0 commit comments

Comments
 (0)