Skip to content

Commit fe52dd9

Browse files
committed
C++: sync and accept new consistency test
1 parent d1c6022 commit fe52dd9

21 files changed

+183
-133
lines changed

cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRConsistency.qll

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,4 +524,23 @@ module InstructionConsistency {
524524
"' has a `this` argument operand that is not an address, in function '$@'." and
525525
irFunc = getInstructionIRFunction(instr, irFuncText)
526526
}
527+
528+
query predicate nonUniqueIRVariable(
529+
Instruction instr, string message, OptionalIRFunction irFunc, string irFuncText
530+
) {
531+
exists(VariableInstruction vi, IRVariable v1, IRVariable v2 |
532+
instr = vi and vi.getIRVariable() = v1 and vi.getIRVariable() = v2 and v1 != v2
533+
) and
534+
message =
535+
"Variable instruction '" + instr.toString() +
536+
"' has multiple associated variables, in function '$@'." and
537+
irFunc = getInstructionIRFunction(instr, irFuncText)
538+
or
539+
instr.getOpcode() instanceof Opcode::VariableAddress and
540+
not instr instanceof VariableInstruction and
541+
message =
542+
"Variable address instruction '" + instr.toString() +
543+
"' has no associated variable, in function '$@'." and
544+
irFunc = getInstructionIRFunction(instr, irFuncText)
545+
}
527546
}

cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRConsistency.qll

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,4 +524,23 @@ module InstructionConsistency {
524524
"' has a `this` argument operand that is not an address, in function '$@'." and
525525
irFunc = getInstructionIRFunction(instr, irFuncText)
526526
}
527+
528+
query predicate nonUniqueIRVariable(
529+
Instruction instr, string message, OptionalIRFunction irFunc, string irFuncText
530+
) {
531+
exists(VariableInstruction vi, IRVariable v1, IRVariable v2 |
532+
instr = vi and vi.getIRVariable() = v1 and vi.getIRVariable() = v2 and v1 != v2
533+
) and
534+
message =
535+
"Variable instruction '" + instr.toString() +
536+
"' has multiple associated variables, in function '$@'." and
537+
irFunc = getInstructionIRFunction(instr, irFuncText)
538+
or
539+
instr.getOpcode() instanceof Opcode::VariableAddress and
540+
not instr instanceof VariableInstruction and
541+
message =
542+
"Variable address instruction '" + instr.toString() +
543+
"' has no associated variable, in function '$@'." and
544+
irFunc = getInstructionIRFunction(instr, irFuncText)
545+
}
527546
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ invalidOverlap
2323
nonUniqueEnclosingIRFunction
2424
fieldAddressOnNonPointer
2525
thisArgumentIsNonPointer
26+
nonUniqueIRVariable
2627
missingCanonicalLanguageType
2728
multipleCanonicalLanguageTypes
2829
missingIRType

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ invalidOverlap
2323
nonUniqueEnclosingIRFunction
2424
fieldAddressOnNonPointer
2525
thisArgumentIsNonPointer
26+
nonUniqueIRVariable
2627
missingCanonicalLanguageType
2728
multipleCanonicalLanguageTypes
2829
missingIRType

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

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4841,6 +4841,9 @@
48414841
| ir.cpp:1043:24:1043:24 | SideEffect | ~m1043_20 |
48424842
| ir.cpp:1043:31:1043:31 | Address | &:r1043_9 |
48434843
| ir.cpp:1043:36:1043:55 | Address | &:r1043_11 |
4844+
| ir.cpp:1043:43:1043:43 | Address | &:r1043_16 |
4845+
| ir.cpp:1043:43:1043:43 | Arg(this) | this:r1043_16 |
4846+
| ir.cpp:1043:43:1043:43 | SideEffect | ~m1043_20 |
48444847
| ir.cpp:1043:43:1043:54 | Address | &:r1043_22 |
48454848
| ir.cpp:1043:43:1043:54 | Address | &:r1043_24 |
48464849
| ir.cpp:1043:43:1043:54 | Address | &:r1043_25 |
@@ -4861,11 +4864,8 @@
48614864
| ir.cpp:1043:45:1043:49 | SideEffect | ~m1043_4 |
48624865
| ir.cpp:1043:45:1043:49 | Unary | r1043_13 |
48634866
| ir.cpp:1043:45:1043:49 | Unary | r1043_15 |
4864-
| ir.cpp:1043:52:1043:52 | Address | &:r1043_16 |
4865-
| ir.cpp:1043:52:1043:52 | Arg(this) | this:r1043_16 |
4866-
| ir.cpp:1043:52:1043:52 | SideEffect | ~m1043_20 |
4867-
| ir.cpp:1043:54:1043:54 | Load | ~m1043_20 |
4868-
| ir.cpp:1043:54:1043:54 | Right | r1043_26 |
4867+
| ir.cpp:1043:53:1043:53 | Load | ~m1043_20 |
4868+
| ir.cpp:1043:53:1043:53 | Right | r1043_26 |
48694869
| ir.cpp:1043:58:1043:58 | ChiPartial | partial:m1043_9 |
48704870
| ir.cpp:1043:58:1043:58 | ChiTotal | total:m1043_3 |
48714871
| ir.cpp:1043:58:1043:58 | StoreValue | r1043_8 |
@@ -4980,6 +4980,9 @@
49804980
| ir.cpp:1047:34:1047:34 | SideEffect | ~m1047_20 |
49814981
| ir.cpp:1047:41:1047:41 | Address | &:r1047_9 |
49824982
| ir.cpp:1047:46:1047:65 | Address | &:r1047_11 |
4983+
| ir.cpp:1047:53:1047:53 | Address | &:r1047_16 |
4984+
| ir.cpp:1047:53:1047:53 | Arg(this) | this:r1047_16 |
4985+
| ir.cpp:1047:53:1047:53 | SideEffect | ~m1047_20 |
49834986
| ir.cpp:1047:53:1047:64 | Address | &:r1047_23 |
49844987
| ir.cpp:1047:53:1047:64 | Load | ~m1047_20 |
49854988
| ir.cpp:1047:53:1047:64 | StoreValue | r1047_24 |
@@ -4994,9 +4997,6 @@
49944997
| ir.cpp:1047:55:1047:59 | SideEffect | ~m1047_4 |
49954998
| ir.cpp:1047:55:1047:59 | Unary | r1047_13 |
49964999
| ir.cpp:1047:55:1047:59 | Unary | r1047_15 |
4997-
| ir.cpp:1047:62:1047:62 | Address | &:r1047_16 |
4998-
| ir.cpp:1047:62:1047:62 | Arg(this) | this:r1047_16 |
4999-
| ir.cpp:1047:62:1047:62 | SideEffect | ~m1047_20 |
50005000
| ir.cpp:1047:63:1047:63 | Right | r1047_22 |
50015001
| ir.cpp:1047:68:1047:68 | StoreValue | r1047_8 |
50025002
| ir.cpp:1047:68:1047:68 | Unary | r1047_7 |
@@ -5105,6 +5105,9 @@
51055105
| ir.cpp:1051:39:1051:39 | SideEffect | ~m1051_20 |
51065106
| ir.cpp:1051:46:1051:46 | Address | &:r1051_9 |
51075107
| ir.cpp:1051:51:1051:70 | Address | &:r1051_11 |
5108+
| ir.cpp:1051:58:1051:58 | Address | &:r1051_16 |
5109+
| ir.cpp:1051:58:1051:58 | Arg(this) | this:r1051_16 |
5110+
| ir.cpp:1051:58:1051:58 | SideEffect | ~m1051_20 |
51085111
| ir.cpp:1051:58:1051:69 | Address | &:r1051_22 |
51095112
| ir.cpp:1051:58:1051:69 | Address | &:r1051_24 |
51105113
| ir.cpp:1051:58:1051:69 | Address | &:r1051_26 |
@@ -5125,9 +5128,6 @@
51255128
| ir.cpp:1051:60:1051:64 | SideEffect | ~m1051_4 |
51265129
| ir.cpp:1051:60:1051:64 | Unary | r1051_13 |
51275130
| ir.cpp:1051:60:1051:64 | Unary | r1051_15 |
5128-
| ir.cpp:1051:67:1051:67 | Address | &:r1051_16 |
5129-
| ir.cpp:1051:67:1051:67 | Arg(this) | this:r1051_16 |
5130-
| ir.cpp:1051:67:1051:67 | SideEffect | ~m1051_20 |
51315131
| ir.cpp:1051:73:1051:73 | ChiPartial | partial:m1051_9 |
51325132
| ir.cpp:1051:73:1051:73 | ChiTotal | total:m1051_3 |
51335133
| ir.cpp:1051:73:1051:73 | StoreValue | r1051_8 |
@@ -5192,6 +5192,9 @@
51925192
| ir.cpp:1054:49:1054:49 | SideEffect | ~m1054_20 |
51935193
| ir.cpp:1054:56:1054:56 | Address | &:r1054_9 |
51945194
| ir.cpp:1054:61:1054:88 | Address | &:r1054_11 |
5195+
| ir.cpp:1054:68:1054:68 | Address | &:r1054_16 |
5196+
| ir.cpp:1054:68:1054:68 | Arg(this) | this:r1054_16 |
5197+
| ir.cpp:1054:68:1054:68 | SideEffect | ~m1054_20 |
51955198
| ir.cpp:1054:68:1054:87 | Address | &:r1054_37 |
51965199
| ir.cpp:1054:68:1054:87 | Load | ~m1054_20 |
51975200
| ir.cpp:1054:68:1054:87 | StoreValue | r1054_38 |
@@ -5206,9 +5209,6 @@
52065209
| ir.cpp:1054:70:1054:74 | SideEffect | ~m1054_4 |
52075210
| ir.cpp:1054:70:1054:74 | Unary | r1054_13 |
52085211
| ir.cpp:1054:70:1054:74 | Unary | r1054_15 |
5209-
| ir.cpp:1054:77:1054:77 | Address | &:r1054_16 |
5210-
| ir.cpp:1054:77:1054:77 | Arg(this) | this:r1054_16 |
5211-
| ir.cpp:1054:77:1054:77 | SideEffect | ~m1054_20 |
52125212
| ir.cpp:1054:78:1054:82 | Address | &:r1054_22 |
52135213
| ir.cpp:1054:78:1054:82 | Address | &:r1054_24 |
52145214
| ir.cpp:1054:78:1054:82 | Left | r1054_25 |

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

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -5654,11 +5654,11 @@ ir.cpp:
56545654
# 1038| Block 0
56555655
# 1038| v1038_1(void) = EnterFunction :
56565656
# 1038| mu1038_2(unknown) = AliasedDefinition :
5657-
# 1038| r1038_3(glval<decltype([...](...){...})>) = VariableAddress :
5657+
# 1038| r1038_3(glval<decltype([...](...){...})>) = VariableAddress[lam] :
56585658
# 1038| r1038_4(glval<decltype([...](...){...})>) = VariableAddress[#temp1038:12] :
56595659
# 1038| mu1038_5(decltype([...](...){...})) = Uninitialized[#temp1038:12] : &:r1038_4
56605660
# 1038| r1038_6(decltype([...](...){...})) = Load[#temp1038:12] : &:r1038_4, ~m?
5661-
# 1038| mu1038_7(decltype([...](...){...})) = Store[?] : &:r1038_3, r1038_6
5661+
# 1038| mu1038_7(decltype([...](...){...})) = Store[lam] : &:r1038_3, r1038_6
56625662
# 1038| v1038_8(void) = ReturnVoid :
56635663
# 1038| v1038_9(void) = AliasedUse : ~m?
56645664
# 1038| v1038_10(void) = ExitFunction :
@@ -9433,31 +9433,31 @@ ir.cpp:
94339433

