Skip to content

Commit 5bd08e8

Browse files
committed
C++: Add more sizeof VLA tests
1 parent dc78330 commit 5bd08e8

9 files changed

+666
-228
lines changed

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

Lines changed: 363 additions & 128 deletions
Large diffs are not rendered by default.

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

Lines changed: 114 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -20442,63 +20442,128 @@ ir.cpp:
2044220442
# 2779| m2779_8(unsigned long) = InitializeParameter[len2] : &:r2779_7
2044320443
# 2779| r2779_9(glval<char>) = VariableAddress[len3] :
2044420444
# 2779| m2779_10(char) = InitializeParameter[len3] : &:r2779_9
20445-
# 2781| r2781_1(glval<char[]>) = VariableAddress[tmp1] :
20446-
# 2781| m2781_2(char[]) = Uninitialized[tmp1] : &:r2781_1
20447-
# 2781| r2781_3(glval<int>) = VariableAddress[len1] :
20448-
# 2781| r2781_4(int) = Load[len1] : &:r2781_3, m2779_6
20449-
# 2781| v2781_5(void) = NoOp :
20450-
# 2782| r2782_1(glval<unsigned long>) = VariableAddress[x] :
20451-
# 2782| r2782_2(unsigned long) = Constant[1] :
20452-
# 2782| r2782_3(unsigned long) = Mul : r2782_2, r2781_4
20453-
# 2782| m2782_4(unsigned long) = Store[x] : &:r2782_1, r2782_3
20454-
# 2783| r2783_1(glval<int[][]>) = VariableAddress[tmp2] :
20455-
# 2783| m2783_2(int[][]) = Uninitialized[tmp2] : &:r2783_1
20456-
# 2783| r2783_3(glval<int>) = VariableAddress[len1] :
20457-
# 2783| r2783_4(int) = Load[len1] : &:r2783_3, m2779_6
20458-
# 2783| r2783_5(glval<unsigned long>) = VariableAddress[len2] :
20459-
# 2783| r2783_6(unsigned long) = Load[len2] : &:r2783_5, m2779_8
20460-
# 2783| v2783_7(void) = NoOp :
20461-
# 2784| r2784_1(glval<unsigned long>) = VariableAddress[y] :
20445+
# 2780| r2780_1(glval<char[]>) = VariableAddress[tmp1] :
20446+
# 2780| m2780_2(char[]) = Uninitialized[tmp1] : &:r2780_1
20447+
# 2780| r2780_3(glval<int>) = VariableAddress[len1] :
20448+
# 2780| r2780_4(int) = Load[len1] : &:r2780_3, m2779_6
20449+
# 2780| v2780_5(void) = NoOp :
20450+
# 2781| r2781_1(glval<unsigned long>) = VariableAddress[x] :
20451+
# 2781| r2781_2(unsigned long) = Constant[1] :
20452+
# 2781| r2781_3(unsigned long) = Mul : r2781_2, r2780_4
20453+
# 2781| m2781_4(unsigned long) = Store[x] : &:r2781_1, r2781_3
20454+
# 2782| r2782_1(glval<int[][]>) = VariableAddress[tmp2] :
20455+
# 2782| m2782_2(int[][]) = Uninitialized[tmp2] : &:r2782_1
20456+
# 2782| r2782_3(glval<int>) = VariableAddress[len1] :
20457+
# 2782| r2782_4(int) = Load[len1] : &:r2782_3, m2779_6
20458+
# 2782| r2782_5(glval<unsigned long>) = VariableAddress[len2] :
20459+
# 2782| r2782_6(unsigned long) = Load[len2] : &:r2782_5, m2779_8
20460+
# 2782| v2782_7(void) = NoOp :
20461+
# 2783| r2783_1(glval<unsigned long>) = VariableAddress[y] :
20462+
# 2783| r2783_2(unsigned long) = Constant[4] :
20463+
# 2783| r2783_3(unsigned long) = Mul : r2783_2, r2782_4
20464+
# 2783| r2783_4(unsigned long) = Mul : r2783_3, r2782_6
20465+
# 2783| m2783_5(unsigned long) = Store[y] : &:r2783_1, r2783_4
20466+
# 2784| r2784_1(glval<unsigned long>) = VariableAddress[z] :
2046220467
# 2784| r2784_2(unsigned long) = Constant[4] :
20463-
# 2784| r2784_3(unsigned long) = Mul : r2784_2, r2783_4
20464-
# 2784| r2784_4(unsigned long) = Mul : r2784_3, r2783_6
20465-
# 2784| m2784_5(unsigned long) = Store[y] : &:r2784_1, r2784_4
20466-
# 2785| r2785_1(glval<unsigned long>) = VariableAddress[z] :
20467-
# 2785| r2785_2(unsigned long) = Constant[4] :
20468-
# 2785| r2785_3(unsigned long) = Mul : r2785_2, r2783_6
20469-
# 2785| m2785_4(unsigned long) = Store[z] : &:r2785_1, r2785_3
20470-
# 2786| r2786_1(glval<int[][][]>) = VariableAddress[tmp3] :
20471-
# 2786| m2786_2(int[][][]) = Uninitialized[tmp3] : &:r2786_1
20472-
# 2786| r2786_3(glval<int>) = VariableAddress[len1] :
20473-
# 2786| r2786_4(int) = Load[len1] : &:r2786_3, m2779_6
20474-
# 2786| r2786_5(glval<unsigned long>) = VariableAddress[len2] :
20475-
# 2786| r2786_6(unsigned long) = Load[len2] : &:r2786_5, m2779_8
20476-
# 2786| r2786_7(glval<char>) = VariableAddress[len3] :
20477-
# 2786| r2786_8(char) = Load[len3] : &:r2786_7, m2779_10
20478-
# 2786| v2786_9(void) = NoOp :
20479-
# 2787| r2787_1(glval<unsigned long>) = VariableAddress[w] :
20468+
# 2784| r2784_3(unsigned long) = Mul : r2784_2, r2782_6
20469+
# 2784| m2784_4(unsigned long) = Store[z] : &:r2784_1, r2784_3
20470+
# 2785| r2785_1(glval<int[][][]>) = VariableAddress[tmp3] :
20471+
# 2785| m2785_2(int[][][]) = Uninitialized[tmp3] : &:r2785_1
20472+
# 2785| r2785_3(glval<int>) = VariableAddress[len1] :
20473+
# 2785| r2785_4(int) = Load[len1] : &:r2785_3, m2779_6
20474+
# 2785| r2785_5(glval<unsigned long>) = VariableAddress[len2] :
20475+
# 2785| r2785_6(unsigned long) = Load[len2] : &:r2785_5, m2779_8
20476+
# 2785| r2785_7(glval<char>) = VariableAddress[len3] :
20477+
# 2785| r2785_8(char) = Load[len3] : &:r2785_7, m2779_10
20478+
# 2785| v2785_9(void) = NoOp :
20479+
# 2786| r2786_1(glval<unsigned long>) = VariableAddress[w] :
20480+
# 2786| r2786_2(unsigned long) = Constant[4] :
20481+
# 2786| r2786_3(unsigned long) = Mul : r2786_2, r2785_4
20482+
# 2786| r2786_4(unsigned long) = Mul : r2786_3, r2785_6
20483+
# 2786| r2786_5(unsigned long) = Mul : r2786_4, r2785_8
20484+
# 2786| m2786_6(unsigned long) = Store[w] : &:r2786_1, r2786_5
20485+
# 2787| r2787_1(glval<unsigned long>) = VariableAddress[v] :
2048020486
# 2787| r2787_2(unsigned long) = Constant[4] :
20481-
# 2787| r2787_3(unsigned long) = Mul : r2787_2, r2786_4
20482-
# 2787| r2787_4(unsigned long) = Mul : r2787_3, r2786_6
20483-
# 2787| r2787_5(unsigned long) = Mul : r2787_4, r2786_8
20484-
# 2787| m2787_6(unsigned long) = Store[w] : &:r2787_1, r2787_5
20485-
# 2788| r2788_1(glval<unsigned long>) = VariableAddress[v] :
20487+
# 2787| r2787_3(unsigned long) = Mul : r2787_2, r2785_6
20488+
# 2787| r2787_4(unsigned long) = Mul : r2787_3, r2785_8
20489+
# 2787| m2787_5(unsigned long) = Store[v] : &:r2787_1, r2787_4
20490+
# 2788| r2788_1(glval<unsigned long>) = VariableAddress[u] :
2048620491
# 2788| r2788_2(unsigned long) = Constant[4] :
20487-
# 2788| r2788_3(unsigned long) = Mul : r2788_2, r2786_6
20488-
# 2788| r2788_4(unsigned long) = Mul : r2788_3, r2786_8
20489-
# 2788| m2788_5(unsigned long) = Store[v] : &:r2788_1, r2788_4
20490-
# 2789| r2789_1(glval<unsigned long>) = VariableAddress[u] :
20492+
# 2788| r2788_3(unsigned long) = Mul : r2788_2, r2785_8
20493+
# 2788| m2788_4(unsigned long) = Store[u] : &:r2788_1, r2788_3
20494+
# 2789| r2789_1(glval<unsigned long>) = VariableAddress[t] :
2049120495
# 2789| r2789_2(unsigned long) = Constant[4] :
20492-
# 2789| r2789_3(unsigned long) = Mul : r2789_2, r2786_8
20493-
# 2789| m2789_4(unsigned long) = Store[u] : &:r2789_1, r2789_3
20494-
# 2790| r2790_1(glval<unsigned long>) = VariableAddress[t] :
20495-
# 2790| r2790_2(unsigned long) = Constant[4] :
20496-
# 2790| m2790_3(unsigned long) = Store[t] : &:r2790_1, r2790_2
20497-
# 2791| v2791_1(void) = NoOp :
20496+
# 2789| m2789_3(unsigned long) = Store[t] : &:r2789_1, r2789_2
20497+
# 2790| v2790_1(void) = NoOp :
2049820498
# 2779| v2779_11(void) = ReturnVoid :
2049920499
# 2779| v2779_12(void) = AliasedUse : m2779_3
2050020500
# 2779| v2779_13(void) = ExitFunction :
2050120501

