From 59db802fa42fe0ca5fb8c86d6a8d1ffbf92e8311 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Sat, 3 Aug 2024 21:16:44 +0200 Subject: [PATCH 1/3] C++ Add test showing incorrect value categories for `_Generic`s --- .../library-tests/ir/ir/PrintAST.expected | 34 +++++++++++++++++++ .../library-tests/ir/ir/aliased_ir.expected | 24 +++++++++++++ cpp/ql/test/library-tests/ir/ir/generic.c | 6 ++++ .../test/library-tests/ir/ir/raw_ir.expected | 22 ++++++++++++ 4 files changed, 86 insertions(+) create mode 100644 cpp/ql/test/library-tests/ir/ir/generic.c diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 7f7a47459820..8ea85f4b4d35 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -4179,6 +4179,40 @@ destructors_for_temps.cpp: # 103| Type = [IntType] int # 103| ValueCategory = prvalue # 104| getStmt(1): [ReturnStmt] return ... +generic.c: +# 1| [TopLevelFunction] void foo(unsigned int, int) +# 1| : +# 1| getParameter(0): [Parameter] x +# 1| Type = [IntType] unsigned int +# 1| getParameter(1): [Parameter] y +# 1| Type = [IntType] int +# 1| getEntryPoint(): [BlockStmt] { ... } +# 2| getStmt(0): [DeclStmt] declaration +# 2| getDeclarationEntry(0): [VariableDeclarationEntry] definition of r +# 2| Type = [IntType] unsigned int +# 3| getStmt(1): [ExprStmt] ExprStmt +# 3| getExpr(): [AssignExpr] ... = ... +# 3| Type = [IntType] unsigned int +# 3| ValueCategory = prvalue +# 3| getLValue(): [VariableAccess] r +# 3| Type = [IntType] unsigned int +# 3| ValueCategory = lvalue +# 3| getRValue(): [AddExpr] ... + ... +# 3| Type = [IntType] unsigned int +# 3| ValueCategory = prvalue +# 3| getLeftOperand(): [VariableAccess] x +# 3| Type = [IntType] unsigned int +# 3| ValueCategory = lvalue +# 3| getRightOperand(): [Literal] 1 +# 3| Type = [IntType] int +# 3| Value = [Literal] 1 +# 3| ValueCategory = prvalue +# 3| getRightOperand().getFullyConverted(): [CStyleCast] (unsigned int)... +# 3| Conversion = [IntegralConversion] integral conversion +# 3| Type = [IntType] unsigned int +# 3| Value = [CStyleCast] 1 +# 3| ValueCategory = prvalue +# 4| getStmt(2): [ReturnStmt] return ... ir.c: # 5| [TopLevelFunction] int getX(MyCoords*) # 5| : 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 1dc8dbe70145..abf385a27d3b 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -2958,6 +2958,30 @@ destructors_for_temps.cpp: # 102| v102_9(void) = AliasedUse : ~m103_26 # 102| v102_10(void) = ExitFunction : +generic.c: +# 1| void foo(unsigned int, int) +# 1| Block 0 +# 1| v1_1(void) = EnterFunction : +# 1| m1_2(unknown) = AliasedDefinition : +# 1| m1_3(unknown) = InitializeNonLocal : +# 1| m1_4(unknown) = Chi : total:m1_2, partial:m1_3 +# 1| r1_5(glval) = VariableAddress[x] : +# 1| m1_6(unsigned int) = InitializeParameter[x] : &:r1_5 +# 1| m1_7(unknown) = Chi : total:m1_4, partial:m1_6 +# 1| r1_8(glval) = VariableAddress[y] : +# 1| m1_9(int) = InitializeParameter[y] : &:r1_8 +# 2| r2_1(glval) = VariableAddress[r] : +# 2| m2_2(unsigned int) = Uninitialized[r] : &:r2_1 +# 3| r3_1(glval) = VariableAddress[x] : +# 3| r3_2(unsigned int) = Constant[1] : +# 3| r3_3(unsigned int) = Add : r3_1, r3_2 +# 3| r3_4(glval) = VariableAddress[r] : +# 3| m3_5(unsigned int) = Store[r] : &:r3_4, r3_3 +# 4| v4_1(void) = NoOp : +# 1| v1_10(void) = ReturnVoid : +# 1| v1_11(void) = AliasedUse : m1_3 +# 1| v1_12(void) = ExitFunction : + ir.c: # 7| void MyCoordsTest(int) # 7| Block 0 diff --git a/cpp/ql/test/library-tests/ir/ir/generic.c b/cpp/ql/test/library-tests/ir/ir/generic.c new file mode 100644 index 000000000000..daa6756b7769 --- /dev/null +++ b/cpp/ql/test/library-tests/ir/ir/generic.c @@ -0,0 +1,6 @@ +void foo(unsigned int x, int y) { + unsigned int r; + r = _Generic(r, unsigned int: x, int: y) + 1; +} + +// // semmle-extractor-options: -std=c11 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 706606a19180..931ad5edddcf 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -2732,6 +2732,28 @@ destructors_for_temps.cpp: # 102| v102_7(void) = AliasedUse : ~m? # 102| v102_8(void) = ExitFunction : +generic.c: +# 1| void foo(unsigned int, int) +# 1| Block 0 +# 1| v1_1(void) = EnterFunction : +# 1| mu1_2(unknown) = AliasedDefinition : +# 1| mu1_3(unknown) = InitializeNonLocal : +# 1| r1_4(glval) = VariableAddress[x] : +# 1| mu1_5(unsigned int) = InitializeParameter[x] : &:r1_4 +# 1| r1_6(glval) = VariableAddress[y] : +# 1| mu1_7(int) = InitializeParameter[y] : &:r1_6 +# 2| r2_1(glval) = VariableAddress[r] : +# 2| mu2_2(unsigned int) = Uninitialized[r] : &:r2_1 +# 3| r3_1(glval) = VariableAddress[x] : +# 3| r3_2(unsigned int) = Constant[1] : +# 3| r3_3(unsigned int) = Add : r3_1, r3_2 +# 3| r3_4(glval) = VariableAddress[r] : +# 3| mu3_5(unsigned int) = Store[r] : &:r3_4, r3_3 +# 4| v4_1(void) = NoOp : +# 1| v1_8(void) = ReturnVoid : +# 1| v1_9(void) = AliasedUse : ~m? +# 1| v1_10(void) = ExitFunction : + ir.c: # 7| void MyCoordsTest(int) # 7| Block 0 From bfae86e9e80afc95b6f91b3e6845b2c18e8fcb8a Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Sat, 3 Aug 2024 21:25:37 +0200 Subject: [PATCH 2/3] C++: Update test after extractor fix --- .../library-tests/ir/ir/PrintAST.expected | 2 +- .../library-tests/ir/ir/aliased_ir.expected | 20 +++++++++---------- .../test/library-tests/ir/ir/raw_ir.expected | 9 +++++---- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index 8ea85f4b4d35..fc50aec4afa2 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -4202,7 +4202,7 @@ generic.c: # 3| ValueCategory = prvalue # 3| getLeftOperand(): [VariableAccess] x # 3| Type = [IntType] unsigned int -# 3| ValueCategory = lvalue +# 3| ValueCategory = prvalue(load) # 3| getRightOperand(): [Literal] 1 # 3| Type = [IntType] int # 3| Value = [Literal] 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 abf385a27d3b..63062d5c980f 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -2967,20 +2967,20 @@ generic.c: # 1| m1_4(unknown) = Chi : total:m1_2, partial:m1_3 # 1| r1_5(glval) = VariableAddress[x] : # 1| m1_6(unsigned int) = InitializeParameter[x] : &:r1_5 -# 1| m1_7(unknown) = Chi : total:m1_4, partial:m1_6 -# 1| r1_8(glval) = VariableAddress[y] : -# 1| m1_9(int) = InitializeParameter[y] : &:r1_8 +# 1| r1_7(glval) = VariableAddress[y] : +# 1| m1_8(int) = InitializeParameter[y] : &:r1_7 # 2| r2_1(glval) = VariableAddress[r] : # 2| m2_2(unsigned int) = Uninitialized[r] : &:r2_1 # 3| r3_1(glval) = VariableAddress[x] : -# 3| r3_2(unsigned int) = Constant[1] : -# 3| r3_3(unsigned int) = Add : r3_1, r3_2 -# 3| r3_4(glval) = VariableAddress[r] : -# 3| m3_5(unsigned int) = Store[r] : &:r3_4, r3_3 +# 3| r3_2(unsigned int) = Load[x] : &:r3_1, m1_6 +# 3| r3_3(unsigned int) = Constant[1] : +# 3| r3_4(unsigned int) = Add : r3_2, r3_3 +# 3| r3_5(glval) = VariableAddress[r] : +# 3| m3_6(unsigned int) = Store[r] : &:r3_5, r3_4 # 4| v4_1(void) = NoOp : -# 1| v1_10(void) = ReturnVoid : -# 1| v1_11(void) = AliasedUse : m1_3 -# 1| v1_12(void) = ExitFunction : +# 1| v1_9(void) = ReturnVoid : +# 1| v1_10(void) = AliasedUse : m1_3 +# 1| v1_11(void) = ExitFunction : ir.c: # 7| void MyCoordsTest(int) 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 931ad5edddcf..81cb49251cfa 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -2745,10 +2745,11 @@ generic.c: # 2| r2_1(glval) = VariableAddress[r] : # 2| mu2_2(unsigned int) = Uninitialized[r] : &:r2_1 # 3| r3_1(glval) = VariableAddress[x] : -# 3| r3_2(unsigned int) = Constant[1] : -# 3| r3_3(unsigned int) = Add : r3_1, r3_2 -# 3| r3_4(glval) = VariableAddress[r] : -# 3| mu3_5(unsigned int) = Store[r] : &:r3_4, r3_3 +# 3| r3_2(unsigned int) = Load[x] : &:r3_1, ~m? +# 3| r3_3(unsigned int) = Constant[1] : +# 3| r3_4(unsigned int) = Add : r3_2, r3_3 +# 3| r3_5(glval) = VariableAddress[r] : +# 3| mu3_6(unsigned int) = Store[r] : &:r3_5, r3_4 # 4| v4_1(void) = NoOp : # 1| v1_8(void) = ReturnVoid : # 1| v1_9(void) = AliasedUse : ~m? From 28702046aa68291d672b7a60775ec5ae13f29233 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Sat, 3 Aug 2024 22:28:40 +0200 Subject: [PATCH 3/3] C++: Rename function to match what is actually being tested --- cpp/ql/test/library-tests/ir/ir/PrintAST.expected | 2 +- cpp/ql/test/library-tests/ir/ir/aliased_ir.expected | 2 +- cpp/ql/test/library-tests/ir/ir/generic.c | 2 +- cpp/ql/test/library-tests/ir/ir/raw_ir.expected | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected index fc50aec4afa2..4c912a36756c 100644 --- a/cpp/ql/test/library-tests/ir/ir/PrintAST.expected +++ b/cpp/ql/test/library-tests/ir/ir/PrintAST.expected @@ -4180,7 +4180,7 @@ destructors_for_temps.cpp: # 103| ValueCategory = prvalue # 104| getStmt(1): [ReturnStmt] return ... generic.c: -# 1| [TopLevelFunction] void foo(unsigned int, int) +# 1| [TopLevelFunction] void c11_generic_test(unsigned int, int) # 1| : # 1| getParameter(0): [Parameter] x # 1| Type = [IntType] unsigned int 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 63062d5c980f..54ecfba3ffc4 100644 --- a/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/aliased_ir.expected @@ -2959,7 +2959,7 @@ destructors_for_temps.cpp: # 102| v102_10(void) = ExitFunction : generic.c: -# 1| void foo(unsigned int, int) +# 1| void c11_generic_test(unsigned int, int) # 1| Block 0 # 1| v1_1(void) = EnterFunction : # 1| m1_2(unknown) = AliasedDefinition : diff --git a/cpp/ql/test/library-tests/ir/ir/generic.c b/cpp/ql/test/library-tests/ir/ir/generic.c index daa6756b7769..3d669ba29fb9 100644 --- a/cpp/ql/test/library-tests/ir/ir/generic.c +++ b/cpp/ql/test/library-tests/ir/ir/generic.c @@ -1,4 +1,4 @@ -void foo(unsigned int x, int y) { +void c11_generic_test(unsigned int x, int y) { unsigned int r; r = _Generic(r, unsigned int: x, int: y) + 1; } 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 81cb49251cfa..18f0d99ac676 100644 --- a/cpp/ql/test/library-tests/ir/ir/raw_ir.expected +++ b/cpp/ql/test/library-tests/ir/ir/raw_ir.expected @@ -2733,7 +2733,7 @@ destructors_for_temps.cpp: # 102| v102_8(void) = ExitFunction : generic.c: -# 1| void foo(unsigned int, int) +# 1| void c11_generic_test(unsigned int, int) # 1| Block 0 # 1| v1_1(void) = EnterFunction : # 1| mu1_2(unknown) = AliasedDefinition :