94349434
# 1759| int global_2
94359435
# 1759| Block 0
9436-
# 1759| v1759_1(void) = EnterFunction :
9437-
# 1759| mu1759_2(unknown) = AliasedDefinition :
9438-
# 1759| r1759_3(glval<int>) = VariableAddress :
9439-
# 1759| r1759_4(int) = Constant[1] :
9440-
# 1759| mu1759_5(int) = Store[?] : &:r1759_3, r1759_4
9441-
# 1759| v1759_6(void) = ReturnVoid :
9442-
# 1759| v1759_7(void) = AliasedUse : ~m?
9443-
# 1759| v1759_8(void) = ExitFunction :
9436+
# 1759| v1759_1(void) = EnterFunction :
9437+
# 1759| mu1759_2(unknown) = AliasedDefinition :
9438+
# 1759| r1759_3(glval<int>) = VariableAddress[global_2] :
9439+
# 1759| r1759_4(int) = Constant[1] :
9440+
# 1759| mu1759_5(int) = Store[global_2] : &:r1759_3, r1759_4
9441+
# 1759| v1759_6(void) = ReturnVoid :
9442+
# 1759| v1759_7(void) = AliasedUse : ~m?
9443+
# 1759| v1759_8(void) = ExitFunction :
94449444

94459445
# 1761| int const global_3
94469446
# 1761| Block 0
9447-
# 1761| v1761_1(void) = EnterFunction :
9448-
# 1761| mu1761_2(unknown) = AliasedDefinition :
9449-
# 1761| r1761_3(glval<int>) = VariableAddress :
9450-
# 1761| r1761_4(int) = Constant[2] :
9451-
# 1761| mu1761_5(int) = Store[?] : &:r1761_3, r1761_4
9452-
# 1761| v1761_6(void) = ReturnVoid :
9453-
# 1761| v1761_7(void) = AliasedUse : ~m?
9454-
# 1761| v1761_8(void) = ExitFunction :
9447+
# 1761| v1761_1(void) = EnterFunction :
9448+
# 1761| mu1761_2(unknown) = AliasedDefinition :
9449+
# 1761| r1761_3(glval<int>) = VariableAddress[global_3] :
9450+
# 1761| r1761_4(int) = Constant[2] :
9451+
# 1761| mu1761_5(int) = Store[global_3] : &:r1761_3, r1761_4
9452+
# 1761| v1761_6(void) = ReturnVoid :
9453+
# 1761| v1761_7(void) = AliasedUse : ~m?
9454+
# 1761| v1761_8(void) = ExitFunction :
94559455