20502+
# 2792| void vla_sizeof_test2(int, size_t, char)
20503+
# 2792| Block 0
20504+
# 2792| v2792_1(void) = EnterFunction :
20505+
# 2792| m2792_2(unknown) = AliasedDefinition :
20506+
# 2792| m2792_3(unknown) = InitializeNonLocal :
20507+
# 2792| m2792_4(unknown) = Chi : total:m2792_2, partial:m2792_3
20508+
# 2792| r2792_5(glval<int>) = VariableAddress[len1] :
20509+
# 2792| m2792_6(int) = InitializeParameter[len1] : &:r2792_5
20510+
# 2792| r2792_7(glval<unsigned long>) = VariableAddress[len2] :
20511+
# 2792| m2792_8(unsigned long) = InitializeParameter[len2] : &:r2792_7
20512+
# 2792| r2792_9(glval<char>) = VariableAddress[len3] :
20513+
# 2792| m2792_10(char) = InitializeParameter[len3] : &:r2792_9
20514+
# 2793| r2793_1(glval<int[][]>) = VariableAddress[tmp1] :
20515+
# 2793| m2793_2(int[][]) = Uninitialized[tmp1] : &:r2793_1
20516+
# 2793| r2793_3(glval<int>) = VariableAddress[len1] :
20517+
# 2793| r2793_4(int) = Load[len1] : &:r2793_3, m2792_6
20518+
# 2793| r2793_5(glval<unsigned long>) = VariableAddress[len2] :
20519+
# 2793| r2793_6(unsigned long) = Load[len2] : &:r2793_5, m2792_8
20520+
# 2793| v2793_7(void) = NoOp :
20521+
# 2794| r2794_1(glval<unsigned long>) = VariableAddress[z] :
20522+
20523+
# 2801| size_t vla_sizeof_test3(int, size_t, char, bool)
20524+
# 2801| Block 0
20525+
# 2801| v2801_1(void) = EnterFunction :
20526+
# 2801| m2801_2(unknown) = AliasedDefinition :
20527+
# 2801| m2801_3(unknown) = InitializeNonLocal :
20528+
# 2801| m2801_4(unknown) = Chi : total:m2801_2, partial:m2801_3
20529+
# 2801| r2801_5(glval<int>) = VariableAddress[len1] :
20530+
# 2801| m2801_6(int) = InitializeParameter[len1] : &:r2801_5
20531+
# 2801| r2801_7(glval<unsigned long>) = VariableAddress[len2] :
20532+
# 2801| m2801_8(unsigned long) = InitializeParameter[len2] : &:r2801_7
20533+
# 2801| r2801_9(glval<char>) = VariableAddress[len3] :
20534+
# 2801| m2801_10(char) = InitializeParameter[len3] : &:r2801_9
20535+
# 2801| r2801_11(glval<bool>) = VariableAddress[b] :
20536+
# 2801| m2801_12(bool) = InitializeParameter[b] : &:r2801_11
20537+
# 2802| r2802_1(glval<int>) = VariableAddress[len1] :
20538+
# 2802| r2802_2(int) = Load[len1] : &:r2802_1, m2801_6
20539+
# 2802| r2802_3(glval<unsigned long>) = VariableAddress[len2] :
20540+
# 2802| r2802_4(unsigned long) = Load[len2] : &:r2802_3, m2801_8
20541+
# 2802| v2802_5(void) = NoOp :
20542+
# 2803| v2803_1(void) = NoOp :
20543+
# 2804| r2804_1(glval<char>) = VariableAddress[len3] :
20544+
# 2804| r2804_2(char) = Load[len3] : &:r2804_1, m2801_10
20545+
# 2804| v2804_3(void) = NoOp :
20546+
# 2806| r2806_1(glval<bool>) = VariableAddress[b] :
20547+
# 2806| r2806_2(bool) = Load[b] : &:r2806_1, m2801_12
20548+
# 2806| v2806_3(void) = ConditionalBranch : r2806_2
20549+
#-----| False -> Block 2
20550+
#-----| True -> Block 1
20551+
20552+
# 2807| Block 1
20553+
# 2807| r2807_1(glval<long[][][]>) = VariableAddress[tmp] :
20554+
# 2807| m2807_2(long[][][]) = Uninitialized[tmp] : &:r2807_1
20555+
# 2807| v2807_3(void) = NoOp :
20556+
# 2808| r2808_1(glval<unsigned long>) = VariableAddress[#return] :
20557+
20558+
# 2811| Block 2
20559+
# 2811| r2811_1(glval<unsigned long>) = VariableAddress[#return] :
20560+
# 2811| r2811_2(unsigned long) = Constant[0] :
20561+
# 2811| m2811_3(unsigned long) = Store[#return] : &:r2811_1, r2811_2
20562+
# 2801| r2801_13(glval<unsigned long>) = VariableAddress[#return] :
20563+
# 2801| v2801_14(void) = ReturnValue : &:r2801_13, m2811_3
20564+
# 2801| v2801_15(void) = AliasedUse : m2801_3
20565+
# 2801| v2801_16(void) = ExitFunction :
20566+
2050220567
ir23.cpp:
2050320568
# 1| bool consteval_1()
2050420569
# 1| Block 0

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ missingOperandType
66
duplicateChiOperand
77
sideEffectWithoutPrimary
88
instructionWithoutSuccessor
9+
| ir.cpp:2794:10:2794:10 | VariableAddress: definition of z | Instruction 'VariableAddress: definition of z' has no successors in function '$@'. | ir.cpp:2792:6:2792:21 | void vla_sizeof_test2(int, size_t, char) | void vla_sizeof_test2(int, size_t, char) |
10+
| ir.cpp:2808:5:2808:26 | VariableAddress: return ... | Instruction 'VariableAddress: return ...' has no successors in function '$@'. | ir.cpp:2801:8:2801:23 | size_t vla_sizeof_test3(int, size_t, char, bool) | size_t vla_sizeof_test3(int, size_t, char, bool) |
911
ambiguousSuccessors
1012
unexplainedLoop
1113
unnecessaryPhiInstruction

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ missingOperandType
66
duplicateChiOperand
77
sideEffectWithoutPrimary
88
instructionWithoutSuccessor
9+
| ir.cpp:2794:10:2794:10 | VariableAddress: definition of z | Instruction 'VariableAddress: definition of z' has no successors in function '$@'. | ir.cpp:2792:6:2792:21 | void vla_sizeof_test2(int, size_t, char) | void vla_sizeof_test2(int, size_t, char) |
10+
| ir.cpp:2808:5:2808:26 | VariableAddress: return ... | Instruction 'VariableAddress: return ...' has no successors in function '$@'. | ir.cpp:2801:8:2801:23 | size_t vla_sizeof_test3(int, size_t, char, bool) | size_t vla_sizeof_test3(int, size_t, char, bool) |
911
ambiguousSuccessors
1012
unexplainedLoop
1113
unnecessaryPhiInstruction

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

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2776,8 +2776,7 @@ void test_allocation_with_initializer() {
27762776
long* p2 = new long(42);
27772777
}
27782778

