Skip to content

Commit 7e6e6f0

Browse files
C++: Fix IR for designated array initializers
1 parent 0a20f9f commit 7e6e6f0

File tree

6 files changed

+125
-160
lines changed

6 files changed

+125
-160
lines changed

cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,11 @@ class TranslatedArrayListInitialization extends
148148
}
149149

150150
override TranslatedElement getChild(int id) {
151-
result = getTranslatedElementInitialization(initList, id)
151+
// The children are in initialization order
152+
result = rank[id + 1](TranslatedElementInitialization init |
153+
init.getInitList() = initList |
154+
init order by init.getElementIndex()
155+
)
152156
}
153157
}
154158

@@ -668,15 +672,6 @@ class TranslatedFieldValueInitialization extends
668672
}
669673
}
670674

671-
/**
672-
* Gets the `TranslatedElementInitialization` for element `elementIndex` in
673-
* initializer list `initList`.
674-
*/
675-
TranslatedElementInitialization getTranslatedElementInitialization(
676-
ArrayAggregateLiteral initList, int elementIndex) {
677-
result.getInitList() = initList and result.getElementIndex() = elementIndex
678-
}
679-
680675
/**
681676
* Represents the IR translation of the initialization of an array element from
682677
* an element of an initializer list.
@@ -717,7 +712,7 @@ abstract class TranslatedElementInitialization extends TranslatedElement {
717712
}
718713

719714
override Instruction getInstructionSuccessor(InstructionTag tag,
720-
EdgeKind kind) {
715+
EdgeKind kind) {
721716
tag = getElementIndexTag() and
722717
result = getInstruction(getElementAddressTag()) and
723718
kind instanceof GotoEdge
@@ -767,9 +762,8 @@ abstract class TranslatedElementInitialization extends TranslatedElement {
767762
* Represents the IR translation of the initialization of an array element from
768763
* an explicit element in an initializer list.
769764
*/
770-
class TranslatedExplicitElementInitialization extends
771-
TranslatedElementInitialization, TTranslatedExplicitElementInitialization,
772-
InitializationContext {
765+
class TranslatedExplicitElementInitialization extends TranslatedElementInitialization,
766+
TTranslatedExplicitElementInitialization, InitializationContext {
773767
int elementIndex;
774768

775769
TranslatedExplicitElementInitialization() {
@@ -785,7 +779,7 @@ class TranslatedExplicitElementInitialization extends
785779
}
786780

787781
override Instruction getInstructionSuccessor(InstructionTag tag,
788-
EdgeKind kind) {
782+
EdgeKind kind) {
789783
result = TranslatedElementInitialization.super.getInstructionSuccessor(tag, kind) or
790784
(
791785
tag = getElementAddressTag() and
@@ -816,8 +810,8 @@ class TranslatedExplicitElementInitialization extends
816810
* Represents the IR translation of the initialization of a range of array
817811
* elements without corresponding elements in the initializer list.
818812
*/
819-
class TranslatedElementValueInitialization extends
820-
TranslatedElementInitialization, TTranslatedElementValueInitialization {
813+
class TranslatedElementValueInitialization extends TranslatedElementInitialization,
814+
TTranslatedElementValueInitialization {
821815
int elementIndex;
822816
int elementCount;
823817

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

Lines changed: 41 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4326,56 +4326,47 @@ ir.cpp:
43264326

43274327
# 961| designatedInit() -> int
43284328
# 961| Block 0
4329-
# 961| v0_0(void) = EnterFunction :
4330-
# 961| m0_1(unknown) = AliasedDefinition :
4331-
# 961| mu0_2(unknown) = UnmodeledDefinition :
4332-
# 962| r0_3(glval<int[1000]>) = VariableAddress[a1] :
4333-
# 962| mu0_4(int[1000]) = Uninitialized : r0_3
4334-
# 962| r0_5(int) = Constant[0] :
4335-
# 962| r0_6(glval<int>) = PointerAdd : r0_3, r0_5
4336-
# 962| r0_7(unknown[8]) = Constant[0] :
4337-
# 962| m0_8(unknown[8]) = Store : r0_6, r0_7
4338-
# 962| m0_9(unknown) = Chi : m0_1, m0_8
4339-
#-----| Goto -> Block 2
4340-
4341-
# 962| Block 1
4342-
# 962| r1_0(int) = Constant[900] :
4343-
# 962| r1_1(glval<int>) = PointerAdd : r0_3, r1_0
4344-
# 962| r1_2(int) = Constant[10900] :
4345-
# 962| m1_3(int) = Store : r1_1, r1_2
4346-
# 962| m1_4(unknown) = Chi : m1_3
4347-
# 962| r1_5(int) = Constant[901] :
4348-
# 962| r1_6(glval<int>) = PointerAdd : r0_3, r1_5
4349-
# 962| r1_7(unknown[396]) = Constant[0] :
4350-
# 962| m1_8(unknown[396]) = Store : r1_6, r1_7
4351-
# 962| m1_9(unknown) = Chi : m1_4, m1_8
4352-
#-----| Goto -> Block 2
4353-
4354-
# 963| Block 2
4355-
# 963| r2_0(glval<int>) = VariableAddress[#return] :
4356-
# 963| r2_1(glval<int[1000]>) = VariableAddress[a1] :
4357-
# 963| r2_2(int *) = Convert : r2_1
4358-
# 963| r2_3(int) = Constant[900] :
4359-
# 963| r2_4(int *) = PointerAdd[4] : r2_2, r2_3
4360-
# 963| r2_5(int) = Load : r2_4, mu0_2
4361-
# 963| m2_6(int) = Store : r2_0, r2_5
4362-
# 961| r2_7(glval<int>) = VariableAddress[#return] :
4363-
# 961| v2_8(void) = ReturnValue : r2_7, m2_6
4364-
# 961| v2_9(void) = UnmodeledUse : mu*
4365-
# 961| v2_10(void) = ExitFunction :
4366-
4367-
# 962| Block 3
4368-
# 962| r3_0(int) = Constant[2] :
4369-
# 962| r3_1(glval<int>) = PointerAdd : r0_3, r3_0
4370-
# 962| r3_2(int) = Constant[10002] :
4371-
# 962| m3_3(int) = Store : r3_1, r3_2
4372-
# 962| m3_4(unknown) = Chi : m3_3
4373-
# 962| r3_5(int) = Constant[3] :
4374-
# 962| r3_6(glval<int>) = PointerAdd : r0_3, r3_5
4375-
# 962| r3_7(unknown[3588]) = Constant[0] :
4376-
# 962| m3_8(unknown[3588]) = Store : r3_6, r3_7
4377-
# 962| m3_9(unknown) = Chi : m3_4, m3_8
4378-
#-----| Goto -> Block 2
4329+
# 961| v0_0(void) = EnterFunction :
4330+
# 961| m0_1(unknown) = AliasedDefinition :
4331+
# 961| mu0_2(unknown) = UnmodeledDefinition :
4332+
# 962| r0_3(glval<int[1000]>) = VariableAddress[a1] :
4333+
# 962| mu0_4(int[1000]) = Uninitialized : r0_3
4334+
# 962| r0_5(int) = Constant[0] :
4335+
# 962| r0_6(glval<int>) = PointerAdd : r0_3, r0_5
4336+
# 962| r0_7(unknown[8]) = Constant[0] :
4337+
# 962| m0_8(unknown[8]) = Store : r0_6, r0_7
4338+
# 962| m0_9(unknown) = Chi : m0_1, m0_8
4339+
# 962| r0_10(int) = Constant[2] :
4340+
# 962| r0_11(glval<int>) = PointerAdd : r0_3, r0_10
4341+
# 962| r0_12(int) = Constant[10002] :
4342+
# 962| m0_13(int) = Store : r0_11, r0_12
4343+
# 962| m0_14(unknown) = Chi : m0_9, m0_13
4344+
# 962| r0_15(int) = Constant[3] :
4345+
# 962| r0_16(glval<int>) = PointerAdd : r0_3, r0_15
4346+
# 962| r0_17(unknown[3588]) = Constant[0] :
4347+
# 962| m0_18(unknown[3588]) = Store : r0_16, r0_17
4348+
# 962| m0_19(unknown) = Chi : m0_14, m0_18
4349+
# 962| r0_20(int) = Constant[900] :
4350+
# 962| r0_21(glval<int>) = PointerAdd : r0_3, r0_20
4351+
# 962| r0_22(int) = Constant[10900] :
4352+
# 962| m0_23(int) = Store : r0_21, r0_22
4353+
# 962| m0_24(unknown) = Chi : m0_19, m0_23
4354+
# 962| r0_25(int) = Constant[901] :
4355+
# 962| r0_26(glval<int>) = PointerAdd : r0_3, r0_25
4356+
# 962| r0_27(unknown[396]) = Constant[0] :
4357+
# 962| m0_28(unknown[396]) = Store : r0_26, r0_27
4358+
# 962| m0_29(unknown) = Chi : m0_24, m0_28
4359+
# 963| r0_30(glval<int>) = VariableAddress[#return] :
4360+
# 963| r0_31(glval<int[1000]>) = VariableAddress[a1] :
4361+
# 963| r0_32(int *) = Convert : r0_31
4362+
# 963| r0_33(int) = Constant[900] :
4363+
# 963| r0_34(int *) = PointerAdd[4] : r0_32, r0_33
4364+
# 963| r0_35(int) = Load : r0_34, mu0_2
4365+
# 963| m0_36(int) = Store : r0_30, r0_35
4366+
# 961| r0_37(glval<int>) = VariableAddress[#return] :
4367+
# 961| v0_38(void) = ReturnValue : r0_37, m0_36
4368+
# 961| v0_39(void) = UnmodeledUse : mu*
4369+
# 961| v0_40(void) = ExitFunction :
43794370

43804371
# 966| IfStmtWithDeclaration(int, int) -> void
43814372
# 966| Block 0

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
missingOperand
2-
| ir.cpp:962:26:962:30 | Chi: 10002 | ChiTotal |
3-
| ir.cpp:962:41:962:45 | Chi: 10900 | ChiTotal |
42
unexpectedOperand
53
duplicateOperand
64
missingPhiOperand

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

Lines changed: 36 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4157,51 +4157,42 @@ ir.cpp:
41574157

41584158
# 961| designatedInit() -> int
41594159
# 961| Block 0
4160-
# 961| v0_0(void) = EnterFunction :
4161-
# 961| mu0_1(unknown) = AliasedDefinition :
4162-
# 961| mu0_2(unknown) = UnmodeledDefinition :
4163-
# 962| r0_3(glval<int[1000]>) = VariableAddress[a1] :
4164-
# 962| mu0_4(int[1000]) = Uninitialized : r0_3
4165-
# 962| r0_5(int) = Constant[0] :
4166-
# 962| r0_6(glval<int>) = PointerAdd : r0_3, r0_5
4167-
# 962| r0_7(unknown[8]) = Constant[0] :
4168-
# 962| mu0_8(unknown[8]) = Store : r0_6, r0_7
4169-
#-----| Goto -> Block 2
4170-
4171-
# 962| Block 1
4172-
# 962| r1_0(int) = Constant[900] :
4173-
# 962| r1_1(glval<int>) = PointerAdd : r0_3, r1_0
4174-
# 962| r1_2(int) = Constant[10900] :
4175-
# 962| mu1_3(int) = Store : r1_1, r1_2
4176-
# 962| r1_4(int) = Constant[901] :
4177-
# 962| r1_5(glval<int>) = PointerAdd : r0_3, r1_4
4178-
# 962| r1_6(unknown[396]) = Constant[0] :
4179-
# 962| mu1_7(unknown[396]) = Store : r1_5, r1_6
4180-
#-----| Goto -> Block 2
4181-
4182-
# 963| Block 2
4183-
# 963| r2_0(glval<int>) = VariableAddress[#return] :
4184-
# 963| r2_1(glval<int[1000]>) = VariableAddress[a1] :
4185-
# 963| r2_2(int *) = Convert : r2_1
4186-
# 963| r2_3(int) = Constant[900] :
4187-
# 963| r2_4(int *) = PointerAdd[4] : r2_2, r2_3
4188-
# 963| r2_5(int) = Load : r2_4, mu0_2
4189-
# 963| mu2_6(int) = Store : r2_0, r2_5
4190-
# 961| r2_7(glval<int>) = VariableAddress[#return] :
4191-
# 961| v2_8(void) = ReturnValue : r2_7, mu0_2
4192-
# 961| v2_9(void) = UnmodeledUse : mu*
4193-
# 961| v2_10(void) = ExitFunction :
4194-
4195-
# 962| Block 3
4196-
# 962| r3_0(int) = Constant[2] :
4197-
# 962| r3_1(glval<int>) = PointerAdd : r0_3, r3_0
4198-
# 962| r3_2(int) = Constant[10002] :
4199-
# 962| mu3_3(int) = Store : r3_1, r3_2
4200-
# 962| r3_4(int) = Constant[3] :
4201-
# 962| r3_5(glval<int>) = PointerAdd : r0_3, r3_4
4202-
# 962| r3_6(unknown[3588]) = Constant[0] :
4203-
# 962| mu3_7(unknown[3588]) = Store : r3_5, r3_6
4204-
#-----| Goto -> Block 2
4160+
# 961| v0_0(void) = EnterFunction :
4161+
# 961| mu0_1(unknown) = AliasedDefinition :
4162+
# 961| mu0_2(unknown) = UnmodeledDefinition :
4163+
# 962| r0_3(glval<int[1000]>) = VariableAddress[a1] :
4164+
# 962| mu0_4(int[1000]) = Uninitialized : r0_3
4165+
# 962| r0_5(int) = Constant[0] :
4166+
# 962| r0_6(glval<int>) = PointerAdd : r0_3, r0_5
4167+
# 962| r0_7(unknown[8]) = Constant[0] :
4168+
# 962| mu0_8(unknown[8]) = Store : r0_6, r0_7
4169+
# 962| r0_9(int) = Constant[2] :
4170+
# 962| r0_10(glval<int>) = PointerAdd : r0_3, r0_9
4171+
# 962| r0_11(int) = Constant[10002] :
4172+
# 962| mu0_12(int) = Store : r0_10, r0_11
4173+
# 962| r0_13(int) = Constant[3] :
4174+
# 962| r0_14(glval<int>) = PointerAdd : r0_3, r0_13
4175+
# 962| r0_15(unknown[3588]) = Constant[0] :
4176+
# 962| mu0_16(unknown[3588]) = Store : r0_14, r0_15
4177+
# 962| r0_17(int) = Constant[900] :
4178+
# 962| r0_18(glval<int>) = PointerAdd : r0_3, r0_17
4179+
# 962| r0_19(int) = Constant[10900] :
4180+
# 962| mu0_20(int) = Store : r0_18, r0_19
4181+
# 962| r0_21(int) = Constant[901] :
4182+
# 962| r0_22(glval<int>) = PointerAdd : r0_3, r0_21
4183+
# 962| r0_23(unknown[396]) = Constant[0] :
4184+
# 962| mu0_24(unknown[396]) = Store : r0_22, r0_23
4185+
# 963| r0_25(glval<int>) = VariableAddress[#return] :
4186+
# 963| r0_26(glval<int[1000]>) = VariableAddress[a1] :
4187+
# 963| r0_27(int *) = Convert : r0_26
4188+
# 963| r0_28(int) = Constant[900] :
4189+
# 963| r0_29(int *) = PointerAdd[4] : r0_27, r0_28
4190+
# 963| r0_30(int) = Load : r0_29, mu0_2
4191+
# 963| mu0_31(int) = Store : r0_25, r0_30
4192+
# 961| r0_32(glval<int>) = VariableAddress[#return] :
4193+
# 961| v0_33(void) = ReturnValue : r0_32, mu0_2
4194+
# 961| v0_34(void) = UnmodeledUse : mu*
4195+
# 961| v0_35(void) = ExitFunction :
42054196

42064197
# 966| IfStmtWithDeclaration(int, int) -> void
42074198
# 966| Block 0

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@
9898
| IR: VirtualMemberFunction | 1 |
9999
| IR: WhileStatements | 4 |
100100
| IR: WhileStmtWithDeclaration | 8 |
101-
| IR: designatedInit | 4 |
101+
| IR: designatedInit | 1 |
102102
| IR: min | 4 |
103103
| IR: operator= | 1 |
104104
| IR: ~Base | 1 |

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

Lines changed: 36 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -4178,51 +4178,42 @@ ir.cpp:
41784178

41794179
# 961| designatedInit() -> int
41804180
# 961| Block 0
4181-
# 961| v0_0(void) = EnterFunction :
4182-
# 961| mu0_1(unknown) = AliasedDefinition :
4183-
# 961| mu0_2(unknown) = UnmodeledDefinition :
4184-
# 962| r0_3(glval<int[1000]>) = VariableAddress[a1] :
4185-
# 962| mu0_4(int[1000]) = Uninitialized : r0_3
4186-
# 962| r0_5(int) = Constant[0] :
4187-
# 962| r0_6(glval<int>) = PointerAdd : r0_3, r0_5
4188-
# 962| r0_7(unknown[8]) = Constant[0] :
4189-
# 962| mu0_8(unknown[8]) = Store : r0_6, r0_7
4190-
#-----| Goto -> Block 2
4191-
4192-
# 962| Block 1
4193-
# 962| r1_0(int) = Constant[900] :
4194-
# 962| r1_1(glval<int>) = PointerAdd : r0_3, r1_0
4195-
# 962| r1_2(int) = Constant[10900] :
4196-
# 962| mu1_3(int) = Store : r1_1, r1_2
4197-
# 962| r1_4(int) = Constant[901] :
4198-
# 962| r1_5(glval<int>) = PointerAdd : r0_3, r1_4
4199-
# 962| r1_6(unknown[396]) = Constant[0] :
4200-
# 962| mu1_7(unknown[396]) = Store : r1_5, r1_6
4201-
#-----| Goto -> Block 2
4202-
4203-
# 963| Block 2
4204-
# 963| r2_0(glval<int>) = VariableAddress[#return] :
4205-
# 963| r2_1(glval<int[1000]>) = VariableAddress[a1] :
4206-
# 963| r2_2(int *) = Convert : r2_1
4207-
# 963| r2_3(int) = Constant[900] :
4208-
# 963| r2_4(int *) = PointerAdd[4] : r2_2, r2_3
4209-
# 963| r2_5(int) = Load : r2_4, mu0_2
4210-
# 963| m2_6(int) = Store : r2_0, r2_5
4211-
# 961| r2_7(glval<int>) = VariableAddress[#return] :
4212-
# 961| v2_8(void) = ReturnValue : r2_7, m2_6
4213-
# 961| v2_9(void) = UnmodeledUse : mu*
4214-
# 961| v2_10(void) = ExitFunction :
4215-
4216-
# 962| Block 3
4217-
# 962| r3_0(int) = Constant[2] :
4218-
# 962| r3_1(glval<int>) = PointerAdd : r0_3, r3_0
4219-
# 962| r3_2(int) = Constant[10002] :
4220-
# 962| mu3_3(int) = Store : r3_1, r3_2
4221-
# 962| r3_4(int) = Constant[3] :
4222-
# 962| r3_5(glval<int>) = PointerAdd : r0_3, r3_4
4223-
# 962| r3_6(unknown[3588]) = Constant[0] :
4224-
# 962| mu3_7(unknown[3588]) = Store : r3_5, r3_6
4225-
#-----| Goto -> Block 2
4181+
# 961| v0_0(void) = EnterFunction :
4182+
# 961| mu0_1(unknown) = AliasedDefinition :
4183+
# 961| mu0_2(unknown) = UnmodeledDefinition :
4184+
# 962| r0_3(glval<int[1000]>) = VariableAddress[a1] :
4185+
# 962| mu0_4(int[1000]) = Uninitialized : r0_3
4186+
# 962| r0_5(int) = Constant[0] :
4187+
# 962| r0_6(glval<int>) = PointerAdd : r0_3, r0_5
4188+
# 962| r0_7(unknown[8]) = Constant[0] :
4189+
# 962| mu0_8(unknown[8]) = Store : r0_6, r0_7
4190+
# 962| r0_9(int) = Constant[2] :
4191+
# 962| r0_10(glval<int>) = PointerAdd : r0_3, r0_9
4192+
# 962| r0_11(int) = Constant[10002] :
4193+
# 962| mu0_12(int) = Store : r0_10, r0_11
4194+
# 962| r0_13(int) = Constant[3] :
4195+
# 962| r0_14(glval<int>) = PointerAdd : r0_3, r0_13
4196+
# 962| r0_15(unknown[3588]) = Constant[0] :
4197+
# 962| mu0_16(unknown[3588]) = Store : r0_14, r0_15
4198+
# 962| r0_17(int) = Constant[900] :
4199+
# 962| r0_18(glval<int>) = PointerAdd : r0_3, r0_17
4200+
# 962| r0_19(int) = Constant[10900] :
4201+
# 962| mu0_20(int) = Store : r0_18, r0_19
4202+
# 962| r0_21(int) = Constant[901] :
4203+
# 962| r0_22(glval<int>) = PointerAdd : r0_3, r0_21
4204+
# 962| r0_23(unknown[396]) = Constant[0] :
4205+
# 962| mu0_24(unknown[396]) = Store : r0_22, r0_23
4206+
# 963| r0_25(glval<int>) = VariableAddress[#return] :
4207+
# 963| r0_26(glval<int[1000]>) = VariableAddress[a1] :
4208+
# 963| r0_27(int *) = Convert : r0_26
4209+
# 963| r0_28(int) = Constant[900] :
4210+
# 963| r0_29(int *) = PointerAdd[4] : r0_27, r0_28
4211+
# 963| r0_30(int) = Load : r0_29, mu0_2
4212+
# 963| m0_31(int) = Store : r0_25, r0_30
4213+
# 961| r0_32(glval<int>) = VariableAddress[#return] :
4214+
# 961| v0_33(void) = ReturnValue : r0_32, m0_31
4215+
# 961| v0_34(void) = UnmodeledUse : mu*
4216+
# 961| v0_35(void) = ExitFunction :
42264217

42274218
# 966| IfStmtWithDeclaration(int, int) -> void
42284219
# 966| Block 0

0 commit comments

Comments
 (0)