94569456
# 1763| constructor_only global_4
94579457
# 1763| Block 0
94589458
# 1763| v1763_1(void) = EnterFunction :
94599459
# 1763| mu1763_2(unknown) = AliasedDefinition :
9460-
# 1763| r1763_3(glval<constructor_only>) = VariableAddress :
9460+
# 1763| r1763_3(glval<constructor_only>) = VariableAddress[global_4] :
94619461
# 1763| r1763_4(glval<unknown>) = FunctionAddress[constructor_only] :
94629462
# 1763| r1763_5(int) = Constant[1] :
94639463
# 1763| v1763_6(void) = Call[constructor_only] : func:r1763_4, this:r1763_3, 0:r1763_5
@@ -9471,7 +9471,7 @@ ir.cpp:
94719471
# 1765| Block 0
94729472
# 1765| v1765_1(void) = EnterFunction :
94739473
# 1765| mu1765_2(unknown) = AliasedDefinition :
9474-
# 1765| r1765_3(glval<constructor_only>) = VariableAddress :
9474+
# 1765| r1765_3(glval<constructor_only>) = VariableAddress[global_5] :
94759475
# 1765| r1765_4(glval<unknown>) = FunctionAddress[constructor_only] :
94769476
# 1765| r1765_5(int) = Constant[2] :
94779477
# 1765| v1765_6(void) = Call[constructor_only] : func:r1765_4, this:r1765_3, 0:r1765_5
@@ -9485,11 +9485,11 @@ ir.cpp:
94859485
# 1767| Block 0
94869486
# 1767| v1767_1(void) = EnterFunction :
94879487
# 1767| mu1767_2(unknown) = AliasedDefinition :
9488-
# 1767| r1767_3(glval<char *>) = VariableAddress :
9488+
# 1767| r1767_3(glval<char *>) = VariableAddress[global_string] :
94899489
# 1767| r1767_4(glval<char[14]>) = StringConstant["global string"] :
94909490
# 1767| r1767_5(char *) = Convert : r1767_4
94919491
# 1767| r1767_6(char *) = Convert : r1767_5
9492-
# 1767| mu1767_7(char *) = Store[?] : &:r1767_3, r1767_6
9492+
# 1767| mu1767_7(char *) = Store[global_string] : &:r1767_3, r1767_6
94939493
# 1767| v1767_8(void) = ReturnVoid :
94949494
# 1767| v1767_9(void) = AliasedUse : ~m?
94959495
# 1767| v1767_10(void) = ExitFunction :
@@ -9717,31 +9717,31 @@ smart_ptr.cpp:
97179717
struct_init.cpp:
97189718
# 9| Info infos_in_file[]
97199719
# 9| Block 0
9720-
# 9| v9_1(void) = EnterFunction :
9721-
# 9| mu9_2(unknown) = AliasedDefinition :
9722-
# 9| r9_3(glval<Info[]>) = VariableAddress :
9723-
# 9| r9_4(int) = Constant[0] :
9724-
# 9| r9_5(glval<Info>) = PointerAdd[16] : r9_3, r9_4
9725-
# 10| r10_1(glval<char *>) = FieldAddress[name] : r9_5
9726-
# 10| r10_2(glval<char[2]>) = StringConstant["1"] :
9727-
# 10| r10_3(char *) = Convert : r10_2
9728-
# 10| mu10_4(char *) = Store[?] : &:r10_1, r10_3
9729-
# 10| r10_5(glval<..(*)(..)>) = FieldAddress[handler] : r9_5
9730-
# 10| r10_6(..(*)(..)) = FunctionAddress[handler1] :
9731-
# 10| mu10_7(..(*)(..)) = Store[?] : &:r10_5, r10_6
9732-
# 9| r9_6(int) = Constant[1] :
9733-
# 9| r9_7(glval<Info>) = PointerAdd[16] : r9_3, r9_6
9734-
# 11| r11_1(glval<char *>) = FieldAddress[name] : r9_7
9735-
# 11| r11_2(glval<char[2]>) = StringConstant["3"] :
9736-
# 11| r11_3(char *) = Convert : r11_2
9737-
# 11| mu11_4(char *) = Store[?] : &:r11_1, r11_3
9738-
# 11| r11_5(glval<..(*)(..)>) = FieldAddress[handler] : r9_7
9739-
# 11| r11_6(glval<..()(..)>) = FunctionAddress[handler2] :
9740-
# 11| r11_7(..(*)(..)) = CopyValue : r11_6
9741-
# 11| mu11_8(..(*)(..)) = Store[?] : &:r11_5, r11_7
9742-
# 9| v9_8(void) = ReturnVoid :
9743-
# 9| v9_9(void) = AliasedUse : ~m?
9744-
# 9| v9_10(void) = ExitFunction :
9720+
# 9| v9_1(void) = EnterFunction :
9721+
# 9| mu9_2(unknown) = AliasedDefinition :
9722+
# 9| r9_3(glval<Info[]>) = VariableAddress[infos_in_file] :
9723+
# 9| r9_4(int) = Constant[0] :
9724+
# 9| r9_5(glval<Info>) = PointerAdd[16] : r9_3, r9_4
9725+
# 10| r10_1(glval<char *>) = FieldAddress[name] : r9_5
9726+
# 10| r10_2(glval<char[2]>) = StringConstant["1"] :
9727+
# 10| r10_3(char *) = Convert : r10_2
9728+
# 10| mu10_4(char *) = Store[?] : &:r10_1, r10_3
9729+
# 10| r10_5(glval<..(*)(..)>) = FieldAddress[handler] : r9_5
9730+
# 10| r10_6(..(*)(..)) = FunctionAddress[handler1] :
9731+
# 10| mu10_7(..(*)(..)) = Store[?] : &:r10_5, r10_6
9732+
# 9| r9_6(int) = Constant[1] :
9733+
# 9| r9_7(glval<Info>) = PointerAdd[16] : r9_3, r9_6
9734+
# 11| r11_1(glval<char *>) = FieldAddress[name] : r9_7
9735+
# 11| r11_2(glval<char[2]>) = StringConstant["3"] :
9736+
# 11| r11_3(char *) = Convert : r11_2
9737+
# 11| mu11_4(char *) = Store[?] : &:r11_1, r11_3
9738+
# 11| r11_5(glval<..(*)(..)>) = FieldAddress[handler] : r9_7
9739+
# 11| r11_6(glval<..()(..)>) = FunctionAddress[handler2] :
9740+
# 11| r11_7(..(*)(..)) = CopyValue : r11_6
9741+
# 11| mu11_8(..(*)(..)) = Store[?] : &:r11_5, r11_7
9742+
# 9| v9_8(void) = ReturnVoid :
9743+
# 9| v9_9(void) = AliasedUse : ~m?
9744+
# 9| v9_10(void) = ExitFunction :
97459745

