From 5bd08e817444b909b8b541d2f23a68e61f58beab Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Mon, 1 Sep 2025 10:59:17 +0200 Subject: [PATCH] C++: Add more `sizeof` VLA tests --- .../library-tests/ir/ir/PrintAST.expected | 491 +++++++++++++----- .../library-tests/ir/ir/aliased_ir.expected | 163 ++++-- .../ir/ir/aliased_ssa_consistency.expected | 2 + .../aliased_ssa_consistency_unsound.expected | 2 + cpp/ql/test/library-tests/ir/ir/ir.cpp | 25 +- .../ir/ir/raw_consistency.expected | 12 + .../test/library-tests/ir/ir/raw_ir.expected | 195 +++++-- .../ir/ir/unaliased_ssa_consistency.expected | 2 + ...unaliased_ssa_consistency_unsound.expected | 2 + 9 files changed, 666 insertions(+), 228 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index b03bd326604..34d231f8ebd 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -24589,178 +24589,413 @@ ir.cpp: # 2779| Type = [CTypedefType,Size_t] size_t # 2779| getParameter(2): [Parameter] len3 # 2779| Type = [PlainCharType] char -# 2780| getEntryPoint(): [BlockStmt] { ... } -# 2781| getStmt(0): [DeclStmt] declaration -# 2781| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp1 -# 2781| Type = [ArrayType] char[] -# 2781| getStmt(1): [VlaDimensionStmt] VLA dimension size -# 2781| getDimensionExpr(): [VariableAccess] len1 -# 2781| Type = [IntType] int -# 2781| ValueCategory = prvalue(load) -# 2781| getStmt(2): [VlaDeclStmt] VLA declaration -# 2782| getStmt(3): [DeclStmt] declaration -# 2782| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x +# 2779| getEntryPoint(): [BlockStmt] { ... } +# 2780| getStmt(0): [DeclStmt] declaration +# 2780| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp1 +# 2780| Type = [ArrayType] char[] +# 2780| getStmt(1): [VlaDimensionStmt] VLA dimension size +# 2780| getDimensionExpr(): [VariableAccess] len1 +# 2780| Type = [IntType] int +# 2780| ValueCategory = prvalue(load) +# 2780| getStmt(2): [VlaDeclStmt] VLA declaration +# 2781| getStmt(3): [DeclStmt] declaration +# 2781| getDeclarationEntry(0): [VariableDeclarationEntry] definition of x +# 2781| Type = [CTypedefType,Size_t] size_t +# 2781| getVariable().getInitializer(): [Initializer] initializer for x +# 2781| getExpr(): [SizeofExprOperator] sizeof() +# 2781| Type = [LongType] unsigned long +# 2781| ValueCategory = prvalue +# 2781| getExprOperand(): [VariableAccess] tmp1 +# 2781| Type = [ArrayType] char[] +# 2781| ValueCategory = lvalue +# 2781| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2781| Type = [ArrayType] char[] +# 2781| ValueCategory = lvalue +# 2782| getStmt(4): [DeclStmt] declaration +# 2782| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp2 +# 2782| Type = [ArrayType] int[][] +# 2782| getStmt(5): [VlaDimensionStmt] VLA dimension size +# 2782| getDimensionExpr(): [VariableAccess] len1 +# 2782| Type = [IntType] int +# 2782| ValueCategory = prvalue(load) +# 2782| getStmt(6): [VlaDimensionStmt] VLA dimension size +# 2782| getDimensionExpr(): [VariableAccess] len2 # 2782| Type = [CTypedefType,Size_t] size_t -# 2782| getVariable().getInitializer(): [Initializer] initializer for x -# 2782| getExpr(): [SizeofExprOperator] sizeof() -# 2782| Type = [LongType] unsigned long -# 2782| ValueCategory = prvalue -# 2782| getExprOperand(): [VariableAccess] tmp1 -# 2782| Type = [ArrayType] char[] -# 2782| ValueCategory = lvalue -# 2782| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) -# 2782| Type = [ArrayType] char[] -# 2782| ValueCategory = lvalue -# 2783| getStmt(4): [DeclStmt] declaration -# 2783| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp2 -# 2783| Type = [ArrayType] int[][] -# 2783| getStmt(5): [VlaDimensionStmt] VLA dimension size -# 2783| getDimensionExpr(): [VariableAccess] len1 -# 2783| Type = [IntType] int -# 2783| ValueCategory = prvalue(load) -# 2783| getStmt(6): [VlaDimensionStmt] VLA dimension size -# 2783| getDimensionExpr(): [VariableAccess] len2 +# 2782| ValueCategory = prvalue(load) +# 2782| getStmt(7): [VlaDeclStmt] VLA declaration +# 2783| getStmt(8): [DeclStmt] declaration +# 2783| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y # 2783| Type = [CTypedefType,Size_t] size_t -# 2783| ValueCategory = prvalue(load) -# 2783| getStmt(7): [VlaDeclStmt] VLA declaration -# 2784| getStmt(8): [DeclStmt] declaration -# 2784| getDeclarationEntry(0): [VariableDeclarationEntry] definition of y +# 2783| getVariable().getInitializer(): [Initializer] initializer for y +# 2783| getExpr(): [SizeofExprOperator] sizeof() +# 2783| Type = [LongType] unsigned long +# 2783| ValueCategory = prvalue +# 2783| getExprOperand(): [VariableAccess] tmp2 +# 2783| Type = [ArrayType] int[][] +# 2783| ValueCategory = lvalue +# 2783| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2783| Type = [ArrayType] int[][] +# 2783| ValueCategory = lvalue +# 2784| getStmt(9): [DeclStmt] declaration +# 2784| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z # 2784| Type = [CTypedefType,Size_t] size_t -# 2784| getVariable().getInitializer(): [Initializer] initializer for y +# 2784| getVariable().getInitializer(): [Initializer] initializer for z # 2784| getExpr(): [SizeofExprOperator] sizeof() # 2784| Type = [LongType] unsigned long # 2784| ValueCategory = prvalue -# 2784| getExprOperand(): [VariableAccess] tmp2 -# 2784| Type = [ArrayType] int[][] +# 2784| getExprOperand(): [PointerDereferenceExpr] * ... +# 2784| Type = [ArrayType] int[] # 2784| ValueCategory = lvalue +# 2784| getOperand(): [VariableAccess] tmp2 +# 2784| Type = [ArrayType] int[][] +# 2784| ValueCategory = lvalue +# 2784| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2784| Type = [PointerType] int(*)[] +# 2784| ValueCategory = prvalue # 2784| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) -# 2784| Type = [ArrayType] int[][] +# 2784| Type = [ArrayType] int[] # 2784| ValueCategory = lvalue -# 2785| getStmt(9): [DeclStmt] declaration -# 2785| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z +# 2785| getStmt(10): [DeclStmt] declaration +# 2785| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp3 +# 2785| Type = [ArrayType] int[][][] +# 2785| getStmt(11): [VlaDimensionStmt] VLA dimension size +# 2785| getDimensionExpr(): [VariableAccess] len1 +# 2785| Type = [IntType] int +# 2785| ValueCategory = prvalue(load) +# 2785| getStmt(12): [VlaDimensionStmt] VLA dimension size +# 2785| getDimensionExpr(): [VariableAccess] len2 # 2785| Type = [CTypedefType,Size_t] size_t -# 2785| getVariable().getInitializer(): [Initializer] initializer for z -# 2785| getExpr(): [SizeofExprOperator] sizeof() -# 2785| Type = [LongType] unsigned long -# 2785| ValueCategory = prvalue -# 2785| getExprOperand(): [PointerDereferenceExpr] * ... -# 2785| Type = [ArrayType] int[] -# 2785| ValueCategory = lvalue -# 2785| getOperand(): [VariableAccess] tmp2 -# 2785| Type = [ArrayType] int[][] -# 2785| ValueCategory = lvalue -# 2785| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion -# 2785| Type = [PointerType] int(*)[] -# 2785| ValueCategory = prvalue -# 2785| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) -# 2785| Type = [ArrayType] int[] -# 2785| ValueCategory = lvalue -# 2786| getStmt(10): [DeclStmt] declaration -# 2786| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp3 -# 2786| Type = [ArrayType] int[][][] -# 2786| getStmt(11): [VlaDimensionStmt] VLA dimension size -# 2786| getDimensionExpr(): [VariableAccess] len1 -# 2786| Type = [IntType] int -# 2786| ValueCategory = prvalue(load) -# 2786| getStmt(12): [VlaDimensionStmt] VLA dimension size -# 2786| getDimensionExpr(): [VariableAccess] len2 +# 2785| ValueCategory = prvalue(load) +# 2785| getStmt(13): [VlaDimensionStmt] VLA dimension size +# 2785| getDimensionExpr(): [VariableAccess] len3 +# 2785| Type = [PlainCharType] char +# 2785| ValueCategory = prvalue(load) +# 2785| getStmt(14): [VlaDeclStmt] VLA declaration +# 2786| getStmt(15): [DeclStmt] declaration +# 2786| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w # 2786| Type = [CTypedefType,Size_t] size_t -# 2786| ValueCategory = prvalue(load) -# 2786| getStmt(13): [VlaDimensionStmt] VLA dimension size -# 2786| getDimensionExpr(): [VariableAccess] len3 -# 2786| Type = [PlainCharType] char -# 2786| ValueCategory = prvalue(load) -# 2786| getStmt(14): [VlaDeclStmt] VLA declaration -# 2787| getStmt(15): [DeclStmt] declaration -# 2787| getDeclarationEntry(0): [VariableDeclarationEntry] definition of w +# 2786| getVariable().getInitializer(): [Initializer] initializer for w +# 2786| getExpr(): [SizeofExprOperator] sizeof() +# 2786| Type = [LongType] unsigned long +# 2786| ValueCategory = prvalue +# 2786| getExprOperand(): [VariableAccess] tmp3 +# 2786| Type = [ArrayType] int[][][] +# 2786| ValueCategory = lvalue +# 2786| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2786| Type = [ArrayType] int[][][] +# 2786| ValueCategory = lvalue +# 2787| getStmt(16): [DeclStmt] declaration +# 2787| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v # 2787| Type = [CTypedefType,Size_t] size_t -# 2787| getVariable().getInitializer(): [Initializer] initializer for w +# 2787| getVariable().getInitializer(): [Initializer] initializer for v # 2787| getExpr(): [SizeofExprOperator] sizeof() # 2787| Type = [LongType] unsigned long # 2787| ValueCategory = prvalue -# 2787| getExprOperand(): [VariableAccess] tmp3 -# 2787| Type = [ArrayType] int[][][] +# 2787| getExprOperand(): [PointerDereferenceExpr] * ... +# 2787| Type = [ArrayType] int[][] # 2787| ValueCategory = lvalue +# 2787| getOperand(): [VariableAccess] tmp3 +# 2787| Type = [ArrayType] int[][][] +# 2787| ValueCategory = lvalue +# 2787| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2787| Type = [PointerType] int(*)[][] +# 2787| ValueCategory = prvalue # 2787| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) -# 2787| Type = [ArrayType] int[][][] +# 2787| Type = [ArrayType] int[][] # 2787| ValueCategory = lvalue -# 2788| getStmt(16): [DeclStmt] declaration -# 2788| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 2788| getStmt(17): [DeclStmt] declaration +# 2788| getDeclarationEntry(0): [VariableDeclarationEntry] definition of u # 2788| Type = [CTypedefType,Size_t] size_t -# 2788| getVariable().getInitializer(): [Initializer] initializer for v +# 2788| getVariable().getInitializer(): [Initializer] initializer for u # 2788| getExpr(): [SizeofExprOperator] sizeof() # 2788| Type = [LongType] unsigned long # 2788| ValueCategory = prvalue # 2788| getExprOperand(): [PointerDereferenceExpr] * ... -# 2788| Type = [ArrayType] int[][] +# 2788| Type = [ArrayType] int[] # 2788| ValueCategory = lvalue -# 2788| getOperand(): [VariableAccess] tmp3 -# 2788| Type = [ArrayType] int[][][] +# 2788| getOperand(): [PointerDereferenceExpr] * ... +# 2788| Type = [ArrayType] int[][] # 2788| ValueCategory = lvalue +# 2788| getOperand(): [VariableAccess] tmp3 +# 2788| Type = [ArrayType] int[][][] +# 2788| ValueCategory = lvalue +# 2788| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2788| Type = [PointerType] int(*)[][] +# 2788| ValueCategory = prvalue # 2788| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion -# 2788| Type = [PointerType] int(*)[][] +# 2788| Type = [PointerType] int(*)[] # 2788| ValueCategory = prvalue # 2788| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) -# 2788| Type = [ArrayType] int[][] +# 2788| Type = [ArrayType] int[] # 2788| ValueCategory = lvalue -# 2789| getStmt(17): [DeclStmt] declaration -# 2789| getDeclarationEntry(0): [VariableDeclarationEntry] definition of u +# 2789| getStmt(18): [DeclStmt] declaration +# 2789| getDeclarationEntry(0): [VariableDeclarationEntry] definition of t # 2789| Type = [CTypedefType,Size_t] size_t -# 2789| getVariable().getInitializer(): [Initializer] initializer for u +# 2789| getVariable().getInitializer(): [Initializer] initializer for t # 2789| getExpr(): [SizeofExprOperator] sizeof() # 2789| Type = [LongType] unsigned long +# 2789| Value = [SizeofExprOperator] 4 # 2789| ValueCategory = prvalue # 2789| getExprOperand(): [PointerDereferenceExpr] * ... -# 2789| Type = [ArrayType] int[] +# 2789| Type = [IntType] int # 2789| ValueCategory = lvalue # 2789| getOperand(): [PointerDereferenceExpr] * ... -# 2789| Type = [ArrayType] int[][] +# 2789| Type = [ArrayType] int[] # 2789| ValueCategory = lvalue -# 2789| getOperand(): [VariableAccess] tmp3 -# 2789| Type = [ArrayType] int[][][] +# 2789| getOperand(): [PointerDereferenceExpr] * ... +# 2789| Type = [ArrayType] int[][] # 2789| ValueCategory = lvalue +# 2789| getOperand(): [VariableAccess] tmp3 +# 2789| Type = [ArrayType] int[][][] +# 2789| ValueCategory = lvalue +# 2789| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2789| Type = [PointerType] int(*)[][] +# 2789| ValueCategory = prvalue # 2789| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion -# 2789| Type = [PointerType] int(*)[][] +# 2789| Type = [PointerType] int(*)[] # 2789| ValueCategory = prvalue # 2789| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion -# 2789| Type = [PointerType] int(*)[] +# 2789| Type = [IntPointerType] int * # 2789| ValueCategory = prvalue # 2789| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) -# 2789| Type = [ArrayType] int[] +# 2789| Type = [IntType] int # 2789| ValueCategory = lvalue -# 2790| getStmt(18): [DeclStmt] declaration -# 2790| getDeclarationEntry(0): [VariableDeclarationEntry] definition of t -# 2790| Type = [CTypedefType,Size_t] size_t -# 2790| getVariable().getInitializer(): [Initializer] initializer for t -# 2790| getExpr(): [SizeofExprOperator] sizeof() -# 2790| Type = [LongType] unsigned long -# 2790| Value = [SizeofExprOperator] 4 -# 2790| ValueCategory = prvalue -# 2790| getExprOperand(): [PointerDereferenceExpr] * ... -# 2790| Type = [IntType] int -# 2790| ValueCategory = lvalue -# 2790| getOperand(): [PointerDereferenceExpr] * ... -# 2790| Type = [ArrayType] int[] -# 2790| ValueCategory = lvalue -# 2790| getOperand(): [PointerDereferenceExpr] * ... -# 2790| Type = [ArrayType] int[][] -# 2790| ValueCategory = lvalue -# 2790| getOperand(): [VariableAccess] tmp3 -# 2790| Type = [ArrayType] int[][][] -# 2790| ValueCategory = lvalue -# 2790| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion -# 2790| Type = [PointerType] int(*)[][] -# 2790| ValueCategory = prvalue -# 2790| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion -# 2790| Type = [PointerType] int(*)[] -# 2790| ValueCategory = prvalue -# 2790| getOperand().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion -# 2790| Type = [IntPointerType] int * -# 2790| ValueCategory = prvalue -# 2790| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) -# 2790| Type = [IntType] int -# 2790| ValueCategory = lvalue -# 2791| getStmt(19): [ReturnStmt] return ... +# 2790| getStmt(19): [ReturnStmt] return ... +# 2792| [TopLevelFunction] void vla_sizeof_test2(int, size_t, char) +# 2792| : +# 2792| getParameter(0): [Parameter] len1 +# 2792| Type = [IntType] int +# 2792| getParameter(1): [Parameter] len2 +# 2792| Type = [CTypedefType,Size_t] size_t +# 2792| getParameter(2): [Parameter] len3 +# 2792| Type = [PlainCharType] char +# 2792| getEntryPoint(): [BlockStmt] { ... } +# 2793| getStmt(0): [DeclStmt] declaration +# 2793| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp1 +# 2793| Type = [ArrayType] int[][] +# 2793| getStmt(1): [VlaDimensionStmt] VLA dimension size +# 2793| getDimensionExpr(): [VariableAccess] len1 +# 2793| Type = [IntType] int +# 2793| ValueCategory = prvalue(load) +# 2793| getStmt(2): [VlaDimensionStmt] VLA dimension size +# 2793| getDimensionExpr(): [VariableAccess] len2 +# 2793| Type = [CTypedefType,Size_t] size_t +# 2793| ValueCategory = prvalue(load) +# 2793| getStmt(3): [VlaDeclStmt] VLA declaration +# 2794| getStmt(4): [DeclStmt] declaration +# 2794| getDeclarationEntry(0): [VariableDeclarationEntry] definition of z +# 2794| Type = [CTypedefType,Size_t] size_t +# 2794| getVariable().getInitializer(): [Initializer] initializer for z +# 2794| getExpr(): [SizeofExprOperator] sizeof() +# 2794| Type = [LongType] unsigned long +# 2794| ValueCategory = prvalue +# 2794| getExprOperand(): [ArrayExpr] access to array +# 2794| Type = [ArrayType] int[] +# 2794| ValueCategory = lvalue +# 2794| getArrayBase(): [VariableAccess] tmp1 +# 2794| Type = [ArrayType] int[][] +# 2794| ValueCategory = lvalue +# 2794| getArrayOffset(): [Literal] 1 +# 2794| Type = [IntType] int +# 2794| Value = [Literal] 1 +# 2794| ValueCategory = prvalue +# 2794| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2794| Type = [PointerType] int(*)[] +# 2794| ValueCategory = prvalue +# 2794| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2794| Type = [ArrayType] int[] +# 2794| ValueCategory = lvalue +# 2795| getStmt(5): [DeclStmt] declaration +# 2795| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp2 +# 2795| Type = [ArrayType] int[][][] +# 2795| getStmt(6): [VlaDimensionStmt] VLA dimension size +# 2795| getDimensionExpr(): [VariableAccess] len1 +# 2795| Type = [IntType] int +# 2795| ValueCategory = prvalue(load) +# 2795| getStmt(7): [VlaDimensionStmt] VLA dimension size +# 2795| getDimensionExpr(): [VariableAccess] len2 +# 2795| Type = [CTypedefType,Size_t] size_t +# 2795| ValueCategory = prvalue(load) +# 2795| getStmt(8): [VlaDimensionStmt] VLA dimension size +# 2795| getDimensionExpr(): [VariableAccess] len3 +# 2795| Type = [PlainCharType] char +# 2795| ValueCategory = prvalue(load) +# 2795| getStmt(9): [VlaDeclStmt] VLA declaration +# 2796| getStmt(10): [DeclStmt] declaration +# 2796| getDeclarationEntry(0): [VariableDeclarationEntry] definition of v +# 2796| Type = [CTypedefType,Size_t] size_t +# 2796| getVariable().getInitializer(): [Initializer] initializer for v +# 2796| getExpr(): [SizeofExprOperator] sizeof() +# 2796| Type = [LongType] unsigned long +# 2796| ValueCategory = prvalue +# 2796| getExprOperand(): [ArrayExpr] access to array +# 2796| Type = [ArrayType] int[][] +# 2796| ValueCategory = lvalue +# 2796| getArrayBase(): [VariableAccess] tmp2 +# 2796| Type = [ArrayType] int[][][] +# 2796| ValueCategory = lvalue +# 2796| getArrayOffset(): [Literal] 1 +# 2796| Type = [IntType] int +# 2796| Value = [Literal] 1 +# 2796| ValueCategory = prvalue +# 2796| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2796| Type = [PointerType] int(*)[][] +# 2796| ValueCategory = prvalue +# 2796| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2796| Type = [ArrayType] int[][] +# 2796| ValueCategory = lvalue +# 2797| getStmt(11): [DeclStmt] declaration +# 2797| getDeclarationEntry(0): [VariableDeclarationEntry] definition of u +# 2797| Type = [CTypedefType,Size_t] size_t +# 2797| getVariable().getInitializer(): [Initializer] initializer for u +# 2797| getExpr(): [SizeofExprOperator] sizeof() +# 2797| Type = [LongType] unsigned long +# 2797| ValueCategory = prvalue +# 2797| getExprOperand(): [ArrayExpr] access to array +# 2797| Type = [ArrayType] int[] +# 2797| ValueCategory = lvalue +# 2797| getArrayBase(): [ArrayExpr] access to array +# 2797| Type = [ArrayType] int[][] +# 2797| ValueCategory = lvalue +# 2797| getArrayBase(): [VariableAccess] tmp2 +# 2797| Type = [ArrayType] int[][][] +# 2797| ValueCategory = lvalue +# 2797| getArrayOffset(): [Literal] 1 +# 2797| Type = [IntType] int +# 2797| Value = [Literal] 1 +# 2797| ValueCategory = prvalue +# 2797| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2797| Type = [PointerType] int(*)[][] +# 2797| ValueCategory = prvalue +# 2797| getArrayOffset(): [Literal] 2 +# 2797| Type = [IntType] int +# 2797| Value = [Literal] 2 +# 2797| ValueCategory = prvalue +# 2797| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2797| Type = [PointerType] int(*)[] +# 2797| ValueCategory = prvalue +# 2797| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2797| Type = [ArrayType] int[] +# 2797| ValueCategory = lvalue +# 2798| getStmt(12): [DeclStmt] declaration +# 2798| getDeclarationEntry(0): [VariableDeclarationEntry] definition of t +# 2798| Type = [CTypedefType,Size_t] size_t +# 2798| getVariable().getInitializer(): [Initializer] initializer for t +# 2798| getExpr(): [SizeofExprOperator] sizeof() +# 2798| Type = [LongType] unsigned long +# 2798| Value = [SizeofExprOperator] 4 +# 2798| ValueCategory = prvalue +# 2798| getExprOperand(): [ArrayExpr] access to array +# 2798| Type = [IntType] int +# 2798| ValueCategory = lvalue +# 2798| getArrayBase(): [ArrayExpr] access to array +# 2798| Type = [ArrayType] int[] +# 2798| ValueCategory = lvalue +# 2798| getArrayBase(): [ArrayExpr] access to array +# 2798| Type = [ArrayType] int[][] +# 2798| ValueCategory = lvalue +# 2798| getArrayBase(): [VariableAccess] tmp2 +# 2798| Type = [ArrayType] int[][][] +# 2798| ValueCategory = lvalue +# 2798| getArrayOffset(): [Literal] 1 +# 2798| Type = [IntType] int +# 2798| Value = [Literal] 1 +# 2798| ValueCategory = prvalue +# 2798| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2798| Type = [PointerType] int(*)[][] +# 2798| ValueCategory = prvalue +# 2798| getArrayOffset(): [Literal] 2 +# 2798| Type = [IntType] int +# 2798| Value = [Literal] 2 +# 2798| ValueCategory = prvalue +# 2798| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2798| Type = [PointerType] int(*)[] +# 2798| ValueCategory = prvalue +# 2798| getArrayOffset(): [Literal] 3 +# 2798| Type = [IntType] int +# 2798| Value = [Literal] 3 +# 2798| ValueCategory = prvalue +# 2798| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2798| Type = [IntPointerType] int * +# 2798| ValueCategory = prvalue +# 2798| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2798| Type = [IntType] int +# 2798| ValueCategory = lvalue +# 2799| getStmt(13): [ReturnStmt] return ... +# 2801| [TopLevelFunction] size_t vla_sizeof_test3(int, size_t, char, bool) +# 2801| : +# 2801| getParameter(0): [Parameter] len1 +# 2801| Type = [IntType] int +# 2801| getParameter(1): [Parameter] len2 +# 2801| Type = [CTypedefType,Size_t] size_t +# 2801| getParameter(2): [Parameter] len3 +# 2801| Type = [PlainCharType] char +# 2801| getParameter(3): [Parameter] b +# 2801| Type = [BoolType] bool +# 2801| getEntryPoint(): [BlockStmt] { ... } +# 2802| getStmt(0): [DeclStmt] declaration +# 2802| getDeclarationEntry(0): [TypeDeclarationEntry] declaration of arr +# 2802| Type = [CTypedefType,LocalTypedefType] arr +# 2802| getStmt(1): [VlaDimensionStmt] VLA dimension size +# 2802| getDimensionExpr(): [VariableAccess] len1 +# 2802| Type = [IntType] int +# 2802| ValueCategory = prvalue(load) +# 2802| getStmt(2): [VlaDimensionStmt] VLA dimension size +# 2802| getDimensionExpr(): [VariableAccess] len2 +# 2802| Type = [CTypedefType,Size_t] size_t +# 2802| ValueCategory = prvalue(load) +# 2802| getStmt(3): [VlaDeclStmt] VLA declaration +# 2803| getStmt(4): [DeclStmt] declaration +# 2803| getDeclarationEntry(0): [TypeDeclarationEntry] declaration of arr2 +# 2803| Type = [CTypedefType,LocalTypedefType] arr2 +# 2803| getStmt(5): [VlaDeclStmt] VLA declaration +# 2804| getStmt(6): [DeclStmt] declaration +# 2804| getDeclarationEntry(0): [TypeDeclarationEntry] declaration of arr3 +# 2804| Type = [CTypedefType,LocalTypedefType] arr3 +# 2804| getStmt(7): [VlaDimensionStmt] VLA dimension size +# 2804| getDimensionExpr(): [VariableAccess] len3 +# 2804| Type = [PlainCharType] char +# 2804| ValueCategory = prvalue(load) +# 2804| getStmt(8): [VlaDeclStmt] VLA declaration +# 2806| getStmt(9): [IfStmt] if (...) ... +# 2806| getCondition(): [VariableAccess] b +# 2806| Type = [BoolType] bool +# 2806| ValueCategory = prvalue(load) +# 2806| getThen(): [BlockStmt] { ... } +# 2807| getStmt(0): [DeclStmt] declaration +# 2807| getDeclarationEntry(0): [VariableDeclarationEntry] definition of tmp +# 2807| Type = [CTypedefType,LocalTypedefType] arr3 +# 2807| getStmt(1): [VlaDeclStmt] VLA declaration +# 2808| getStmt(2): [ReturnStmt] return ... +# 2808| getExpr(): [SizeofExprOperator] sizeof() +# 2808| Type = [LongType] unsigned long +# 2808| ValueCategory = prvalue +# 2808| getExprOperand(): [ArrayExpr] access to array +# 2808| Type = [CTypedefType,LocalTypedefType] arr2 +# 2808| ValueCategory = lvalue +# 2808| getArrayBase(): [VariableAccess] tmp +# 2808| Type = [CTypedefType,LocalTypedefType] arr3 +# 2808| ValueCategory = lvalue +# 2808| getArrayOffset(): [Literal] 1 +# 2808| Type = [IntType] int +# 2808| Value = [Literal] 1 +# 2808| ValueCategory = prvalue +# 2808| getArrayBase().getFullyConverted(): [ArrayToPointerConversion] array to pointer conversion +# 2808| Type = [PointerType] arr2 * +# 2808| ValueCategory = prvalue +# 2808| getExprOperand().getFullyConverted(): [ParenthesisExpr] (...) +# 2808| Type = [CTypedefType,LocalTypedefType] arr2 +# 2808| ValueCategory = lvalue +# 2811| getStmt(10): [ReturnStmt] return ... +# 2811| getExpr(): [Literal] 0 +# 2811| Type = [IntType] int +# 2811| Value = [Literal] 0 +# 2811| ValueCategory = prvalue +# 2811| getExpr().getFullyConverted(): [CStyleCast] (size_t)... +# 2811| Conversion = [IntegralConversion] integral conversion +# 2811| Type = [CTypedefType,Size_t] size_t +# 2811| Value = [CStyleCast] 0 +# 2811| ValueCategory = prvalue ir23.cpp: # 1| [TopLevelFunction] bool consteval_1() # 1| : diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected index a9896a1b3d8..218df42da10 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -20442,63 +20442,128 @@ ir.cpp: # 2779| m2779_8(unsigned long) = InitializeParameter[len2] : &:r2779_7 # 2779| r2779_9(glval) = VariableAddress[len3] : # 2779| m2779_10(char) = InitializeParameter[len3] : &:r2779_9 -# 2781| r2781_1(glval) = VariableAddress[tmp1] : -# 2781| m2781_2(char[]) = Uninitialized[tmp1] : &:r2781_1 -# 2781| r2781_3(glval) = VariableAddress[len1] : -# 2781| r2781_4(int) = Load[len1] : &:r2781_3, m2779_6 -# 2781| v2781_5(void) = NoOp : -# 2782| r2782_1(glval) = VariableAddress[x] : -# 2782| r2782_2(unsigned long) = Constant[1] : -# 2782| r2782_3(unsigned long) = Mul : r2782_2, r2781_4 -# 2782| m2782_4(unsigned long) = Store[x] : &:r2782_1, r2782_3 -# 2783| r2783_1(glval) = VariableAddress[tmp2] : -# 2783| m2783_2(int[][]) = Uninitialized[tmp2] : &:r2783_1 -# 2783| r2783_3(glval) = VariableAddress[len1] : -# 2783| r2783_4(int) = Load[len1] : &:r2783_3, m2779_6 -# 2783| r2783_5(glval) = VariableAddress[len2] : -# 2783| r2783_6(unsigned long) = Load[len2] : &:r2783_5, m2779_8 -# 2783| v2783_7(void) = NoOp : -# 2784| r2784_1(glval) = VariableAddress[y] : +# 2780| r2780_1(glval) = VariableAddress[tmp1] : +# 2780| m2780_2(char[]) = Uninitialized[tmp1] : &:r2780_1 +# 2780| r2780_3(glval) = VariableAddress[len1] : +# 2780| r2780_4(int) = Load[len1] : &:r2780_3, m2779_6 +# 2780| v2780_5(void) = NoOp : +# 2781| r2781_1(glval) = VariableAddress[x] : +# 2781| r2781_2(unsigned long) = Constant[1] : +# 2781| r2781_3(unsigned long) = Mul : r2781_2, r2780_4 +# 2781| m2781_4(unsigned long) = Store[x] : &:r2781_1, r2781_3 +# 2782| r2782_1(glval) = VariableAddress[tmp2] : +# 2782| m2782_2(int[][]) = Uninitialized[tmp2] : &:r2782_1 +# 2782| r2782_3(glval) = VariableAddress[len1] : +# 2782| r2782_4(int) = Load[len1] : &:r2782_3, m2779_6 +# 2782| r2782_5(glval) = VariableAddress[len2] : +# 2782| r2782_6(unsigned long) = Load[len2] : &:r2782_5, m2779_8 +# 2782| v2782_7(void) = NoOp : +# 2783| r2783_1(glval) = VariableAddress[y] : +# 2783| r2783_2(unsigned long) = Constant[4] : +# 2783| r2783_3(unsigned long) = Mul : r2783_2, r2782_4 +# 2783| r2783_4(unsigned long) = Mul : r2783_3, r2782_6 +# 2783| m2783_5(unsigned long) = Store[y] : &:r2783_1, r2783_4 +# 2784| r2784_1(glval) = VariableAddress[z] : # 2784| r2784_2(unsigned long) = Constant[4] : -# 2784| r2784_3(unsigned long) = Mul : r2784_2, r2783_4 -# 2784| r2784_4(unsigned long) = Mul : r2784_3, r2783_6 -# 2784| m2784_5(unsigned long) = Store[y] : &:r2784_1, r2784_4 -# 2785| r2785_1(glval) = VariableAddress[z] : -# 2785| r2785_2(unsigned long) = Constant[4] : -# 2785| r2785_3(unsigned long) = Mul : r2785_2, r2783_6 -# 2785| m2785_4(unsigned long) = Store[z] : &:r2785_1, r2785_3 -# 2786| r2786_1(glval) = VariableAddress[tmp3] : -# 2786| m2786_2(int[][][]) = Uninitialized[tmp3] : &:r2786_1 -# 2786| r2786_3(glval) = VariableAddress[len1] : -# 2786| r2786_4(int) = Load[len1] : &:r2786_3, m2779_6 -# 2786| r2786_5(glval) = VariableAddress[len2] : -# 2786| r2786_6(unsigned long) = Load[len2] : &:r2786_5, m2779_8 -# 2786| r2786_7(glval) = VariableAddress[len3] : -# 2786| r2786_8(char) = Load[len3] : &:r2786_7, m2779_10 -# 2786| v2786_9(void) = NoOp : -# 2787| r2787_1(glval) = VariableAddress[w] : +# 2784| r2784_3(unsigned long) = Mul : r2784_2, r2782_6 +# 2784| m2784_4(unsigned long) = Store[z] : &:r2784_1, r2784_3 +# 2785| r2785_1(glval) = VariableAddress[tmp3] : +# 2785| m2785_2(int[][][]) = Uninitialized[tmp3] : &:r2785_1 +# 2785| r2785_3(glval) = VariableAddress[len1] : +# 2785| r2785_4(int) = Load[len1] : &:r2785_3, m2779_6 +# 2785| r2785_5(glval) = VariableAddress[len2] : +# 2785| r2785_6(unsigned long) = Load[len2] : &:r2785_5, m2779_8 +# 2785| r2785_7(glval) = VariableAddress[len3] : +# 2785| r2785_8(char) = Load[len3] : &:r2785_7, m2779_10 +# 2785| v2785_9(void) = NoOp : +# 2786| r2786_1(glval) = VariableAddress[w] : +# 2786| r2786_2(unsigned long) = Constant[4] : +# 2786| r2786_3(unsigned long) = Mul : r2786_2, r2785_4 +# 2786| r2786_4(unsigned long) = Mul : r2786_3, r2785_6 +# 2786| r2786_5(unsigned long) = Mul : r2786_4, r2785_8 +# 2786| m2786_6(unsigned long) = Store[w] : &:r2786_1, r2786_5 +# 2787| r2787_1(glval) = VariableAddress[v] : # 2787| r2787_2(unsigned long) = Constant[4] : -# 2787| r2787_3(unsigned long) = Mul : r2787_2, r2786_4 -# 2787| r2787_4(unsigned long) = Mul : r2787_3, r2786_6 -# 2787| r2787_5(unsigned long) = Mul : r2787_4, r2786_8 -# 2787| m2787_6(unsigned long) = Store[w] : &:r2787_1, r2787_5 -# 2788| r2788_1(glval) = VariableAddress[v] : +# 2787| r2787_3(unsigned long) = Mul : r2787_2, r2785_6 +# 2787| r2787_4(unsigned long) = Mul : r2787_3, r2785_8 +# 2787| m2787_5(unsigned long) = Store[v] : &:r2787_1, r2787_4 +# 2788| r2788_1(glval) = VariableAddress[u] : # 2788| r2788_2(unsigned long) = Constant[4] : -# 2788| r2788_3(unsigned long) = Mul : r2788_2, r2786_6 -# 2788| r2788_4(unsigned long) = Mul : r2788_3, r2786_8 -# 2788| m2788_5(unsigned long) = Store[v] : &:r2788_1, r2788_4 -# 2789| r2789_1(glval) = VariableAddress[u] : +# 2788| r2788_3(unsigned long) = Mul : r2788_2, r2785_8 +# 2788| m2788_4(unsigned long) = Store[u] : &:r2788_1, r2788_3 +# 2789| r2789_1(glval) = VariableAddress[t] : # 2789| r2789_2(unsigned long) = Constant[4] : -# 2789| r2789_3(unsigned long) = Mul : r2789_2, r2786_8 -# 2789| m2789_4(unsigned long) = Store[u] : &:r2789_1, r2789_3 -# 2790| r2790_1(glval) = VariableAddress[t] : -# 2790| r2790_2(unsigned long) = Constant[4] : -# 2790| m2790_3(unsigned long) = Store[t] : &:r2790_1, r2790_2 -# 2791| v2791_1(void) = NoOp : +# 2789| m2789_3(unsigned long) = Store[t] : &:r2789_1, r2789_2 +# 2790| v2790_1(void) = NoOp : # 2779| v2779_11(void) = ReturnVoid : # 2779| v2779_12(void) = AliasedUse : m2779_3 # 2779| v2779_13(void) = ExitFunction : +# 2792| void vla_sizeof_test2(int, size_t, char) +# 2792| Block 0 +# 2792| v2792_1(void) = EnterFunction : +# 2792| m2792_2(unknown) = AliasedDefinition : +# 2792| m2792_3(unknown) = InitializeNonLocal : +# 2792| m2792_4(unknown) = Chi : total:m2792_2, partial:m2792_3 +# 2792| r2792_5(glval) = VariableAddress[len1] : +# 2792| m2792_6(int) = InitializeParameter[len1] : &:r2792_5 +# 2792| r2792_7(glval) = VariableAddress[len2] : +# 2792| m2792_8(unsigned long) = InitializeParameter[len2] : &:r2792_7 +# 2792| r2792_9(glval) = VariableAddress[len3] : +# 2792| m2792_10(char) = InitializeParameter[len3] : &:r2792_9 +# 2793| r2793_1(glval) = VariableAddress[tmp1] : +# 2793| m2793_2(int[][]) = Uninitialized[tmp1] : &:r2793_1 +# 2793| r2793_3(glval) = VariableAddress[len1] : +# 2793| r2793_4(int) = Load[len1] : &:r2793_3, m2792_6 +# 2793| r2793_5(glval) = VariableAddress[len2] : +# 2793| r2793_6(unsigned long) = Load[len2] : &:r2793_5, m2792_8 +# 2793| v2793_7(void) = NoOp : +# 2794| r2794_1(glval) = VariableAddress[z] : + +# 2801| size_t vla_sizeof_test3(int, size_t, char, bool) +# 2801| Block 0 +# 2801| v2801_1(void) = EnterFunction : +# 2801| m2801_2(unknown) = AliasedDefinition : +# 2801| m2801_3(unknown) = InitializeNonLocal : +# 2801| m2801_4(unknown) = Chi : total:m2801_2, partial:m2801_3 +# 2801| r2801_5(glval) = VariableAddress[len1] : +# 2801| m2801_6(int) = InitializeParameter[len1] : &:r2801_5 +# 2801| r2801_7(glval) = VariableAddress[len2] : +# 2801| m2801_8(unsigned long) = InitializeParameter[len2] : &:r2801_7 +# 2801| r2801_9(glval) = VariableAddress[len3] : +# 2801| m2801_10(char) = InitializeParameter[len3] : &:r2801_9 +# 2801| r2801_11(glval) = VariableAddress[b] : +# 2801| m2801_12(bool) = InitializeParameter[b] : &:r2801_11 +# 2802| r2802_1(glval) = VariableAddress[len1] : +# 2802| r2802_2(int) = Load[len1] : &:r2802_1, m2801_6 +# 2802| r2802_3(glval) = VariableAddress[len2] : +# 2802| r2802_4(unsigned long) = Load[len2] : &:r2802_3, m2801_8 +# 2802| v2802_5(void) = NoOp : +# 2803| v2803_1(void) = NoOp : +# 2804| r2804_1(glval) = VariableAddress[len3] : +# 2804| r2804_2(char) = Load[len3] : &:r2804_1, m2801_10 +# 2804| v2804_3(void) = NoOp : +# 2806| r2806_1(glval) = VariableAddress[b] : +# 2806| r2806_2(bool) = Load[b] : &:r2806_1, m2801_12 +# 2806| v2806_3(void) = ConditionalBranch : r2806_2 +#-----| False -> Block 2 +#-----| True -> Block 1 + +# 2807| Block 1 +# 2807| r2807_1(glval) = VariableAddress[tmp] : +# 2807| m2807_2(long[][][]) = Uninitialized[tmp] : &:r2807_1 +# 2807| v2807_3(void) = NoOp : +# 2808| r2808_1(glval) = VariableAddress[#return] : + +# 2811| Block 2 +# 2811| r2811_1(glval) = VariableAddress[#return] : +# 2811| r2811_2(unsigned long) = Constant[0] : +# 2811| m2811_3(unsigned long) = Store[#return] : &:r2811_1, r2811_2 +# 2801| r2801_13(glval) = VariableAddress[#return] : +# 2801| v2801_14(void) = ReturnValue : &:r2801_13, m2811_3 +# 2801| v2801_15(void) = AliasedUse : m2801_3 +# 2801| v2801_16(void) = ExitFunction : + ir23.cpp: # 1| bool consteval_1() # 1| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected index b83d9ea47e3..12feac2ecd2 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency.expected @@ -6,6 +6,8 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| 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) | +| 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) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected index b83d9ea47e3..12feac2ecd2 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ssa_consistency_unsound.expected @@ -6,6 +6,8 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| 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) | +| 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) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/ir.cpp b/cpp/ql/test/library-tests/ir/ir/ir.cpp index b4fb243ecdf..be0e1904374 100644 --- a/cpp/ql/test/library-tests/ir/ir/ir.cpp +++ b/cpp/ql/test/library-tests/ir/ir/ir.cpp @@ -2776,8 +2776,7 @@ void test_allocation_with_initializer() { long* p2 = new long(42); } -void vla_sizeof_test(int len1, size_t len2, char len3) -{ +void vla_sizeof_test(int len1, size_t len2, char len3) { char tmp1[len1]; size_t x = sizeof(tmp1); int tmp2[len1][len2]; @@ -2790,4 +2789,26 @@ void vla_sizeof_test(int len1, size_t len2, char len3) size_t t = sizeof(***tmp3); } +void vla_sizeof_test2(int len1, size_t len2, char len3) { + int tmp1[len1][len2]; + size_t z = sizeof(tmp1[1]); + int tmp2[len1][len2][len3]; + size_t v = sizeof(tmp2[1]); + size_t u = sizeof(tmp2[1][2]); + size_t t = sizeof(tmp2[1][2][3]); +} + +size_t vla_sizeof_test3(int len1, size_t len2, char len3, bool b) { + typedef long arr[len1][len2]; + typedef arr arr2; + typedef arr2 arr3[len3]; + + if (b) { + arr3 tmp; + return sizeof(tmp[1]); + } + + return 0; +} + // semmle-extractor-options: -std=c++20 --clang diff --git a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected index e30106d3520..e47bac20c76 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_consistency.expected @@ -1,4 +1,8 @@ missingOperand +| ir.cpp:2794:14:2794:28 | Store: sizeof() | 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) | +| ir.cpp:2796:14:2796:28 | Store: sizeof() | 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) | +| ir.cpp:2797:14:2797:31 | Store: sizeof() | 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) | +| ir.cpp:2808:12:2808:25 | Store: sizeof() | 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) | unexpectedOperand duplicateOperand missingPhiOperand @@ -6,6 +10,10 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| 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) | +| 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) | +| 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) | +| 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) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction @@ -21,6 +29,10 @@ lostReachability backEdgeCountMismatch useNotDominatedByDefinition | 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() | +| 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) | +| 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) | +| 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) | +| 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) | switchInstructionWithoutDefaultEdge notMarkedAsConflated wronglyMarkedAsConflated diff --git a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected index 5b696e8460f..e312083ab55 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -18588,63 +18588,160 @@ ir.cpp: # 2779| mu2779_7(unsigned long) = InitializeParameter[len2] : &:r2779_6 # 2779| r2779_8(glval) = VariableAddress[len3] : # 2779| mu2779_9(char) = InitializeParameter[len3] : &:r2779_8 -# 2781| r2781_1(glval) = VariableAddress[tmp1] : -# 2781| mu2781_2(char[]) = Uninitialized[tmp1] : &:r2781_1 -# 2781| r2781_3(glval) = VariableAddress[len1] : -# 2781| r2781_4(int) = Load[len1] : &:r2781_3, ~m? -# 2781| v2781_5(void) = NoOp : -# 2782| r2782_1(glval) = VariableAddress[x] : -# 2782| r2782_2(unsigned long) = Constant[1] : -# 2782| r2782_3(unsigned long) = Mul : r2782_2, r2781_4 -# 2782| mu2782_4(unsigned long) = Store[x] : &:r2782_1, r2782_3 -# 2783| r2783_1(glval) = VariableAddress[tmp2] : -# 2783| mu2783_2(int[][]) = Uninitialized[tmp2] : &:r2783_1 -# 2783| r2783_3(glval) = VariableAddress[len1] : -# 2783| r2783_4(int) = Load[len1] : &:r2783_3, ~m? -# 2783| r2783_5(glval) = VariableAddress[len2] : -# 2783| r2783_6(unsigned long) = Load[len2] : &:r2783_5, ~m? -# 2783| v2783_7(void) = NoOp : -# 2784| r2784_1(glval) = VariableAddress[y] : +# 2780| r2780_1(glval) = VariableAddress[tmp1] : +# 2780| mu2780_2(char[]) = Uninitialized[tmp1] : &:r2780_1 +# 2780| r2780_3(glval) = VariableAddress[len1] : +# 2780| r2780_4(int) = Load[len1] : &:r2780_3, ~m? +# 2780| v2780_5(void) = NoOp : +# 2781| r2781_1(glval) = VariableAddress[x] : +# 2781| r2781_2(unsigned long) = Constant[1] : +# 2781| r2781_3(unsigned long) = Mul : r2781_2, r2780_4 +# 2781| mu2781_4(unsigned long) = Store[x] : &:r2781_1, r2781_3 +# 2782| r2782_1(glval) = VariableAddress[tmp2] : +# 2782| mu2782_2(int[][]) = Uninitialized[tmp2] : &:r2782_1 +# 2782| r2782_3(glval) = VariableAddress[len1] : +# 2782| r2782_4(int) = Load[len1] : &:r2782_3, ~m? +# 2782| r2782_5(glval) = VariableAddress[len2] : +# 2782| r2782_6(unsigned long) = Load[len2] : &:r2782_5, ~m? +# 2782| v2782_7(void) = NoOp : +# 2783| r2783_1(glval) = VariableAddress[y] : +# 2783| r2783_2(unsigned long) = Constant[4] : +# 2783| r2783_3(unsigned long) = Mul : r2783_2, r2782_4 +# 2783| r2783_4(unsigned long) = Mul : r2783_3, r2782_6 +# 2783| mu2783_5(unsigned long) = Store[y] : &:r2783_1, r2783_4 +# 2784| r2784_1(glval) = VariableAddress[z] : # 2784| r2784_2(unsigned long) = Constant[4] : -# 2784| r2784_3(unsigned long) = Mul : r2784_2, r2783_4 -# 2784| r2784_4(unsigned long) = Mul : r2784_3, r2783_6 -# 2784| mu2784_5(unsigned long) = Store[y] : &:r2784_1, r2784_4 -# 2785| r2785_1(glval) = VariableAddress[z] : -# 2785| r2785_2(unsigned long) = Constant[4] : -# 2785| r2785_3(unsigned long) = Mul : r2785_2, r2783_6 -# 2785| mu2785_4(unsigned long) = Store[z] : &:r2785_1, r2785_3 -# 2786| r2786_1(glval) = VariableAddress[tmp3] : -# 2786| mu2786_2(int[][][]) = Uninitialized[tmp3] : &:r2786_1 -# 2786| r2786_3(glval) = VariableAddress[len1] : -# 2786| r2786_4(int) = Load[len1] : &:r2786_3, ~m? -# 2786| r2786_5(glval) = VariableAddress[len2] : -# 2786| r2786_6(unsigned long) = Load[len2] : &:r2786_5, ~m? -# 2786| r2786_7(glval) = VariableAddress[len3] : -# 2786| r2786_8(char) = Load[len3] : &:r2786_7, ~m? -# 2786| v2786_9(void) = NoOp : -# 2787| r2787_1(glval) = VariableAddress[w] : +# 2784| r2784_3(unsigned long) = Mul : r2784_2, r2782_6 +# 2784| mu2784_4(unsigned long) = Store[z] : &:r2784_1, r2784_3 +# 2785| r2785_1(glval) = VariableAddress[tmp3] : +# 2785| mu2785_2(int[][][]) = Uninitialized[tmp3] : &:r2785_1 +# 2785| r2785_3(glval) = VariableAddress[len1] : +# 2785| r2785_4(int) = Load[len1] : &:r2785_3, ~m? +# 2785| r2785_5(glval) = VariableAddress[len2] : +# 2785| r2785_6(unsigned long) = Load[len2] : &:r2785_5, ~m? +# 2785| r2785_7(glval) = VariableAddress[len3] : +# 2785| r2785_8(char) = Load[len3] : &:r2785_7, ~m? +# 2785| v2785_9(void) = NoOp : +# 2786| r2786_1(glval) = VariableAddress[w] : +# 2786| r2786_2(unsigned long) = Constant[4] : +# 2786| r2786_3(unsigned long) = Mul : r2786_2, r2785_4 +# 2786| r2786_4(unsigned long) = Mul : r2786_3, r2785_6 +# 2786| r2786_5(unsigned long) = Mul : r2786_4, r2785_8 +# 2786| mu2786_6(unsigned long) = Store[w] : &:r2786_1, r2786_5 +# 2787| r2787_1(glval) = VariableAddress[v] : # 2787| r2787_2(unsigned long) = Constant[4] : -# 2787| r2787_3(unsigned long) = Mul : r2787_2, r2786_4 -# 2787| r2787_4(unsigned long) = Mul : r2787_3, r2786_6 -# 2787| r2787_5(unsigned long) = Mul : r2787_4, r2786_8 -# 2787| mu2787_6(unsigned long) = Store[w] : &:r2787_1, r2787_5 -# 2788| r2788_1(glval) = VariableAddress[v] : +# 2787| r2787_3(unsigned long) = Mul : r2787_2, r2785_6 +# 2787| r2787_4(unsigned long) = Mul : r2787_3, r2785_8 +# 2787| mu2787_5(unsigned long) = Store[v] : &:r2787_1, r2787_4 +# 2788| r2788_1(glval) = VariableAddress[u] : # 2788| r2788_2(unsigned long) = Constant[4] : -# 2788| r2788_3(unsigned long) = Mul : r2788_2, r2786_6 -# 2788| r2788_4(unsigned long) = Mul : r2788_3, r2786_8 -# 2788| mu2788_5(unsigned long) = Store[v] : &:r2788_1, r2788_4 -# 2789| r2789_1(glval) = VariableAddress[u] : +# 2788| r2788_3(unsigned long) = Mul : r2788_2, r2785_8 +# 2788| mu2788_4(unsigned long) = Store[u] : &:r2788_1, r2788_3 +# 2789| r2789_1(glval) = VariableAddress[t] : # 2789| r2789_2(unsigned long) = Constant[4] : -# 2789| r2789_3(unsigned long) = Mul : r2789_2, r2786_8 -# 2789| mu2789_4(unsigned long) = Store[u] : &:r2789_1, r2789_3 -# 2790| r2790_1(glval) = VariableAddress[t] : -# 2790| r2790_2(unsigned long) = Constant[4] : -# 2790| mu2790_3(unsigned long) = Store[t] : &:r2790_1, r2790_2 -# 2791| v2791_1(void) = NoOp : +# 2789| mu2789_3(unsigned long) = Store[t] : &:r2789_1, r2789_2 +# 2790| v2790_1(void) = NoOp : # 2779| v2779_10(void) = ReturnVoid : # 2779| v2779_11(void) = AliasedUse : ~m? # 2779| v2779_12(void) = ExitFunction : +# 2792| void vla_sizeof_test2(int, size_t, char) +# 2792| Block 0 +# 2792| v2792_1(void) = EnterFunction : +# 2792| mu2792_2(unknown) = AliasedDefinition : +# 2792| mu2792_3(unknown) = InitializeNonLocal : +# 2792| r2792_4(glval) = VariableAddress[len1] : +# 2792| mu2792_5(int) = InitializeParameter[len1] : &:r2792_4 +# 2792| r2792_6(glval) = VariableAddress[len2] : +# 2792| mu2792_7(unsigned long) = InitializeParameter[len2] : &:r2792_6 +# 2792| r2792_8(glval) = VariableAddress[len3] : +# 2792| mu2792_9(char) = InitializeParameter[len3] : &:r2792_8 +# 2793| r2793_1(glval) = VariableAddress[tmp1] : +# 2793| mu2793_2(int[][]) = Uninitialized[tmp1] : &:r2793_1 +# 2793| r2793_3(glval) = VariableAddress[len1] : +# 2793| r2793_4(int) = Load[len1] : &:r2793_3, ~m? +# 2793| r2793_5(glval) = VariableAddress[len2] : +# 2793| r2793_6(unsigned long) = Load[len2] : &:r2793_5, ~m? +# 2793| v2793_7(void) = NoOp : +# 2794| r2794_1(glval) = VariableAddress[z] : + +# 2794| Block 1 +# 2794| mu2794_2(unsigned long) = Store[z] : &:r2794_1 +# 2795| r2795_1(glval) = VariableAddress[tmp2] : +# 2795| mu2795_2(int[][][]) = Uninitialized[tmp2] : &:r2795_1 +# 2795| r2795_3(glval) = VariableAddress[len1] : +# 2795| r2795_4(int) = Load[len1] : &:r2795_3, ~m? +# 2795| r2795_5(glval) = VariableAddress[len2] : +# 2795| r2795_6(unsigned long) = Load[len2] : &:r2795_5, ~m? +# 2795| r2795_7(glval) = VariableAddress[len3] : +# 2795| r2795_8(char) = Load[len3] : &:r2795_7, ~m? +# 2795| v2795_9(void) = NoOp : +# 2796| r2796_1(glval) = VariableAddress[v] : + +# 2796| Block 2 +# 2796| mu2796_2(unsigned long) = Store[v] : &:r2796_1 +# 2797| r2797_1(glval) = VariableAddress[u] : + +# 2797| Block 3 +# 2797| mu2797_2(unsigned long) = Store[u] : &:r2797_1 +# 2798| r2798_1(glval) = VariableAddress[t] : +# 2798| r2798_2(unsigned long) = Constant[4] : +# 2798| mu2798_3(unsigned long) = Store[t] : &:r2798_1, r2798_2 +# 2799| v2799_1(void) = NoOp : +# 2792| v2792_10(void) = ReturnVoid : +# 2792| v2792_11(void) = AliasedUse : ~m? +# 2792| v2792_12(void) = ExitFunction : + +# 2801| size_t vla_sizeof_test3(int, size_t, char, bool) +# 2801| Block 0 +# 2801| v2801_1(void) = EnterFunction : +# 2801| mu2801_2(unknown) = AliasedDefinition : +# 2801| mu2801_3(unknown) = InitializeNonLocal : +# 2801| r2801_4(glval) = VariableAddress[len1] : +# 2801| mu2801_5(int) = InitializeParameter[len1] : &:r2801_4 +# 2801| r2801_6(glval) = VariableAddress[len2] : +# 2801| mu2801_7(unsigned long) = InitializeParameter[len2] : &:r2801_6 +# 2801| r2801_8(glval) = VariableAddress[len3] : +# 2801| mu2801_9(char) = InitializeParameter[len3] : &:r2801_8 +# 2801| r2801_10(glval) = VariableAddress[b] : +# 2801| mu2801_11(bool) = InitializeParameter[b] : &:r2801_10 +# 2802| r2802_1(glval) = VariableAddress[len1] : +# 2802| r2802_2(int) = Load[len1] : &:r2802_1, ~m? +# 2802| r2802_3(glval) = VariableAddress[len2] : +# 2802| r2802_4(unsigned long) = Load[len2] : &:r2802_3, ~m? +# 2802| v2802_5(void) = NoOp : +# 2803| v2803_1(void) = NoOp : +# 2804| r2804_1(glval) = VariableAddress[len3] : +# 2804| r2804_2(char) = Load[len3] : &:r2804_1, ~m? +# 2804| v2804_3(void) = NoOp : +# 2806| r2806_1(glval) = VariableAddress[b] : +# 2806| r2806_2(bool) = Load[b] : &:r2806_1, ~m? +# 2806| v2806_3(void) = ConditionalBranch : r2806_2 +#-----| False -> Block 4 +#-----| True -> Block 2 + +# 2801| Block 1 +# 2801| r2801_12(glval) = VariableAddress[#return] : +# 2801| v2801_13(void) = ReturnValue : &:r2801_12, ~m? +# 2801| v2801_14(void) = AliasedUse : ~m? +# 2801| v2801_15(void) = ExitFunction : + +# 2807| Block 2 +# 2807| r2807_1(glval) = VariableAddress[tmp] : +# 2807| mu2807_2(long[][][]) = Uninitialized[tmp] : &:r2807_1 +# 2807| v2807_3(void) = NoOp : +# 2808| r2808_1(glval) = VariableAddress[#return] : + +# 2808| Block 3 +# 2808| mu2808_2(unsigned long) = Store[#return] : &:r2808_1 +#-----| Goto -> Block 1 + +# 2811| Block 4 +# 2811| r2811_1(glval) = VariableAddress[#return] : +# 2811| r2811_2(unsigned long) = Constant[0] : +# 2811| mu2811_3(unsigned long) = Store[#return] : &:r2811_1, r2811_2 +#-----| Goto -> Block 1 + ir23.cpp: # 1| bool consteval_1() # 1| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected index b83d9ea47e3..12feac2ecd2 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency.expected @@ -6,6 +6,8 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| 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) | +| 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) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction diff --git a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected index b83d9ea47e3..12feac2ecd2 100644 --- a/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected +++ b/cpp/ql/test/library-tests/ir/ir/unaliased_ssa_consistency_unsound.expected @@ -6,6 +6,8 @@ missingOperandType duplicateChiOperand sideEffectWithoutPrimary instructionWithoutSuccessor +| 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) | +| 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) | ambiguousSuccessors unexplainedLoop unnecessaryPhiInstruction