Skip to content

Commit 7d8872b

Browse files
committed
C++: Fix for multiple for-loop variables with destructors
1 parent 6663420 commit 7d8872b

File tree

9 files changed

+29
-7
lines changed

9 files changed

+29
-7
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,6 +1019,12 @@ class TranslatedForStmt extends TranslatedLoop {
10191019
or
10201020
child = this.getUpdate() and result = this.getFirstConditionInstruction(kind)
10211021
or
1022+
exists(int destructorId |
1023+
destructorId >= this.getFirstDestructorCallIndex() and
1024+
child = this.getChild(destructorId) and
1025+
result = this.getChild(destructorId + 1).getFirstInstruction(kind)
1026+
)
1027+
or
10221028
exists(int lastDestructorIndex |
10231029
lastDestructorIndex =
10241030
max(int n | exists(this.getChild(n)) and n >= this.getFirstDestructorCallIndex()) and

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13085,6 +13085,18 @@ ir.cpp:
1308513085
# 2161| v2161_47(void) = ^IndirectReadSideEffect[-1] : &:r2161_42, m2161_22
1308613086
# 2161| m2161_48(String) = ^IndirectMayWriteSideEffect[-1] : &:r2161_42
1308713087
# 2161| m2161_49(String) = Chi : total:m2161_22, partial:m2161_48
13088+
# 2161| r2161_50(glval<String>) = VariableAddress[s] :
13089+
# 2161| r2161_51(glval<unknown>) = FunctionAddress[~String] :
13090+
# 2161| v2161_52(void) = Call[~String] : func:r2161_51, this:r2161_50
13091+
# 2161| m2161_53(unknown) = ^CallSideEffect : ~m2161_46
13092+
# 2161| m2161_54(unknown) = Chi : total:m2161_46, partial:m2161_53
13093+
# 2161| v2161_55(void) = ^IndirectReadSideEffect[-1] : &:r2161_50, m2161_23
13094+
# 2161| m2161_56(String) = ^IndirectMayWriteSideEffect[-1] : &:r2161_50
13095+
# 2161| m2161_57(String) = Chi : total:m2161_23, partial:m2161_56
13096+
# 2164| v2164_1(void) = NoOp :
13097+
# 2151| v2151_5(void) = ReturnVoid :
13098+
# 2151| v2151_6(void) = AliasedUse : ~m2161_54
13099+
# 2151| v2151_7(void) = ExitFunction :
1308813100

1308913101
# 2166| void IfDestructors2(bool)
1309013102
# 2166| Block 0

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ missingOperandType
66
duplicateChiOperand
77
sideEffectWithoutPrimary
88
instructionWithoutSuccessor
9-
| ir.cpp:2161:28:2161:29 | Chi: s2 | Instruction 'Chi: s2' has no successors in function '$@'. | ir.cpp:2151:6:2151:19 | void ForDestructors() | void ForDestructors() |
109
ambiguousSuccessors
1110
unexplainedLoop
1211
unnecessaryPhiInstruction

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ missingOperandType
66
duplicateChiOperand
77
sideEffectWithoutPrimary
88
instructionWithoutSuccessor
9-
| ir.cpp:2161:28:2161:29 | Chi: s2 | Instruction 'Chi: s2' has no successors in function '$@'. | ir.cpp:2151:6:2151:19 | void ForDestructors() | void ForDestructors() |
109
ambiguousSuccessors
1110
unexplainedLoop
1211
unnecessaryPhiInstruction

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10464,6 +10464,7 @@
1046410464
| ir.cpp:2149:1:2149:1 | SideEffect | ~m2149_6 |
1046510465
| ir.cpp:2151:6:2151:19 | ChiPartial | partial:m2151_3 |
1046610466
| ir.cpp:2151:6:2151:19 | ChiTotal | total:m2151_2 |
10467+
| ir.cpp:2151:6:2151:19 | SideEffect | ~m2161_54 |
1046710468
| ir.cpp:2152:10:2152:10 | Address | &:r2152_1 |
1046810469
| ir.cpp:2152:13:2152:16 | StoreValue | r2152_2 |
1046910470
| ir.cpp:2153:16:2153:16 | Address | &:r2153_1 |
@@ -10647,7 +10648,17 @@
1064710648
| ir.cpp:2159:5:2159:5 | SideEffect | ~m2158_6 |
1064810649
| ir.cpp:2161:16:2161:16 | Address | &:r2161_1 |
1064910650
| ir.cpp:2161:16:2161:16 | Address | &:r2161_1 |
10651+
| ir.cpp:2161:16:2161:16 | Address | &:r2161_50 |
10652+
| ir.cpp:2161:16:2161:16 | Address | &:r2161_50 |
1065010653
| ir.cpp:2161:16:2161:16 | Arg(this) | this:r2161_1 |
10654+
| ir.cpp:2161:16:2161:16 | Arg(this) | this:r2161_50 |
10655+
| ir.cpp:2161:16:2161:16 | CallTarget | func:r2161_51 |
10656+
| ir.cpp:2161:16:2161:16 | ChiPartial | partial:m2161_53 |
10657+
| ir.cpp:2161:16:2161:16 | ChiPartial | partial:m2161_56 |
10658+
| ir.cpp:2161:16:2161:16 | ChiTotal | total:m2161_23 |
10659+
| ir.cpp:2161:16:2161:16 | ChiTotal | total:m2161_46 |
10660+
| ir.cpp:2161:16:2161:16 | SideEffect | m2161_23 |
10661+
| ir.cpp:2161:16:2161:16 | SideEffect | ~m2161_46 |
1065110662
| ir.cpp:2161:18:2161:24 | Address | &:r2161_5 |
1065210663
| ir.cpp:2161:18:2161:24 | Arg(0) | 0:r2161_5 |
1065310664
| ir.cpp:2161:18:2161:24 | SideEffect | ~m2151_3 |

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ missingOperandType
66
duplicateChiOperand
77
sideEffectWithoutPrimary
88
instructionWithoutSuccessor
9-
| ir.cpp:2161:28:2161:29 | IndirectMayWriteSideEffect: s2 | Instruction 'IndirectMayWriteSideEffect: s2' has no successors in function '$@'. | ir.cpp:2151:6:2151:19 | void ForDestructors() | void ForDestructors() |
109
ambiguousSuccessors
1110
unexplainedLoop
1211
unnecessaryPhiInstruction

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12182,8 +12182,6 @@ ir.cpp:
1218212182
# 2161| mu2161_36(unknown) = ^CallSideEffect : ~m?
1218312183
# 2161| v2161_37(void) = ^IndirectReadSideEffect[-1] : &:r2161_33, ~m?
1218412184
# 2161| mu2161_38(String) = ^IndirectMayWriteSideEffect[-1] : &:r2161_33
12185-
12186-
# 2161| Block 10
1218712185
# 2161| r2161_39(glval<String>) = VariableAddress[s] :
1218812186
# 2161| r2161_40(glval<unknown>) = FunctionAddress[~String] :
1218912187
# 2161| v2161_41(void) = Call[~String] : func:r2161_40, this:r2161_39

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ missingOperandType
66
duplicateChiOperand
77
sideEffectWithoutPrimary
88
instructionWithoutSuccessor
9-
| ir.cpp:2161:28:2161:29 | IndirectMayWriteSideEffect: s2 | Instruction 'IndirectMayWriteSideEffect: s2' has no successors in function '$@'. | ir.cpp:2151:6:2151:19 | void ForDestructors() | void ForDestructors() |
109
ambiguousSuccessors
1110
unexplainedLoop
1211
unnecessaryPhiInstruction

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ missingOperandType
66
duplicateChiOperand
77
sideEffectWithoutPrimary
88
instructionWithoutSuccessor
9-
| ir.cpp:2161:28:2161:29 | IndirectMayWriteSideEffect: s2 | Instruction 'IndirectMayWriteSideEffect: s2' has no successors in function '$@'. | ir.cpp:2151:6:2151:19 | void ForDestructors() | void ForDestructors() |
109
ambiguousSuccessors
1110
unexplainedLoop
1211
unnecessaryPhiInstruction

0 commit comments

Comments
 (0)