97469746
# 16| void let_info_escape(Info*)
97479747
# 16| Block 0

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ invalidOverlap
2323
nonUniqueEnclosingIRFunction
2424
fieldAddressOnNonPointer
2525
thisArgumentIsNonPointer
26+
nonUniqueIRVariable
2627
missingCanonicalLanguageType
2728
multipleCanonicalLanguageTypes
2829
missingIRType

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ invalidOverlap
2323
nonUniqueEnclosingIRFunction
2424
fieldAddressOnNonPointer
2525
thisArgumentIsNonPointer
26+
nonUniqueIRVariable
2627
missingCanonicalLanguageType
2728
multipleCanonicalLanguageTypes
2829
missingIRType

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ invalidOverlap
2323
nonUniqueEnclosingIRFunction
2424
fieldAddressOnNonPointer
2525
thisArgumentIsNonPointer
26+
nonUniqueIRVariable
2627
missingCanonicalLanguageType
2728
multipleCanonicalLanguageTypes
2829
missingIRType

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ invalidOverlap
2323
nonUniqueEnclosingIRFunction
2424
fieldAddressOnNonPointer
2525
thisArgumentIsNonPointer
26+
nonUniqueIRVariable
2627
missingCanonicalLanguageType
2728
multipleCanonicalLanguageTypes
2829
missingIRType

0 commit comments

Comments
 (0)