2779-
void vla_sizeof_test(int len1, size_t len2, char len3)
2780-
{
2779+
void vla_sizeof_test(int len1, size_t len2, char len3) {
27812780
char tmp1[len1];
27822781
size_t x = sizeof(tmp1);
27832782
int tmp2[len1][len2];
@@ -2790,4 +2789,26 @@ void vla_sizeof_test(int len1, size_t len2, char len3)
27902789
size_t t = sizeof(***tmp3);
27912790
}
27922791

2792+
void vla_sizeof_test2(int len1, size_t len2, char len3) {
2793+
int tmp1[len1][len2];
2794+
size_t z = sizeof(tmp1[1]);
2795+
int tmp2[len1][len2][len3];
2796+
size_t v = sizeof(tmp2[1]);
2797+
size_t u = sizeof(tmp2[1][2]);
2798+
size_t t = sizeof(tmp2[1][2][3]);
2799+
}
2800+
2801+
size_t vla_sizeof_test3(int len1, size_t len2, char len3, bool b) {
2802+
typedef long arr[len1][len2];
2803+
typedef arr arr2;
2804+
typedef arr2 arr3[len3];
2805+
2806+
if (b) {
2807+
arr3 tmp;
2808+
return sizeof(tmp[1]);
2809+
}
2810+
2811+
return 0;
2812+
}
2813+
27932814
// semmle-extractor-options: -std=c++20 --clang

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
missingOperand
2+
| ir.cpp:2794:14:2794:28 | Store: sizeof(<expr>) | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2792:6:2792:21 | void vla_sizeof_test2(int, size_t, char) | void vla_sizeof_test2(int, size_t, char) |
3+
| ir.cpp:2796:14:2796:28 | Store: sizeof(<expr>) | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2792:6:2792:21 | void vla_sizeof_test2(int, size_t, char) | void vla_sizeof_test2(int, size_t, char) |
4+
| ir.cpp:2797:14:2797:31 | Store: sizeof(<expr>) | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2792:6:2792:21 | void vla_sizeof_test2(int, size_t, char) | void vla_sizeof_test2(int, size_t, char) |
5+
| ir.cpp:2808:12:2808:25 | Store: sizeof(<expr>) | Instruction 'Store' is missing an expected operand with tag 'StoreValue' in function '$@'. | ir.cpp:2801:8:2801:23 | size_t vla_sizeof_test3(int, size_t, char, bool) | size_t vla_sizeof_test3(int, size_t, char, bool) |
26
unexpectedOperand
37
duplicateOperand
48
missingPhiOperand
59
missingOperandType
610
duplicateChiOperand
711
sideEffectWithoutPrimary
812
instructionWithoutSuccessor
13+
| ir.cpp:2794:10:2794:10 | VariableAddress: definition of z | Instruction 'VariableAddress: definition of z' has no successors in function '$@'. | ir.cpp:2792:6:2792:21 | void vla_sizeof_test2(int, size_t, char) | void vla_sizeof_test2(int, size_t, char) |
14+
| ir.cpp:2796:10:2796:10 | VariableAddress: definition of v | Instruction 'VariableAddress: definition of v' has no successors in function '$@'. | ir.cpp:2792:6:2792:21 | void vla_sizeof_test2(int, size_t, char) | void vla_sizeof_test2(int, size_t, char) |
15+
| ir.cpp:2797:10:2797:10 | VariableAddress: definition of u | Instruction 'VariableAddress: definition of u' has no successors in function '$@'. | ir.cpp:2792:6:2792:21 | void vla_sizeof_test2(int, size_t, char) | void vla_sizeof_test2(int, size_t, char) |
16+
| ir.cpp:2808:5:2808:26 | VariableAddress: return ... | Instruction 'VariableAddress: return ...' has no successors in function '$@'. | ir.cpp:2801:8:2801:23 | size_t vla_sizeof_test3(int, size_t, char, bool) | size_t vla_sizeof_test3(int, size_t, char, bool) |
917
ambiguousSuccessors
1018
unexplainedLoop
1119
unnecessaryPhiInstruction
@@ -21,6 +29,10 @@ lostReachability
2129
backEdgeCountMismatch
2230
useNotDominatedByDefinition
2331
| ir.cpp:1535:8:1535:8 | Unary | Operand 'Unary' is not dominated by its definition in function '$@'. | ir.cpp:1535:8:1535:8 | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() | void StructuredBindingDataMemberStruct::StructuredBindingDataMemberStruct() |
32+
| ir.cpp:2794:10:2794:10 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2792:6:2792:21 | void vla_sizeof_test2(int, size_t, char) | void vla_sizeof_test2(int, size_t, char) |
33+
| ir.cpp:2796:10:2796:10 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2792:6:2792:21 | void vla_sizeof_test2(int, size_t, char) | void vla_sizeof_test2(int, size_t, char) |
34+
| ir.cpp:2797:10:2797:10 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2792:6:2792:21 | void vla_sizeof_test2(int, size_t, char) | void vla_sizeof_test2(int, size_t, char) |
35+
| ir.cpp:2808:5:2808:26 | Address | Operand 'Address' is not dominated by its definition in function '$@'. | ir.cpp:2801:8:2801:23 | size_t vla_sizeof_test3(int, size_t, char, bool) | size_t vla_sizeof_test3(int, size_t, char, bool) |
2436
switchInstructionWithoutDefaultEdge
2537
notMarkedAsConflated
2638
wronglyMarkedAsConflated

0 commit comments

Comments
 (0)