Skip to content

Commit 59a7766

Browse files
committed
CPP: Remove uneeded indirection around delete calls in the IR.
1 parent 9df5e30 commit 59a7766

File tree

5 files changed

+4
-97
lines changed

5 files changed

+4
-97
lines changed

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,7 @@ class TranslatedCallSideEffects extends TranslatedSideEffects, TTranslatedCallSi
352352
result = getTranslatedAllocatorCall(expr).getInstruction(CallTag())
353353
or
354354
expr instanceof DeleteOrDeleteArrayExpr and
355-
result = getTranslatedDeallocatorCall(expr).getInstruction(CallTag())
355+
result = getTranslatedDeleteOrDeleteArray(expr).getInstruction(CallTag())
356356
}
357357
}
358358

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -723,8 +723,6 @@ newtype TTranslatedElement =
723723
} or
724724
// An allocator call in a `new` or `new[]` expression
725725
TTranslatedAllocatorCall(NewOrNewArrayExpr newExpr) { not ignoreExpr(newExpr) } or
726-
// An deallocator call in a `delete` or `delete[]` expression
727-
TTranslatedDeallocatorCall(DeleteOrDeleteArrayExpr newExpr) { not ignoreExpr(newExpr) } or
728726
// An allocation size for a `new` or `new[]` expression
729727
TTranslatedAllocationSize(NewOrNewArrayExpr newExpr) { not ignoreExpr(newExpr) } or
730728
// The declaration/initialization part of a `ConditionDeclExpr`

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedExpr.qll

Lines changed: 3 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -2018,16 +2018,12 @@ TranslatedAllocatorCall getTranslatedAllocatorCall(NewOrNewArrayExpr newExpr) {
20182018
}
20192019

20202020
/**
2021-
* The IR translation of a call to `operator delete` as part of a `delete` or `delete[]`
2021+
* The IR translation of a `delete` or `delete[]`
20222022
* expression.
20232023
*/
2024-
class TranslatedDeallocatorCall extends TTranslatedDeallocatorCall, TranslatedCall {
2024+
class TranslatedDeleteOrDeleteArrayExpr extends TranslatedNonConstantExpr, TranslatedCall {
20252025
override DeleteOrDeleteArrayExpr expr;
20262026

2027-
TranslatedDeallocatorCall() { this = TTranslatedDeallocatorCall(expr) }
2028-
2029-
final override string toString() { result = "Deallocator call for " + expr.toString() }
2030-
20312027
final override Instruction getFirstCallTargetInstruction() {
20322028
result = this.getInstruction(CallTargetTag())
20332029
}
@@ -2052,8 +2048,6 @@ class TranslatedDeallocatorCall extends TTranslatedDeallocatorCall, TranslatedCa
20522048
result = this.getFirstArgumentOrCallInstruction()
20532049
}
20542050

2055-
final override predicate producesExprResult() { none() }
2056-
20572051
override Function getInstructionFunction(InstructionTag tag) {
20582052
tag = CallTargetTag() and result = expr.getDeallocator()
20592053
}
@@ -2079,7 +2073,7 @@ class TranslatedDeallocatorCall extends TTranslatedDeallocatorCall, TranslatedCa
20792073
}
20802074
}
20812075

2082-
TranslatedDeallocatorCall getTranslatedDeallocatorCall(DeleteOrDeleteArrayExpr newExpr) {
2076+
TranslatedDeleteOrDeleteArrayExpr getTranslatedDeleteOrDeleteArray(DeleteOrDeleteArrayExpr newExpr) {
20832077
result.getAst() = newExpr
20842078
}
20852079

@@ -3020,63 +3014,6 @@ class TranslatedNewArrayExpr extends TranslatedNewOrNewArrayExpr {
30203014
}
30213015
}
30223016

3023-
/**
3024-
* The IR translation of a `delete` or `delete[]` expression.
3025-
*/
3026-
abstract class TranslatedDeleteOrDeleteArrayExpr extends TranslatedNonConstantExpr {
3027-
override DeleteOrDeleteArrayExpr expr;
3028-
3029-
final override TranslatedElement getChild(int id) {
3030-
id = 0 and result = this.getDeallocatorCall()
3031-
}
3032-
3033-
final override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
3034-
tag = OnlyInstructionTag() and
3035-
opcode instanceof Opcode::Convert and
3036-
resultType = this.getResultType()
3037-
}
3038-
3039-
final override Instruction getFirstInstruction() {
3040-
result = this.getDeallocatorCall().getFirstInstruction()
3041-
}
3042-
3043-
final override Instruction getResult() { result = this.getInstruction(OnlyInstructionTag()) }
3044-
3045-
final override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) {
3046-
kind instanceof GotoEdge and
3047-
tag = OnlyInstructionTag() and
3048-
result = this.getParent().getChildSuccessor(this)
3049-
}
3050-
3051-
final override Instruction getChildSuccessor(TranslatedElement child) {
3052-
child = this.getDeallocatorCall() and result = this.getInstruction(OnlyInstructionTag())
3053-
}
3054-
3055-
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
3056-
tag = OnlyInstructionTag() and
3057-
operandTag instanceof UnaryOperandTag and
3058-
result = this.getDeallocatorCall().getResult()
3059-
}
3060-
3061-
private TranslatedDeallocatorCall getDeallocatorCall() {
3062-
result = getTranslatedDeallocatorCall(expr)
3063-
}
3064-
}
3065-
3066-
/**
3067-
* The IR translation of a `delete` expression.
3068-
*/
3069-
class TranslatedDeleteExpr extends TranslatedDeleteOrDeleteArrayExpr {
3070-
override DeleteExpr expr;
3071-
}
3072-
3073-
/**
3074-
* The IR translation of a `delete[]` expression.
3075-
*/
3076-
class TranslatedDeleteArrayExpr extends TranslatedDeleteOrDeleteArrayExpr {
3077-
override DeleteArrayExpr expr;
3078-
}
3079-
30803017
/**
30813018
* The IR translation of a `ConditionDeclExpr`, which represents the value of the declared variable
30823019
* after conversion to `bool` in code such as:

cpp/ql/test/library-tests/ir/ir/operand_locations.expected

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4892,31 +4892,26 @@
48924892
| ir.cpp:1016:3:1016:35 | ChiPartial | partial:m1016_4 |
48934893
| ir.cpp:1016:3:1016:35 | ChiTotal | total:m1015_4 |
48944894
| ir.cpp:1016:3:1016:35 | SideEffect | ~m1015_4 |
4895-
| ir.cpp:1016:3:1016:35 | Unary | v1016_3 |
48964895
| ir.cpp:1016:10:1016:35 | Arg(0) | 0:r1016_2 |
48974896
| ir.cpp:1017:3:1017:38 | CallTarget | func:r1017_1 |
48984897
| ir.cpp:1017:3:1017:38 | ChiPartial | partial:m1017_4 |
48994898
| ir.cpp:1017:3:1017:38 | ChiTotal | total:m1016_5 |
49004899
| ir.cpp:1017:3:1017:38 | SideEffect | ~m1016_5 |
4901-
| ir.cpp:1017:3:1017:38 | Unary | v1017_3 |
49024900
| ir.cpp:1017:10:1017:38 | Arg(0) | 0:r1017_2 |
49034901
| ir.cpp:1018:3:1018:44 | CallTarget | func:r1018_1 |
49044902
| ir.cpp:1018:3:1018:44 | ChiPartial | partial:m1018_4 |
49054903
| ir.cpp:1018:3:1018:44 | ChiTotal | total:m1017_5 |
49064904
| ir.cpp:1018:3:1018:44 | SideEffect | ~m1017_5 |
4907-
| ir.cpp:1018:3:1018:44 | Unary | v1018_3 |
49084905
| ir.cpp:1018:10:1018:44 | Arg(0) | 0:r1018_2 |
49094906
| ir.cpp:1019:3:1019:43 | CallTarget | func:r1019_1 |
49104907
| ir.cpp:1019:3:1019:43 | ChiPartial | partial:m1019_4 |
49114908
| ir.cpp:1019:3:1019:43 | ChiTotal | total:m1018_5 |
49124909
| ir.cpp:1019:3:1019:43 | SideEffect | ~m1018_5 |
4913-
| ir.cpp:1019:3:1019:43 | Unary | v1019_3 |
49144910
| ir.cpp:1019:10:1019:43 | Arg(0) | 0:r1019_2 |
49154911
| ir.cpp:1020:3:1020:47 | CallTarget | func:r1020_1 |
49164912
| ir.cpp:1020:3:1020:47 | ChiPartial | partial:m1020_4 |
49174913
| ir.cpp:1020:3:1020:47 | ChiTotal | total:m1019_5 |
49184914
| ir.cpp:1020:3:1020:47 | SideEffect | ~m1019_5 |
4919-
| ir.cpp:1020:3:1020:47 | Unary | v1020_3 |
49204915
| ir.cpp:1020:10:1020:47 | Arg(0) | 0:r1020_2 |
49214916
| ir.cpp:1024:6:1024:24 | ChiPartial | partial:m1024_3 |
49224917
| ir.cpp:1024:6:1024:24 | ChiTotal | total:m1024_2 |
@@ -4925,31 +4920,26 @@
49254920
| ir.cpp:1025:3:1025:37 | ChiPartial | partial:m1025_4 |
49264921
| ir.cpp:1025:3:1025:37 | ChiTotal | total:m1024_4 |
49274922
| ir.cpp:1025:3:1025:37 | SideEffect | ~m1024_4 |
4928-
| ir.cpp:1025:3:1025:37 | Unary | v1025_3 |
49294923
| ir.cpp:1025:12:1025:37 | Arg(0) | 0:r1025_2 |
49304924
| ir.cpp:1026:3:1026:40 | CallTarget | func:r1026_1 |
49314925
| ir.cpp:1026:3:1026:40 | ChiPartial | partial:m1026_4 |
49324926
| ir.cpp:1026:3:1026:40 | ChiTotal | total:m1025_5 |
49334927
| ir.cpp:1026:3:1026:40 | SideEffect | ~m1025_5 |
4934-
| ir.cpp:1026:3:1026:40 | Unary | v1026_3 |
49354928
| ir.cpp:1026:12:1026:40 | Arg(0) | 0:r1026_2 |
49364929
| ir.cpp:1027:3:1027:46 | CallTarget | func:r1027_1 |
49374930
| ir.cpp:1027:3:1027:46 | ChiPartial | partial:m1027_4 |
49384931
| ir.cpp:1027:3:1027:46 | ChiTotal | total:m1026_5 |
49394932
| ir.cpp:1027:3:1027:46 | SideEffect | ~m1026_5 |
4940-
| ir.cpp:1027:3:1027:46 | Unary | v1027_3 |
49414933
| ir.cpp:1027:12:1027:46 | Arg(0) | 0:r1027_2 |
49424934
| ir.cpp:1028:3:1028:45 | CallTarget | func:r1028_1 |
49434935
| ir.cpp:1028:3:1028:45 | ChiPartial | partial:m1028_4 |
49444936
| ir.cpp:1028:3:1028:45 | ChiTotal | total:m1027_5 |
49454937
| ir.cpp:1028:3:1028:45 | SideEffect | ~m1027_5 |
4946-
| ir.cpp:1028:3:1028:45 | Unary | v1028_3 |
49474938
| ir.cpp:1028:12:1028:45 | Arg(0) | 0:r1028_2 |
49484939
| ir.cpp:1029:3:1029:49 | CallTarget | func:r1029_1 |
49494940
| ir.cpp:1029:3:1029:49 | ChiPartial | partial:m1029_4 |
49504941
| ir.cpp:1029:3:1029:49 | ChiTotal | total:m1028_5 |
49514942
| ir.cpp:1029:3:1029:49 | SideEffect | ~m1028_5 |
4952-
| ir.cpp:1029:3:1029:49 | Unary | v1029_3 |
49534943
| ir.cpp:1029:12:1029:49 | Arg(0) | 0:r1029_2 |
49544944
| ir.cpp:1034:6:1034:20 | ChiPartial | partial:m1034_3 |
49554945
| ir.cpp:1034:6:1034:20 | ChiTotal | total:m1034_2 |
@@ -9659,7 +9649,6 @@
96599649
| ir.cpp:2036:3:2036:10 | ChiPartial | partial:m2036_5 |
96609650
| ir.cpp:2036:3:2036:10 | ChiTotal | total:m2034_6 |
96619651
| ir.cpp:2036:3:2036:10 | SideEffect | ~m2034_6 |
9662-
| ir.cpp:2036:3:2036:10 | Unary | v2036_4 |
96639652
| ir.cpp:2036:10:2036:10 | Address | &:r2036_2 |
96649653
| ir.cpp:2036:10:2036:10 | Arg(0) | 0:r2036_3 |
96659654
| ir.cpp:2036:10:2036:10 | Load | m2034_9 |
@@ -9755,7 +9744,6 @@
97559744
| ir.cpp:2059:5:2059:13 | ChiPartial | partial:m2059_5 |
97569745
| ir.cpp:2059:5:2059:13 | ChiTotal | total:m2058_12 |
97579746
| ir.cpp:2059:5:2059:13 | SideEffect | ~m2058_12 |
9758-
| ir.cpp:2059:5:2059:13 | Unary | v2059_4 |
97599747
| ir.cpp:2059:12:2059:13 | Address | &:r2059_2 |
97609748
| ir.cpp:2059:12:2059:13 | Arg(0) | 0:r2059_3 |
97619749
| ir.cpp:2059:12:2059:13 | Load | m2058_15 |
@@ -9781,7 +9769,6 @@
97819769
| ir.cpp:2062:5:2062:13 | ChiPartial | partial:m2062_5 |
97829770
| ir.cpp:2062:5:2062:13 | ChiTotal | total:m2061_12 |
97839771
| ir.cpp:2062:5:2062:13 | SideEffect | ~m2061_12 |
9784-
| ir.cpp:2062:5:2062:13 | Unary | v2062_4 |
97859772
| ir.cpp:2062:12:2062:13 | Address | &:r2062_2 |
97869773
| ir.cpp:2062:12:2062:13 | Arg(0) | 0:r2062_3 |
97879774
| ir.cpp:2062:12:2062:13 | Load | m2061_16 |
@@ -9806,7 +9793,6 @@
98069793
| ir.cpp:2065:5:2065:12 | ChiPartial | partial:m2065_5 |
98079794
| ir.cpp:2065:5:2065:12 | ChiTotal | total:m2064_12 |
98089795
| ir.cpp:2065:5:2065:12 | SideEffect | ~m2064_12 |
9809-
| ir.cpp:2065:5:2065:12 | Unary | v2065_4 |
98109796
| ir.cpp:2065:12:2065:12 | Address | &:r2065_2 |
98119797
| ir.cpp:2065:12:2065:12 | Arg(0) | 0:r2065_3 |
98129798
| ir.cpp:2065:12:2065:12 | Load | m2064_15 |

cpp/ql/test/library-tests/ir/ir/raw_ir.expected

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5670,27 +5670,22 @@ ir.cpp:
56705670
# 1016| r1016_2(int *) = Constant[0] :
56715671
# 1016| v1016_3(void) = Call[operator delete] : func:r1016_1, 0:r1016_2
56725672
# 1016| mu1016_4(unknown) = ^CallSideEffect : ~m?
5673-
# 1016| v1016_5(void) = Convert : v1016_3
56745673
# 1017| r1017_1(glval<unknown>) = FunctionAddress[operator delete] :
56755674
# 1017| r1017_2(String *) = Constant[0] :
56765675
# 1017| v1017_3(void) = Call[operator delete] : func:r1017_1, 0:r1017_2
56775676
# 1017| mu1017_4(unknown) = ^CallSideEffect : ~m?
5678-
# 1017| v1017_5(void) = Convert : v1017_3
56795677
# 1018| r1018_1(glval<unknown>) = FunctionAddress[operator delete] :
56805678
# 1018| r1018_2(SizedDealloc *) = Constant[0] :
56815679
# 1018| v1018_3(void) = Call[operator delete] : func:r1018_1, 0:r1018_2
56825680
# 1018| mu1018_4(unknown) = ^CallSideEffect : ~m?
5683-
# 1018| v1018_5(void) = Convert : v1018_3
56845681
# 1019| r1019_1(glval<unknown>) = FunctionAddress[operator delete] :
56855682
# 1019| r1019_2(Overaligned *) = Constant[0] :
56865683
# 1019| v1019_3(void) = Call[operator delete] : func:r1019_1, 0:r1019_2
56875684
# 1019| mu1019_4(unknown) = ^CallSideEffect : ~m?
5688-
# 1019| v1019_5(void) = Convert : v1019_3
56895685
# 1020| r1020_1(glval<unknown>) = VirtualDeleteFunctionAddress :
56905686
# 1020| r1020_2(PolymorphicBase *) = Constant[0] :
56915687
# 1020| v1020_3(void) = Call[?] : func:r1020_1, 0:r1020_2
56925688
# 1020| mu1020_4(unknown) = ^CallSideEffect : ~m?
5693-
# 1020| v1020_5(void) = Convert : v1020_3
56945689
# 1021| v1021_1(void) = NoOp :
56955690
# 1015| v1015_4(void) = ReturnVoid :
56965691
# 1015| v1015_5(void) = AliasedUse : ~m?
@@ -5705,27 +5700,22 @@ ir.cpp:
57055700
# 1025| r1025_2(int *) = Constant[0] :
57065701
# 1025| v1025_3(void) = Call[operator delete[]] : func:r1025_1, 0:r1025_2
57075702
# 1025| mu1025_4(unknown) = ^CallSideEffect : ~m?
5708-
# 1025| v1025_5(void) = Convert : v1025_3
57095703
# 1026| r1026_1(glval<unknown>) = FunctionAddress[operator delete[]] :
57105704
# 1026| r1026_2(String *) = Constant[0] :
57115705
# 1026| v1026_3(void) = Call[operator delete[]] : func:r1026_1, 0:r1026_2
57125706
# 1026| mu1026_4(unknown) = ^CallSideEffect : ~m?
5713-
# 1026| v1026_5(void) = Convert : v1026_3
57145707
# 1027| r1027_1(glval<unknown>) = FunctionAddress[operator delete[]] :
57155708
# 1027| r1027_2(SizedDealloc *) = Constant[0] :
57165709
# 1027| v1027_3(void) = Call[operator delete[]] : func:r1027_1, 0:r1027_2
57175710
# 1027| mu1027_4(unknown) = ^CallSideEffect : ~m?
5718-
# 1027| v1027_5(void) = Convert : v1027_3
57195711
# 1028| r1028_1(glval<unknown>) = FunctionAddress[operator delete[]] :
57205712
# 1028| r1028_2(Overaligned *) = Constant[0] :
57215713
# 1028| v1028_3(void) = Call[operator delete[]] : func:r1028_1, 0:r1028_2
57225714
# 1028| mu1028_4(unknown) = ^CallSideEffect : ~m?
5723-
# 1028| v1028_5(void) = Convert : v1028_3
57245715
# 1029| r1029_1(glval<unknown>) = FunctionAddress[operator delete[]] :
57255716
# 1029| r1029_2(PolymorphicBase *) = Constant[0] :
57265717
# 1029| v1029_3(void) = Call[operator delete[]] : func:r1029_1, 0:r1029_2
57275718
# 1029| mu1029_4(unknown) = ^CallSideEffect : ~m?
5728-
# 1029| v1029_5(void) = Convert : v1029_3
57295719
# 1030| v1030_1(void) = NoOp :
57305720
# 1024| v1024_4(void) = ReturnVoid :
57315721
# 1024| v1024_5(void) = AliasedUse : ~m?
@@ -11144,7 +11134,6 @@ ir.cpp:
1114411134
# 2036| r2036_3(int *) = Load[x] : &:r2036_2, ~m?
1114511135
# 2036| v2036_4(void) = Call[operator delete] : func:r2036_1, 0:r2036_3
1114611136
# 2036| mu2036_5(unknown) = ^CallSideEffect : ~m?
11147-
# 2036| v2036_6(void) = Convert : v2036_4
1114811137
# 2037| v2037_1(void) = NoOp :
1114911138
# 2033| v2033_4(void) = ReturnVoid :
1115011139
# 2033| v2033_5(void) = AliasedUse : ~m?
@@ -11271,7 +11260,6 @@ ir.cpp:
1127111260
# 2059| r2059_3(Base2 *) = Load[b1] : &:r2059_2, ~m?
1127211261
# 2059| v2059_4(void) = Call[?] : func:r2059_1, 0:r2059_3
1127311262
# 2059| mu2059_5(unknown) = ^CallSideEffect : ~m?
11274-
# 2059| v2059_6(void) = Convert : v2059_4
1127511263
# 2061| r2061_1(glval<Base2 *>) = VariableAddress[b2] :
1127611264
# 2061| r2061_2(glval<unknown>) = FunctionAddress[operator new] :
1127711265
# 2061| r2061_3(unsigned long) = Constant[16] :
@@ -11290,7 +11278,6 @@ ir.cpp:
1129011278
# 2062| r2062_3(Base2 *) = Load[b2] : &:r2062_2, ~m?
1129111279
# 2062| v2062_4(void) = Call[?] : func:r2062_1, 0:r2062_3
1129211280
# 2062| mu2062_5(unknown) = ^CallSideEffect : ~m?
11293-
# 2062| v2062_6(void) = Convert : v2062_4
1129411281
# 2064| r2064_1(glval<Derived2 *>) = VariableAddress[d] :
1129511282
# 2064| r2064_2(glval<unknown>) = FunctionAddress[operator new] :
1129611283
# 2064| r2064_3(unsigned long) = Constant[16] :
@@ -11308,7 +11295,6 @@ ir.cpp:
1130811295
# 2065| r2065_3(Derived2 *) = Load[d] : &:r2065_2, ~m?
1130911296
# 2065| v2065_4(void) = Call[?] : func:r2065_1, 0:r2065_3
1131011297
# 2065| mu2065_5(unknown) = ^CallSideEffect : ~m?
11311-
# 2065| v2065_6(void) = Convert : v2065_4
1131211298
# 2066| v2066_1(void) = Unreached :
1131311299

1131411300
# 2056| Block 1

0 commit comments

Comments
 (0)